可以把 AMS(ActivityManagerService) 和 ActivityThread 理解成 Android 应用启动与四大组件调度中的两端:
AMS 是系统进程里的“管理者”
ActivityThread 是应用进程里的“执行者”
1. AMS 是什么?
AMS,全称 ActivityManagerService,运行在 system_server 进程 中。
它是 Android 系统中负责管理应用组件生命周期的核心服务之一,主要管理:
- Activity 的启动、暂停、恢复、销毁
- Service 的启动、绑定、停止
- Broadcast 的分发
- ContentProvider 的管理
- 进程的启动与回收
- 任务栈、Activity 栈管理
- 应用 ANR 监控
可以简单理解为:
AMS 负责“决定谁该启动、谁该停止、谁在前台、谁在后台”。
2. ActivityThread 是什么?
ActivityThread 运行在 应用进程 中。
虽然名字叫 ActivityThread,但它并不是只负责 Activity,也不是一个 Thread 类,而是应用进程的主入口和核心调度类。
它主要负责:
- 创建 Application
- 创建 Activity
- 调用 Activity 生命周期方法
- 创建 Service
- 分发 BroadcastReceiver
- 安装 ContentProvider
- 管理主线程消息循环
应用进程启动后,会执行:
ActivityThread.main()
在里面创建主线程 Looper,然后进入消息循环。
可以简单理解为:
ActivityThread 负责在应用进程中真正执行组件生命周期。
3. AMS 和 ActivityThread 的关系
AMS 和 ActivityThread 分别运行在不同进程中:
| 角色 | 所在进程 | 作用 |
|---|---|---|
| AMS | system_server 进程 | 系统级管理者 |
| ActivityThread | 应用进程 | 应用内执行者 |
它们通过 Binder IPC 通信。
4. 举例:启动一个 Activity 的过程
假设你调用:
startActivity(intent)
大致流程是:
第一步:应用请求 AMS
当前应用通过 Binder 调用 AMS:
App 进程 → AMS
AMS 会检查:
- Intent 是否合法
- 目标 Activity 是否存在
- 权限是否满足
- 是否需要新建任务栈
- 目标进程是否已经存在
第二步:AMS 判断目标进程是否存在
如果目标 Activity 所在的进程还没启动,AMS 会请求 Zygote fork 一个新进程。
AMS → Zygote → fork 新 App 进程
新进程启动后,入口是:
ActivityThread.main()
第三步:ActivityThread 绑定到 AMS
应用进程启动后,ActivityThread 会通过 Binder 向 AMS 报到:
ActivityThread → AMS:我启动好了
这个过程叫做 attach。
AMS 知道应用进程已经启动,就可以继续调度组件了。
第四步:AMS 通知 ActivityThread 创建 Activity
AMS 通过 Binder 通知应用进程里的 ActivityThread:
AMS → ActivityThread:创建并启动这个 Activity
ActivityThread 收到消息后,会在主线程中执行:
performLaunchActivity()
然后完成:
Activity activity = new Activity();
activity.attach(...);
activity.onCreate(...);
activity.onStart(...);
activity.onResume(...);
最终 Activity 显示出来。
5. 它们的通信方式
AMS 和 ActivityThread 之间是双向 Binder 通信。
应用调用 AMS
应用侧通过类似下面的接口调用系统服务:
IActivityManager
例如:
ActivityThread / ContextImpl → AMS
用于请求启动 Activity、Service 等。
AMS 调用应用进程
AMS 通过应用进程暴露给它的 Binder 接口调用回来:
IApplicationThread
这个接口的实现通常在:
ActivityThread.ApplicationThread
也就是说:
AMS → ApplicationThread → ActivityThread Handler → 主线程执行生命周期
注意:
AMS 直接 Binder 调用到应用进程时,不会直接执行 Activity 生命周期,而是通过 Handler 切到应用主线程执行。
6. 为什么需要 AMS 和 ActivityThread 分开?
因为 Android 是多进程系统:
- 系统必须统一管理所有应用
- 每个应用运行在自己的独立进程
- 系统进程不能直接调用应用对象
- 应用进程也不能自己随意启动组件
所以需要:
AMS 统一管理
ActivityThread 本地执行
Binder 负责跨进程通信
7. 一个形象比喻
可以把 Android 系统想象成一个剧场:
| 对象 | 比喻 |
|---|---|
| AMS | 导演 / 调度中心 |
| ActivityThread | 演员所在剧组的执行负责人 |
| Activity | 演员 |
| Binder | 对讲机 |
| Zygote | 造人机器 / 进程孵化器 |
AMS 说:
这个 Activity 该上场了。
ActivityThread 收到指令后,在应用进程中真正执行:
onCreate()
onStart()
onResume()
8. 总结一句话
AMS 是 system_server 中负责管理应用组件和进程的系统服务;ActivityThread 是应用进程中的主线程调度核心,负责根据 AMS 的指令真正创建组件并执行生命周期。
更简单地说:
AMS 管“什么时候做”,ActivityThread 管“具体怎么做”。