不止是“身份证”:解构 ActivityRecord 作为 Activity“灵魂”的二元存在

424 阅读4分钟

一句话总结:

ActivityRecord 并非 Activity 的简单“档案”,而是它在系统服务中的**“灵魂”——是状态的“源头真相”。我们编写的 Activity 类实例,只是一个存在于应用进程中的、随时可被替换的“肉体”**。整个生命周期机制,就是“灵魂”对“肉体”的远程遥控。


第一章:两个世界,一个 Activity

要理解 ActivityRecord,必须先建立一个“二元世界”的宏观视角:

  1. 系统服务世界 (system_server 进程): 这是 Android 的“神界”,ActivityTaskManagerService (ATMS) 在此运行。ActivityRecord 就生活在这个世界里。
  2. 应用世界 (App 进程): 这是我们代码运行的“凡间”。我们编写的 Activity 类的实例,就生活在这里。

这两个世界被进程的“次元壁”严格隔离。ActivityRecord 就是系统为了在“神界”管理“凡间”的 Activity 而创造的“灵魂档案”。

概念所在世界本质生命周期谁是“真相”?
ActivityRecord系统服务进程灵魂 (Soul)相对持久✅ 源头真相
Activity 对象应用进程肉体 (Body)短暂易逝❌ 状态的反映

第二章:ActivityRecord (灵魂)——状态的“源头真相”

ActivityRecord 是由 ATMS 创建和管理的。它包含了关于一个 Activity 的所有权威信息,正如你文章所描述的:

  • 身份信息: Intent, ComponentName 等。
  • 从属信息: 所属的 TaskRecord,启动模式等。
  • 状态信息: 一个 State 枚举,记录了系统期望 Activity 所处的生命周期状态(如 RESUMED, PAUSED, STOPPED)。
  • 通信凭证: 一个名为 appTokenIBinder 对象,这是连接“灵魂”与“肉体”的关键信物。

当系统因为内存不足而杀死你的应用进程时,你的 Activity 对象(肉体)灰飞烟灭,但它的 ActivityRecord(灵魂)依然完好无损地保存在 ATMS 中。


第三章:生命周期的本质——一场“灵魂”对“肉体”的远程遥控

理解了“灵魂-肉体”模型后,生命周期回调的本质就豁然开朗了:所有生命周期方法,都是 ATMS 通过 ActivityRecordActivity 实例发起的远程指令,目的是让“肉体”的状态与“灵魂”同步。

以启动一个新 Activity 为例:

  1. 灵魂诞生: ATMS 收到启动请求,首先创建一个新的 ActivityRecord,并将其状态设置为 RESUMED
  2. 寻找/创造肉体: ATMS 通知 AMS 确保对应的应用进程存在。如果不存在,则创建新进程。
  3. 下达指令: ATMS 通过 Binder IPC,向应用进程的 ActivityThread 发出指令:“根据这个 ActivityRecord 的信息,去创建一个 Activity 实例,并让它进入 RESUMED 状态”。
  4. 肉体同步: 应用进程的 ActivityThread 收到指令后,实例化 Activity 对象,并依次调用 onCreate(), onStart(), onResume()。至此,“肉体”的状态成功与“灵魂”同步。

以进程被杀后恢复为例:

  1. 灵魂尚存: 用户返回应用,ATMS 发现对应的 ActivityRecord 依然存在。
  2. 重塑肉体: ATMS 再次命令 AMS 创建新进程,并向新进程下达指令:“根据这个‘灵魂档案’,重新创建 Activity 实例,并恢复到它之前的状态”。
  3. 肉体重生: 应用进程再次执行 onCreate() 等方法,一个新的“肉体”诞生了,并与旧的“灵魂”重新建立了连接。

四、appToken——连接两个世界的“血之契约”

ActivityRecord 中的 appToken 是一个 IBinder 对象,它是确保两个世界安全通信的关键。

  • 授权: ATMS 将这个 token 传递给应用进程。
  • 验证: 当应用进程需要与系统交互,尤其是向 WindowManagerService (WMS) 申请一个窗口来显示自己时,必须出示这个 ATMS 授予的 token
  • 安全: WMS 会验证这个 token 的合法性,从而确保是一个“正规”的、由 ATMS 批准的 Activity 在申请显示,而不是某个恶意组件。

这个 token 就像一个无法伪造的、由“神界”授予的“圣印”,是“肉体”证明其合法性的唯一凭证。

结论:

将 ActivityRecord 仅仅看作一张“身份证”,会让你停留在功能的表面。而将其理解为 Activity 在系统服务中不灭的“灵魂”,你将能从根本上洞悉 Android 的生命周期管理、进程恢复、乃至窗口系统安全性的深层设计哲学。