一句话总结:
ActivityRecord 并非 Activity 的简单“档案”,而是它在系统服务中的**“灵魂”——是状态的“源头真相”。我们编写的 Activity 类实例,只是一个存在于应用进程中的、随时可被替换的“肉体”**。整个生命周期机制,就是“灵魂”对“肉体”的远程遥控。
第一章:两个世界,一个 Activity
要理解 ActivityRecord,必须先建立一个“二元世界”的宏观视角:
- 系统服务世界 (
system_server进程): 这是 Android 的“神界”,ActivityTaskManagerService(ATMS) 在此运行。ActivityRecord就生活在这个世界里。 - 应用世界 (App 进程): 这是我们代码运行的“凡间”。我们编写的
Activity类的实例,就生活在这里。
这两个世界被进程的“次元壁”严格隔离。ActivityRecord 就是系统为了在“神界”管理“凡间”的 Activity 而创造的“灵魂档案”。
| 概念 | 所在世界 | 本质 | 生命周期 | 谁是“真相”? |
|---|---|---|---|---|
ActivityRecord | 系统服务进程 | 灵魂 (Soul) | 相对持久 | ✅ 源头真相 |
Activity 对象 | 应用进程 | 肉体 (Body) | 短暂易逝 | ❌ 状态的反映 |
第二章:ActivityRecord (灵魂)——状态的“源头真相”
ActivityRecord 是由 ATMS 创建和管理的。它包含了关于一个 Activity 的所有权威信息,正如你文章所描述的:
- 身份信息:
Intent,ComponentName等。 - 从属信息: 所属的
TaskRecord,启动模式等。 - 状态信息: 一个
State枚举,记录了系统期望Activity所处的生命周期状态(如RESUMED,PAUSED,STOPPED)。 - 通信凭证: 一个名为
appToken的IBinder对象,这是连接“灵魂”与“肉体”的关键信物。
当系统因为内存不足而杀死你的应用进程时,你的 Activity 对象(肉体)灰飞烟灭,但它的 ActivityRecord(灵魂)依然完好无损地保存在 ATMS 中。
第三章:生命周期的本质——一场“灵魂”对“肉体”的远程遥控
理解了“灵魂-肉体”模型后,生命周期回调的本质就豁然开朗了:所有生命周期方法,都是 ATMS 通过 ActivityRecord 对 Activity 实例发起的远程指令,目的是让“肉体”的状态与“灵魂”同步。
以启动一个新 Activity 为例:
- 灵魂诞生:
ATMS收到启动请求,首先创建一个新的ActivityRecord,并将其状态设置为RESUMED。 - 寻找/创造肉体:
ATMS通知AMS确保对应的应用进程存在。如果不存在,则创建新进程。 - 下达指令:
ATMS通过 Binder IPC,向应用进程的ActivityThread发出指令:“根据这个ActivityRecord的信息,去创建一个Activity实例,并让它进入RESUMED状态”。 - 肉体同步: 应用进程的
ActivityThread收到指令后,实例化Activity对象,并依次调用onCreate(),onStart(),onResume()。至此,“肉体”的状态成功与“灵魂”同步。
以进程被杀后恢复为例:
- 灵魂尚存: 用户返回应用,
ATMS发现对应的ActivityRecord依然存在。 - 重塑肉体:
ATMS再次命令AMS创建新进程,并向新进程下达指令:“根据这个‘灵魂档案’,重新创建Activity实例,并恢复到它之前的状态”。 - 肉体重生: 应用进程再次执行
onCreate()等方法,一个新的“肉体”诞生了,并与旧的“灵魂”重新建立了连接。
四、appToken——连接两个世界的“血之契约”
ActivityRecord 中的 appToken 是一个 IBinder 对象,它是确保两个世界安全通信的关键。
- 授权:
ATMS将这个token传递给应用进程。 - 验证: 当应用进程需要与系统交互,尤其是向
WindowManagerService(WMS) 申请一个窗口来显示自己时,必须出示这个ATMS授予的token。 - 安全:
WMS会验证这个token的合法性,从而确保是一个“正规”的、由ATMS批准的Activity在申请显示,而不是某个恶意组件。
这个 token 就像一个无法伪造的、由“神界”授予的“圣印”,是“肉体”证明其合法性的唯一凭证。
结论:
将 ActivityRecord 仅仅看作一张“身份证”,会让你停留在功能的表面。而将其理解为 Activity 在系统服务中不灭的“灵魂”,你将能从根本上洞悉 Android 的生命周期管理、进程恢复、乃至窗口系统安全性的深层设计哲学。