android activity管理(五)之ActivityRecord的启动

本文详细介绍了ActivityRecord的启动过程,共分为三个步骤:首先是ActivityRecord的复用查找,接着是ActivityRecord的入栈操作,最后是ActivityRecord的唤醒过程。

ActivityRecord的启动分为三个步骤,第一个步骤ActivityRecord复用查找,第二个步骤是ActivityRecord入栈,第三个步骤是ActivityRecord唤醒

<think> 我们正在讨论Android系统中的Activity启动过程。ActivityRecordActivityManagerService(AMS)中的一个关键数据结构,用于表示一个Activity实例。在启动Activity的过程中,它扮演着核心角色。 ActivityRecord的作用: 1. **表示Activity实例**:每个Activity在AMS中都有一个对应的ActivityRecord对象,用于存储该Activity的所有信息,如状态、配置、任务栈等。 2. **生命周期管理**:ActivityRecord中保存了Activity当前的状态(如onCreate, onStart, onResume等),并参与状态转换。 3. **任务栈管理**:ActivityRecord被组织在任务栈(TaskRecord)中,它记录了Activity所属的任务(taskAffinity)以及它在栈中的位置,这对返回栈(back stack)的管理至关重要。 4. **状态持久化**:当Activity需要被销毁重建时(如配置变更),ActivityRecord会保存其状态(通过onSaveInstanceState),以便后续恢复。 5. **窗口管理**:ActivityRecord与WindowManagerService交互,用于管理Activity的窗口(如添加、移除、调整层级等)。 6. **权限与身份验证**:存储启动Activity的权限信息、调用者身份等安全相关数据。 在启动Activity的过程中,ActivityRecord的创建和更新是核心步骤: - 当启动一个Activity时,AMS会创建一个新的ActivityRecord或重用已有的(根据启动模式)。 - 然后AMS会根据Activity启动模式和任务栈情况,决定将新的ActivityRecord放入哪个任务栈(TaskRecord)中。 - 之后,AMS通过ActivityRecord来调度Activity的生命周期回调,并通知客户端进程(应用进程)执行相应的操作。 §§相关问题§§ 1. ActivityRecord与TaskRecord之间是什么关系?如何影响Activity启动模式? 2. 在AMS中,ActivityRecord是如何被创建和管理的? 3. ActivityRecordActivity状态保存和恢复过程中扮演什么角色? 4. Activity启动模式(如singleTop, singleTask)如何通过ActivityRecord实现? 5. 当多个应用共享同一个任务栈时,ActivityRecord如何保证安全隔离? </think> 在Android系统的Activity启动过程中,`ActivityRecord`是框架层(`ActivityManagerService`)的核心数据结构,其作用如下: ### ActivityRecord的核心作用 1. **生命周期管理实体** - 每个`ActivityRecord`对应一个Activity实例(无论是否可见),记录其完整生命周期状态(如`ON_CREATE`, `ON_RESUME`等)。 - 通过`state`字段(如`RESUMED`, `PAUSED`)驱动AMS调度Activity的状态转换。 2. **窗口管理枢纽** - 连接`WindowManagerService`(WMS):每个`ActivityRecord`持有`AppWindowToken`对象,作为WMS中窗口树的根节点。 - 控制窗口层级:决定Activity窗口的Z-order(如`TYPE_BASE_APPLICATION`)。 3. **任务栈(Task)管理单元** - 归属关系:每个`ActivityRecord`绑定到具体的`TaskRecord`(任务栈),通过`taskAffinity`匹配归属任务。 - 启动模式实现:支撑`standard/singleTop/singleTask`等模式(如singleTask模式会复用同任务栈顶的ActivityRecord)。 4. **状态持久化容器** - 存储`Bundle savedInstanceState`:在配置变更(如旋转屏幕)时保存/恢复临时数据。 - 记录Intent参数:保存启动Activity的原始Intent(含flags、extra数据等)。 5. **进程关联控制** - 绑定宿主进程:通过`processName`字段关联到具体应用进程(如`com.example.app`)。 - 跨进程通信:作为Binder IPC的凭证,验证Activity操作权限。 ### 典型启动流程中的交互 1. **创建阶段** AMS解析启动Intent → 新建或复用ActivityRecord → 分配唯一ID(`hashCode`标识) 2. **调度阶段** ActivityRecord加入目标TaskRecord → AMS通过`IApplicationThread`通知客户端进程创建Activity实例 3. **窗口阶段** ActivityRecord注册到WMS → 触发`ViewRootImpl`构建窗口树 4. **生命周期执行** AMS根据ActivityRecord状态机 → 驱动Activity执行`onCreate()`→`onResume()` 5. **销毁阶段** 关闭时移除ActivityRecord → 触发`onSaveInstanceState()`保存数据 → 释放关联资源 ### 关键源码参考 ```java // frameworks/base/services/core/java/com/android/server/am/ActivityRecord.java class ActivityRecord { Intent intent; // 启动Intent ActivityState state; // 当前状态(RESUMED/PAUSED等) TaskRecord task; // 所属任务栈 AppWindowToken appToken;// WMS关联令牌 ProcessRecord app; // 绑定宿主进程 Bundle icicle; // 状态保存数据 } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值