AMS 对 Activity 生命周期的管理机制
Activity 生命周期是 Android 应用开发的基础,而 AMS(ActivityManagerService)是生命周期回调的 “决策者”,通过跨进程通信与状态机管理,确保 Activity 从创建到销毁的每个阶段按规则执行,维持应用与系统状态的一致性。
生命周期管理的核心流程
当用户触发 Activity 切换(如启动新 Activity 或按下返回键)时,AMS 执行以下关键步骤:
- 状态判断与请求分发:AMS 接收启动请求(如 startActivity()),根据当前 Activity 状态(如是否在前台)、启动模式(如 singleTask)与任务栈规则,决定是否创建新实例或复用已有实例。
- 生命周期回调触发:通过 Binder 通知应用进程的 ActivityThread,按顺序触发前一个 Activity 的暂停(onPause())、新 Activity 的创建(onCreate())、启动(onStart())、恢复(onResume()),最后触发前一个 Activity 的停止(onStop())。此过程严格遵循 “先暂停旧 Activity,再启动新 Activity” 的原则,确保用户体验连贯。
- 状态同步与记录:AMS 更新 ActivityRecord中的状态标识(如从 INITIALIZING 变为 RESUMED),并同步至TaskRecord与ActivityStack,确保系统对 Activity 状态的认知与应用实际状态一致。
跨进程通信与同步机制
AMS 与应用进程的通信依赖 Binder 机制:
- AMS 作为服务端,通过 IActivityManager接口暴露生命周期管理方法(如startActivity()、pauseActivity())。
- 应用进程的 ActivityThread作为客户端,通过ActivityManagerNative.getDefault()获取 AMS 代理,发送状态变化请求;同时,应用进程通过IApplicationThread接口向 AMS 反馈本地生命周期执行结果(如onCreate()完成)。
为避免多线程冲突,AMS 采用多重同步机制:
- 锁机制:通过 mServiceLock同步对ActivityRecord、TaskRecord等数据结构的修改。
- 事务屏障:使用 Handler消息队列的屏障机制(postSyncBarrier()),确保生命周期关键消息(如 resume)优先于普通消息执行,避免时序混乱。
异常场景的生命周期处理
当系统资源不足(如内存紧张)或应用崩溃时,AMS 会主动干预生命周期:
- 进程回收:优先终止后台 Activity 所在进程,触发 onSaveInstanceState()保存状态,待后续重建时通过onRestoreInstanceState()恢复数据。
- 崩溃恢复:若前台 Activity 崩溃,AMS 会重启应用进程并重建 Activity,或根据 android:process配置决定是否启动新进程。
AMS 对生命周期的管理体现了 “集中控制” 与 “分布式执行” 的结合:系统层统一决策,应用层具体执行,通过严格的时序与同步机制,保障多 Activity 交互时的稳定性与一致性。