Activity 启动的整体流程与第一个阶段解读参数

Activity 的启动过程是 Android Framework 中最复杂的流程之一,它涉及多个进程间的通信(IPC)。

1. 启动流程涉及的四个角色

  1. Launcher 进程或 App 进程:发起启动 Activity 的请求(通过 startActivity)。
  2. **System_Server 进程 (AMS)**:核心控制中心。负责解析 Intent、管理 Activity 栈(Task/Stack)、权限检查等。
  3. Zygote 进程:孵化器。如果目标 App 进程尚未启动,AMS 会请求 Zygote Fork 出一个新的进程。
  4. 目标 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
2
3
4
5
6
7
8
// ATMS 端的入口方法
@Override
public final int startActivity(IApplicationThread caller, String callingPackage,
Intent intent, String resolvedType, IBinder resultTo, String resultWho,
int requestCode, int startFlags, ProfilerInfo profilerInfo, Bundle bOptions) {
// ... 调用执行链
return startActivityAsUser(...);
}

接下来的文档中,我们将详细解析 ActivityStarter 如何处理 Flag 以及如何决定 Activity 该落入哪个 Task。

, ,