ActivityThread 接收并处理 AMS 指令全过程

在 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
2
3
4
5
// ActivityThread.java 内部代码逻辑
public void scheduleTransaction(ClientTransaction transaction) {
// 这里的 this 指向 H (Handler)
sendMessage(ActivityThread.H.EXECUTE_TRANSACTION, transaction);
}

第三步:主线程消息循环 (Looper)

主线程的 Looper 不断从 MessageQueue 中取出消息。当收到 EXECUTE_TRANSACTION 时,回调 HhandleMessage

第四步:执行具体逻辑

对于生命周期相关的指令,ActivityThread 会委派给 TransactionExecutor 执行,最终调用到 ActivityonCreate/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 版本中简化生命周期管理,支持复杂的组合状态切换。

💡 面试要点:

  1. ActivityThread 的主线程循环是什么?
    答:是 Looper.loop(),它不仅处理用户交互,还处理来自 AMS 的所有生命周期指令。
  2. 为什么 ApplicationThread 里的方法不直接改 UI?
    答:因为 ApplicationThread 的方法运行在 Binder 线程 中,而 Android 的 UI 系统是非线程安全的,必须通过 Handler 切换到主线程。
  3. Handler H 的作用?
    答:它是应用进程的“神经中枢”,负责将系统的异步调用同步化到主线程执行。
, ,