AMS = ActivityManagerService,是 Android Framework 里一个非常核心的系统服务。
可以简单理解为:
AMS 是 Android 系统中负责管理四大组件运行和调度的“大管家”。
四大组件包括:
Activity
Service
BroadcastReceiver
ContentProvider
当你启动 Activity、启动 Service、发送广播、绑定 Service 等操作时,背后几乎都会经过 AMS。
1. AMS 在哪里运行?
AMS 不是运行在你的 App 进程里,而是运行在系统进程中:
system_server 进程
Android 启动时,会启动一个非常重要的进程:
system_server
里面运行着很多系统服务,比如:
ActivityManagerService,简称 AMS
PackageManagerService,简称 PMS
WindowManagerService,简称 WMS
PowerManagerService,简称 PMS/PowerMS
NotificationManagerService,简称 NMS
其中 AMS 就负责应用组件的启动、生命周期、进程管理等。
可以这样理解:
你的 App 进程
|
| Binder IPC
v
system_server 进程中的 AMS
App 想启动 Activity,不是自己直接启动,而是请求 AMS 帮它启动。
2. 为什么需要 AMS?
Android 是一个多进程系统,每个 App 通常运行在自己的进程里。
例如:
微信进程
支付宝进程
浏览器进程
你的 App 进程
system_server 进程
如果每个 App 都自己随便启动组件、管理进程、发送广播,系统就乱了。
所以 Android 需要一个统一的管理者,也就是 AMS。
AMS 负责:
谁可以启动谁
什么时候启动
在哪个进程启动
组件生命周期怎么调度
进程不够用了杀谁
广播发给谁
Service 怎么绑定
3. AMS 主要负责什么?
AMS 的职责非常多,常见可以分为这些:
1. 管理 Activity
当你调用:
startActivity(intent)
表面上是从当前 Activity 启动另一个 Activity。
实际上过程大概是:
App 调用 startActivity()
|
v
通过 Binder 请求 AMS
|
v
AMS 检查 Intent、权限、目标 Activity
|
v
AMS 决定启动哪个 Activity、放入哪个任务栈
|
v
AMS 通知目标 App 进程创建 Activity
|
v
目标 Activity 执行 onCreate()
AMS 会管理 Activity 的:
启动
暂停
恢复
停止
销毁
任务栈
返回栈
启动模式
例如你按返回键,哪个 Activity 出栈,也是 AMS 参与管理的。
2. 管理 Service
比如你调用:
startService(intent)
或者:
bindService(intent, connection, Context.BIND_AUTO_CREATE)
也不是 App 自己直接创建 Service,而是通过 AMS。
大致流程:
App 调用 startService()/bindService()
|
v
AMS 收到请求
|
v
AMS 查找 Service 信息
|
v
如果目标进程没启动,先启动进程
|
v
AMS 通知目标进程创建 Service
|
v
Service 执行 onCreate()/onStartCommand()/onBind()
所以你前面问的 Service 和 Binder 绑定,AMS 也参与其中。
3. 管理广播 Broadcast
当你调用:
sendBroadcast(intent)
广播也不是直接从一个 App 发到另一个 App。
而是:
App 调用 sendBroadcast()
|
v
通过 Binder 请求 AMS
|
v
AMS 根据 IntentFilter 查找匹配的 BroadcastReceiver
|
v
AMS 分发广播
|
v
接收者执行 onReceive()
所以广播机制背后也有 AMS。
AMS 会负责:
广播队列
普通广播
有序广播
粘性广播
静态注册 Receiver
动态注册 Receiver
广播超时检测
4. 管理进程
AMS 还负责管理 App 进程。
例如:
什么时候创建 App 进程
什么时候杀掉后台进程
哪个进程优先级高
哪个进程是前台进程
哪个进程是可见进程
哪个进程是服务进程
哪个进程是缓存进程
当系统内存不足时,AMS 会根据进程优先级决定杀谁。
大概优先级:
前台进程 > 可见进程 > 服务进程 > 后台进程 > 空进程
例如:
当前正在显示 Activity 的 App 不容易被杀
只有缓存 Activity 的后台 App 更容易被杀
5. 管理 ContentProvider
当一个 App 访问另一个 App 的 ContentProvider 时:
contentResolver.query(...)
AMS 也参与查找和启动目标 ContentProvider 所在进程。
大致流程:
App 调用 ContentResolver
|
v
AMS 查找 Provider
|
v
如果 Provider 进程未启动,先启动
|
v
返回 Provider 的 Binder 代理
|
v
进行数据访问
4. AMS 和 Binder 的关系
AMS 是一个系统服务,而 App 和 AMS 不在同一个进程。
所以 App 想请求 AMS,需要使用 Binder IPC。
例如:
startActivity(intent)
背后会变成类似:
App 进程
|
| Binder IPC
v
system_server 进程
|
v
AMS.startActivity()
也就是说:
Binder 是通信机制,AMS 是通过 Binder 暴露出来的系统服务。
类比一下:
Binder 像电话线
AMS 像接电话的系统管理员
App 通过电话线联系 AMS
5. 举例:startActivity 背后的 AMS 流程
你写:
val intent = Intent(this, SecondActivity::class.java)
startActivity(intent)
表面看是 Activity A 启动 Activity B。
实际上:
Activity A
|
| startActivity()
v
Instrumentation
|
| Binder IPC
v
AMS / ATMS
|
| 检查目标 Activity
| 检查权限
| 处理任务栈
| 判断目标进程是否存在
v
如果目标进程不存在,启动进程
|
v
通知目标进程的 ActivityThread
|
v
Activity B onCreate()
补充说明:
较新的 Android 版本中,Activity 启动的部分职责拆给了:
ATMS = ActivityTaskManagerService
但是很多学习资料中仍然会笼统地说 AMS 负责 Activity 启动。
6. 举例:发送广播背后的 AMS 流程
你写:
val intent = Intent("com.example.ACTION_TEST")
sendBroadcast(intent)
背后是:
App 进程
|
| sendBroadcast()
v
ActivityManager/ContextImpl
|
| Binder IPC
v
AMS
|
| 根据 action 找匹配的 BroadcastReceiver
| 放入广播队列
| 分发给接收者
v
Receiver.onReceive()
如果 Receiver 在另一个进程:
AMS 会确保目标进程存在
如果不存在,可能先启动目标进程
然后再分发广播
7. 举例:bindService 背后的 AMS 流程
你写:
bindService(intent, connection, Context.BIND_AUTO_CREATE)
背后是:
Activity 进程
|
| bindService()
v
AMS
|
| 查找 Service
| 如果 Service 未创建,则创建
| 调用 Service.onBind()
| 拿到 IBinder
v
通过 ServiceConnection.onServiceConnected()
把 IBinder 回传给 Activity
如果 Service 和 Activity 在同一进程:
Activity 最后拿到的可能就是真实 Binder 对象
如果 Service 在远程进程:
Activity 最后拿到的是 BinderProxy
8. AMS 和 ActivityThread 的关系
理解 AMS 时,经常会遇到另一个类:
ActivityThread
可以这样理解:
AMS:系统进程里的管理者
ActivityThread:App 进程里的主线程管理者
每个 App 进程中都有一个 ActivityThread。
AMS 不能直接在 App 进程里创建 Activity,它会通过 Binder 通知 App 进程里的 ActivityThread。
例如:
AMS:你创建一下 MainActivity
|
| Binder
v
ActivityThread:好的,我来创建 MainActivity
|
v
MainActivity.onCreate()
所以:
AMS 是遥控指挥者
ActivityThread 是 App 进程里的执行者
9. AMS 和 WMS 的区别
初学 Android Framework 时,容易把 AMS 和 WMS 混淆。
| 系统服务 | 作用 |
|---|---|
| AMS | 管理四大组件、进程、生命周期 |
| WMS | 管理窗口、界面显示、输入事件相关 |
| PMS | 管理应用安装包、权限、组件信息 |
| NMS | 管理通知 |
例如启动 Activity:
AMS/ATMS 负责启动和生命周期
WMS 负责窗口显示
PMS 负责查找 Activity 信息
10. 用一句生活类比理解 AMS
可以把 Android 系统想象成一个公司:
App = 员工
Activity/Service/Receiver = 员工要办的事情
AMS = 公司调度中心/行政主管
Binder = 电话/内部通信线路
员工不能随便自己开会、占会议室、找别人执行任务。
他要先联系行政主管 AMS:
我要启动一个 Activity
我要开启一个 Service
我要发一条广播
我要绑定某个 Service
AMS 检查后安排执行。
11. 总结
AMS,全称:
ActivityManagerService
它是 Android 系统中的核心服务,运行在:
system_server 进程
主要职责:
管理 Activity
管理 Service
管理 BroadcastReceiver
管理 ContentProvider
管理 App 进程
管理组件生命周期
管理广播分发
管理任务栈和进程优先级
App 和 AMS 之间通过:
Binder IPC
进行通信。
最简单一句话:
AMS 是 Android 系统管理应用组件和进程生命周期的核心调度服务。