8.1 AMS功能概述
AMS 寄存于 SystemServer 中,在系统启动时,创建一个线程来循环处理客户的请求。
- 四大组件状态管理
- 组件状态查询
- Task 相关
- 其他辅助功能
8.2 管理当前系统中Activity状态 -- ActivityStack
AMS 是通过 ActivityStack 和其他数据结构来记录、管理系统中的 Activity 和其他组件状态,并提供查询功能的一个系统服务。
- AMS 的主要工作就是管理、记录、查询
- AMS 是系统进程的一部分(确切地说它运行于一个独立的线程中)
8.3 startActivity 流程
startActivity() 最终可能启动的是其他进程中的组件,当系统匹配到某个目标 Activity 后分为两种情况:
- 如果通过 Intent 匹配到的目标对象,其所属程序包进程已启动,那么 AMS 就会通知这个进程来加载运行指定的目标 Activity。
- 如果当前 Activity 所属程序没有进程在运行,AMS 就会先启动它的一个实例,然后让其运行目标 Activity。
AMS 中 startActivity 相关函数:
- startActivity
- startActivityAsUser
- startActivityMayWait
- startActivityLocked
- startActivityUncheckedLocked
8.4 完成同一任务的“集合” -- ActivityTask
应用程序可以通过两种方法来影响 Activity Task 的默认行为。
方法1:在<activity>标签中指定属性。
- android:taskAffinity,希望归属的Task。
- android:launchMode,启动方式
launchMode | Description |
---|---|
standard | 默认状态。这种模式下 Activity 是多实例的,意味着系统总是启动一个新的 Activity 来满足要求,即使之前已经存在该 Activity 的实例;而且它归属于调用 startActivity 将其启动的那个 task。 |
singleTop | 与 standard 非常类似,Activity 也是多实例的,且 task 的归属也一致。区别在于:对于 standard,无论何时它都会生成一个新的 Activity 实例;而 singleTop 当遇到目标 Activity 已经存在于目标 task 栈顶时,会将 Intent 通过 onNewIntent 传给这个 Activity 而不是生成一个新的实例。 |
singleTask | 表明 Activity 是单实例的,Intent 将通过 onNewIntent 传送给已有的实例;而且它总是在一个新的 task 中启动。换言之,这种类型的 Activity 永远在 task 的根位置。另外,singleTask 允许其他 Activity 进驻到它所在的 task 中,这一点和 singleInstance 不同。 |
singleInstance | 和 singleTask 基本一致,不过它不允许其他 Activity 进驻到它所属的 task 中。也就是说,singleInstance 永远都是在一个孤立的 task 中 |
方法2:使用 Intent 标记
FLAG_ACTIVITY_NEW_TASK,和 singleTask 启动模式作用一样。
FLAG_ACTIVITY_SINGLE_TOP,和 singleTop 启动模式作用一样。
FLAG_ACTIVITY_CLEAR_TOP,如果要启动的 Activity 已经在当前 task 中运行,那么所有在它之上的 Activity 都将被销毁,并且 Intent 通过 onNewIntent 传给它。
8.5 Instrumentation 机制
Instrumentation 提供了一种允许用户获取(及改变)应用程序和系统之间的交互流程的机制。