Activity 的启动过程是 Android Framework 中最复杂的流程之一,它涉及多个进程间的通信(IPC)。
1. 启动流程涉及的四个角色
- Launcher 进程或 App 进程:发起启动 Activity 的请求(通过
startActivity)。 - **System_Server 进程 (AMS)**:核心控制中心。负责解析 Intent、管理 Activity 栈(Task/Stack)、权限检查等。
- Zygote 进程:孵化器。如果目标 App 进程尚未启动,AMS 会请求 Zygote Fork 出一个新的进程。
- 目标 App 进程:Activity 最终运行的地方。在
ActivityThread中完成初始化并回调onCreate。
2. 第一阶段:从 App 到 AMS 的跳转
当我们在代码中调用 startActivity(intent) 时,实际上经历了一系列的“套路”:
2.1 ContextImpl.startActivity
所有的 Context 子类(Activity, Service 等)最终都会调用到 ContextImpl 的实现中。
2.2 Instrumentation.execStartActivity
Instrumentation 是 Activity 的“管家”,负责监控 App 与系统的所有交互。在这里,它会通过 ActivityTaskManager.getService() 获取到 IActivityTaskManager 的 Binder 代理对象。
2.3 跨进程调用 (IPC)
通过 Binder 机制,请求从当前进程“跳”到了 System_Server 进程中的 ActivityTaskManagerService (ATMS)。
3. 核心参数解读
在进入 AMS 内部前,有几个关键概念必须厘清:
- ActivityRecord:在 AMS 端,每一个 Activity 实例都对应一个
ActivityRecord对象,它记录了该 Activity 的所有信息。 - TaskRecord:任务栈。一个 Task 可以包含多个 Activity,遵循后进先出(LIFO)原则。
- ActivityStack:管理 Task 的层级结构。
4. 源码关键点 (API 29+)
在 Android 10 以后,Activity 的启动逻辑从 ActivityManagerService 大量迁移到了 ActivityTaskManagerService。
1 | // ATMS 端的入口方法 |
接下来的文档中,我们将详细解析 ActivityStarter 如何处理 Flag 以及如何决定 Activity 该落入哪个 Task。