在 Android 的系统架构中,AMS(System Server 进程)与 ActivityThread(应用进程)之间的通信是典型的 C/S 架构。AMS 作为服务端下发指令,ActivityThread 作为客户端接收并执行。
1. 通信架构:Binder 边界
AMS 并不直接持有 ActivityThread 对象,而是通过 IApplicationThread 这一 Binder 接口进行通信。
| 角色 | 实现类 | 物理位置 | 职责 |
|---|---|---|---|
| Binder 服务端 | ActivityThread.ApplicationThread |
应用进程 | 继承自 IApplicationThread.Stub,开启 Binder 线程池等待调用。 |
| Binder 代理端 | ApplicationThreadProxy |
System Server 进程 | AMS 持有该代理,用于向 App 进程发送指令。 |
2. 指令接收流程:从 Binder 线程到主线程
当 AMS 发起一个指令(如启动 Activity)时,数据流转如下:
第一步:Binder 线程接收
AMS 调用 app.thread.scheduleTransaction(transaction)。此时,App 进程中的 Binder 线程池 会随机选择一个线程来执行 ApplicationThread 对应的接口方法。
第二步:向主线程分发
由于 Binder 线程不能直接操作 UI 或执行 Activity 生命周期,ApplicationThread 会通过内部类 H(Handler)将任务发送到主线程。
1 | // ActivityThread.java 内部代码逻辑 |
第三步:主线程消息循环 (Looper)
主线程的 Looper 不断从 MessageQueue 中取出消息。当收到 EXECUTE_TRANSACTION 时,回调 H 的 handleMessage。
第四步:执行具体逻辑
对于生命周期相关的指令,ActivityThread 会委派给 TransactionExecutor 执行,最终调用到 Activity 的 onCreate/onStart 等方法。
3. 核心处理中心:类 H
ActivityThread 内部维护的 Handler H 是所有系统指令的汇聚点。它处理的消息类型决定了应用的行为。
| 关键消息 (What) | 来源与作用 |
|---|---|
| BIND_APPLICATION | AMS 要求进程进行初始化(创建 Application, 加载 Provider)。 |
| EXECUTE_TRANSACTION | Android 9.0+ 引入,聚合了几乎所有生命周期回调(Launch, Resume, Stop 等)。 |
| RECEIVER | 处理非动态注册的广播接收者。 |
| SERVICE_ARGS | 启动或分发 Service 任务。 |
4. 协作机制总结
| 关键环节 | 核心机制 | 核心目的 |
|---|---|---|
| 跨进程传输 | Binder | 实现 System Server 与 App 进程的通信边界。 |
| 线程切换 | Handler (类 H) | 将异步的系统指令切换到单线程的 UI 线程执行,确保线程安全。 |
| 顺序保证 | MessageQueue | 确保来自系统的多个指令(如先 Create 后 Resume)按序执行。 |
| 事务封装 | ClientTransaction | 在现代 Android 版本中简化生命周期管理,支持复杂的组合状态切换。 |
💡 面试要点:
- ActivityThread 的主线程循环是什么?
答:是Looper.loop(),它不仅处理用户交互,还处理来自 AMS 的所有生命周期指令。 - 为什么 ApplicationThread 里的方法不直接改 UI?
答:因为 ApplicationThread 的方法运行在 Binder 线程 中,而 Android 的 UI 系统是非线程安全的,必须通过 Handler 切换到主线程。 - Handler H 的作用?
答:它是应用进程的“神经中枢”,负责将系统的异步调用同步化到主线程执行。