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 交互时的稳定性与一致性。