AMS 分享

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 系统管理应用组件和进程生命周期的核心调度服务。

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇