通俗易懂讲解ActivityRecord的构建过程(基于Android Framework视角)
一、ActivityRecord是什么?
我们可以把ActivityRecord理解为Android系统为每个Activity创建的"身份证"。当你在手机上打开一个App界面时,系统后台会默默为这个界面办理一张身份证,记录它的所有关键信息。这张身份证会伴随Activity的整个生命周期,从创建到销毁。
二、为什么要构建ActivityRecord?
想象一下,如果系统没有这张"身份证",会出现什么问题?
- 无法管理多个App的界面切换
- 不知道该把界面显示在哪个任务栈
- 无法处理返回键的逻辑
- 进程间通信会混乱
ActivityRecord就像系统管理员的笔记本,记录着每个界面的"户籍信息",让系统能高效管理成百上千个Activity。
三、构建过程详解(分步说明)
1. 发起启动请求(用户点击App图标)
- 你在桌面点击微信图标,Launcher App会发送启动请求
- 请求通过Binder IPC穿越到SystemServer进程的AMS服务
2. 创建"身份证"的准备阶段
AMS收到请求后会做这些事:
java
// 伪代码示例
public int startActivity(...) {
// 解析启动参数(要启动哪个Activity,启动模式等)
ActivityStarter starter = obtainStarter(...);
// 创建关键对象:ActivityRecord
ActivityRecord r = new ActivityRecord(this, callerApp, callingPid, callingUid,
callingPackage, intent, resolvedType, aInfo,
configuration, resultTo, resultWho, requestCode,
componentSpecified, voiceSession != null,
mSupervisor, container, options);
// 挂载到任务栈管理系统
ActivityTaskManagerService::startProcessAsync
return START_SUCCESS;
}
3. 填写身份证信息
系统会为这个ActivityRecord填写详细信息,就像办理身份证时要登记各种信息:
- 身份信息:Activity类名(com.tencent.mm.ui.LauncherUI)
- 户籍信息:所属应用包名(com.tencent.mm)
- 家庭关系:所属任务栈(TaskRecord,默认新开栈)
- 启动参数:携带的Intent数据(如点击的聊天对象ID)
- 特殊标记:启动模式(standard/singleTask等)
- 窗口凭证:appToken(与WMS交互的通行证)
4. 任务栈分配逻辑
系统会根据Activity的启动模式决定如何放置这个"身份证":
- standard模式:直接放入当前任务栈
- singleTask模式:查找或新建指定affinity的任务栈
- singleTop模式:检查栈顶是否已是同个Activity
5. 进程准备阶段
如果目标Activity所在进程未运行:
- AMS会请求Zygote孵化新进程
- 新进程启动后会通过ApplicationThread与AMS建立通信
- AMS通过scheduleLaunchActivity发送包含ActivityRecord信息的Binder调用
6. 客户端创建镜像
App进程收到启动请求后:
- 创建ActivityClientRecord(客户端的"身份证副本")
- 通过token与系统服务端的ActivityRecord建立关联
- 最终实例化真正的Activity对象
四、构建过程的关键参与者
| 组件 | 角色比喻 | 核心职责 |
|---|---|---|
| ActivityRecord | 系统户籍管理员 | 记录Activity所有元数据 |
| TaskRecord | 家庭户口本 | 管理同一任务栈的Activity集合 |
| ActivityStack | 社区居委会 | 管理多个任务栈的显示优先级 |
| ActivityTaskManagerService | 区政府 | 协调所有ActivityStack的管理 |
| AppToken | 跨进程通行证 | 连接系统服务与客户端Activity |
五、构建完成后的状态流转
-
初始化状态:INITIALIZING(正在初始化)
-
启动阶段:
- PAUSING(暂停原Activity)
- RESUMED(成为当前活动界面)
-
运行阶段:
- 接收触摸事件
- 更新界面内容
-
停止阶段:
- PAUSED(被部分遮挡)
- STOPPED(完全不可见)
-
销毁阶段:
- FINISHING(正在关闭)
- DESTROYED(从系统注销)
六、实际场景案例分析
场景:从微信聊天页跳转到朋友圈
-
创建新身份证:
- 类名:com.tencent.mm.ui.moment.MomentActivity
- 任务栈:微信主任务栈(taskAffinity="com.tencent.mm")
- 启动模式:standard(默认)
-
状态变更:
- 聊天页:onPause() → RESUMED→PAUSED
- 朋友圈页:onCreate()→onStart()→onResume()→RESUMED
-
返回键处理:
- 朋友圈页出栈,聊天页恢复RESUMED状态
- 触发onRestart()→onStart()→onResume()
七、设计思想总结
-
解耦设计:
- 系统服务层(AMS)与客户端(App)通过ActivityRecord/ActivityClientRecord双胞胎对象解耦
- 类似银行"存根"设计,系统持主卡,App持副卡
-
状态机管理:
mermaid graph TD A[INITIALIZING] --> B[PAUSING] B --> C[PAUSED] C --> D[STOPPING] D --> E[STOPPED] E --> F[DESTROYING] F --> G[DESTROYED] C --> H[RESUMED] -
性能优化:
- 复用机制:singleTask模式避免重复创建
- 预加载:通过ActivityRecord提前准备资源
- 冻结技术:STOPPED状态时暂停非必要渲染
通过这种精心设计的构建流程,Android系统能够高效管理复杂的界面切换,同时保证用户体验的流畅性。理解ActivityRecord的构建过程,对于深入掌握Android Framework的工作原理、进行复杂界面调试和性能优化都至关重要。
#参考资料
- 基于 Android 13 的 Activity 启动流程分析(opens new window)
- Activity启动流程(二)system_server进程处理启动Activity请求(opens new window)
- Activity启动流程(一)发起端进程请求启动目标Activity(opens new window)
- Android13 Activity启动流程(opens new window)
- Android四大组件之Activity启动流程源码实现详解概要(opens new window)
- Android应用启动全流程分析(源码深度剖析)(opens new window)
- 【Android 14源码分析】Activity启动流程-1