在 Android 8.0 之后,系统引入了 ClientTransaction 机制来重构 Activity 的生命周期管理。这是一种基于“事务”的设计模式,将原本散落在 AMS 中的各种生命周期指令进行了统一封装。
1. 为什么需要事务封装?
在旧版本中,AMS 直接调用应用进程的 IApplicationThread 接口(如 scheduleLaunchActivity)。这种方式扩展性差,且难以处理复杂的复合状态切换。
引入事务后,AMS 只需要发送一个 ClientTransaction,其中包含了:
- Callback:如
LaunchActivityItem(创建 Activity)。 - FinalState:如
ResumeActivityItem(最终状态)。
2. 核心组件
- ClientTransaction:事务容器。
- ClientTransactionHandler:在应用进程中(通常是
ActivityThread)负责执行事务。 - TransactionExecutor:事务执行器,负责按照正确的逻辑顺序(例如先 Create 再 Resume)调度事务中的各项指令。
3. 生命周期执行链路
- AMS 服务端:创建
ClientTransaction,并添加对应的生命周期 Item。 - 跨进程传递:通过
IApplicationThread.scheduleTransaction发送到目标 App 进程。 - App 客户端:
ActivityThread收到后,交给TransactionExecutor执行。 - 执行逻辑:
executeCallbacks():执行如LaunchActivityItem等初始化操作。executeLifecycleState():执行如ResumeActivityItem等状态变更操作。
4. 总结
生命周期事务封装是 Android 系统现代化的重要体现。它不仅让 AMS 的逻辑更加简洁,也为后续的 多窗口模式 和 折叠屏 复杂状态切换提供了坚实的底层架构支持。