一、AMS 是什么?
ActivityManagerService 是 Android 系统服务之一,运行在 system_server 进程 中。
它主要负责管理:
1. Activity 启动和生命周期调度
2. Service 启动、绑定和生命周期调度
3. BroadcastReceiver 广播分发
4. ContentProvider 发布和管理
5. 应用进程的创建、调度、优先级管理
6. 任务栈 Task、返回栈 Back Stack 管理
7. ANR 监控和处理
8. 权限校验、进程状态管理
9. 内存回收相关的进程优先级维护
一句话:
AMS 是 Android 应用组件和应用进程的总调度中心。
二、AMS 运行在哪个进程?
AMS 运行在:
system_server 进程
Android 系统启动时,Zygote 会 fork 出 system_server 进程,然后在 system_server 中启动大量系统服务,其中就包括 AMS。
简化启动流程:
init 进程
↓
Zygote 进程
↓
system_server 进程
↓
启动 AMS、WMS、PMS、PKMS 等系统服务
AMS 本身不是运行在普通 App 进程里的,而是在系统进程里。
三、AMS 和其他核心服务的关系
Android Framework 中有很多系统服务,AMS 经常和它们协作。
1. AMS 和 Zygote
AMS 需要启动一个新的 App 进程时,并不是自己直接创建,而是请求 Zygote fork。
流程大概是:
AMS 判断目标 App 进程不存在
↓
AMS 请求 Zygote fork 新进程
↓
Zygote fork 出 App 进程
↓
App 进程启动 ActivityThread.main()
↓
ActivityThread 通知 AMS:我已经起来了
2. AMS 和 ActivityThread
ActivityThread 是 App 进程的主线程管理类。
很多人以为 ActivityThread 是一个线程,其实不是,它是一个类,负责管理 App 进程中的主线程逻辑。
关系如下:
AMS:系统进程中的管理者
ActivityThread:App 进程中的执行者
比如启动 Activity:
AMS 决定启动哪个 Activity
ActivityThread 真正执行 Activity 的 onCreate/onStart/onResume
AMS 不会直接调用你的 Activity 生命周期方法,因为 Activity 在 App 进程中,AMS 在 system_server 进程中。
它们之间通过 Binder 通信。
3. AMS 和 WMS
WindowManagerService,简称 WMS,负责窗口管理。
Activity 启动过程中:
AMS 管 Activity 生命周期和任务栈
WMS 管窗口显示、Surface、焦点、窗口层级
例如:
Activity 要显示出来,不仅要 AMS 调度生命周期,
还需要 WMS 创建和管理窗口。
4. AMS 和 PMS / PackageManagerService
PackageManagerService 负责安装包、Manifest 解析、组件信息查询。
启动 Activity 时,AMS 需要知道:
这个 Intent 对应哪个 Activity?
这个 Activity 是否存在?
是否 exported?
权限是否满足?
属于哪个包?
进程名是什么?
这些信息通常来自 PMS。
四、AMS 主要管理什么?
1. Activity 生命周期管理
AMS 负责调度 Activity 生命周期,例如:
onCreate()
onStart()
onResume()
onPause()
onStop()
onDestroy()
但注意:
AMS 是调度者,不是真正执行者。
真正调用 Activity 生命周期方法的是 App 进程中的:
ActivityThread
AMS 通过 Binder 通知 ActivityThread 执行生命周期。
例如启动 Activity:
App 调用 startActivity()
↓
通过 Binder 调用 AMS
↓
AMS 解析 Intent、检查权限、查找任务栈
↓
如果进程不存在,请求 Zygote 创建进程
↓
AMS 通知目标进程的 ActivityThread 创建 Activity
↓
ActivityThread 执行 performLaunchActivity()
↓
调用 Activity.onCreate()
2. 任务栈 Task 管理
AMS 负责管理 Task,也就是我们常说的任务栈。
比如:
MainActivity → DetailActivity → PayActivity
这几个 Activity 可能属于同一个 Task。
AMS 会根据以下因素决定 Activity 如何入栈:
1. launchMode
2. Intent Flag
3. taskAffinity
4. documentLaunchMode
5. 是否跨应用启动
常见 launchMode:
standard
singleTop
singleTask
singleInstance
singleInstancePerTask
常见 Intent Flag:
FLAG_ACTIVITY_NEW_TASK
FLAG_ACTIVITY_CLEAR_TOP
FLAG_ACTIVITY_SINGLE_TOP
FLAG_ACTIVITY_CLEAR_TASK
FLAG_ACTIVITY_REORDER_TO_FRONT
3. Service 管理
AMS 负责 Service 的启动、绑定、停止。
例如:
startService(intent)
bindService(intent, connection, flags)
stopService(intent)
这些请求最终都会经过 AMS。
AMS 负责:
1. 找到目标 Service
2. 判断目标进程是否存在
3. 不存在则创建进程
4. 通知 ActivityThread 创建 Service
5. 调用 Service.onCreate()
6. 调用 Service.onStartCommand()
7. 管理 bindService 连接关系
8. 在适当时候销毁 Service
Service 生命周期实际调用也发生在 App 进程,由 ActivityThread 完成。
4. BroadcastReceiver 管理
广播发送时,也需要 AMS 参与。
例如:
sendBroadcast(intent)
sendOrderedBroadcast(intent)
AMS 负责:
1. 解析广播 Intent
2. 查找静态注册和动态注册的 Receiver
3. 权限检查
4. 分发广播
5. 管理有序广播队列
6. 控制广播超时,触发 ANR
Android 8.0 之后,对隐式静态广播有很多限制,这些也和 AMS 的广播管理有关。
5. ContentProvider 管理
当 App 访问 ContentProvider 时,例如:
getContentResolver().query(uri, ...)
AMS 需要确保目标 Provider 所在进程已经启动。
大概流程:
App 请求访问 Provider
↓
AMS 查询 Provider 信息
↓
如果 Provider 所在进程不存在,先启动进程
↓
目标进程发布 Provider
↓
AMS 返回 Provider 的 Binder 引用
↓
调用方通过 Binder 访问 Provider
ContentProvider 有个特点:
它通常会在 Application.onCreate() 之前初始化。
这也是很多三方库早期喜欢用 ContentProvider 做自动初始化的原因。
6. 进程管理
AMS 管理 Android 中应用进程的状态和优先级。
比如一个进程可能处于:
前台进程
可见进程
服务进程
缓存进程
空进程
这些状态会影响系统在内存不足时杀进程的顺序。
常见优先级大致如下:
前台进程 Foreground Process
↓
可见进程 Visible Process
↓
服务进程 Service Process
↓
后台进程 Background Process
↓
缓存进程 Cached Process
优先级越低,越容易被系统回收。
7. ANR 管理
AMS 参与 ANR 检测和处理。
常见 ANR 类型:
1. Input dispatching timed out
2. BroadcastReceiver timeout
3. Service timeout
4. ContentProvider timeout
AMS 会监控一些超时场景。
典型超时时间:
前台 Service 创建超时:约 20s
后台 Service 创建超时:约 200s
BroadcastReceiver 前台广播超时:约 10s
BroadcastReceiver 后台广播超时:约 60s
输入事件超时:约 5s
ContentProvider 发布超时:约 10s
不同 Android 版本可能有差异,但面试说大致即可。
五、AMS 在 Android 启动流程中的位置
系统启动简化流程:
1. Bootloader 启动 Linux Kernel
2. Kernel 启动 init 进程
3. init 进程启动 Zygote
4. Zygote fork system_server
5. system_server 启动系统服务
6. 启动 AMS
7. AMS 启动 Launcher
8. 用户看到桌面
AMS 起来后,会启动系统桌面 Launcher。
简化理解:
AMS 是让 Android 应用世界开始运行的核心调度器。
六、App 启动 Activity 时 AMS 做了什么?
这是面试中非常高频的问题。
例如:
Intent intent = new Intent(this, TargetActivity.class);
startActivity(intent);
大致流程:
1. Activity 调用 startActivity()
2. 最终通过 Instrumentation 发起启动请求
3. 通过 Binder 调用 AMS/ATMS
4. 系统解析 Intent
5. PMS 查询目标 Activity 信息
6. AMS/ATMS 检查权限、exported、启动模式
7. 根据 launchMode 和 Intent Flag 找到或创建 Task
8. 如果目标 App 进程不存在,请求 Zygote fork
9. 新进程启动 ActivityThread.main()
10. ActivityThread 创建主线程 Looper
11. ActivityThread attach 到 AMS
12. AMS 通知 ActivityThread launch Activity
13. ActivityThread 通过 Instrumentation 创建 Activity 实例
14. 调用 Activity.attach()
15. 调用 Activity.onCreate()
16. 调用 onStart()
17. 调用 onResume()
18. Activity 页面显示
Android 10 以后 Activity 启动很多逻辑从 AMS 拆到了:
ActivityTaskManagerService,ATMS
但面试中很多人仍然统称为 AMS 启动 Activity。
七、AMS、ATMS、WMS 的区别
Android 10 之后,Activity 任务栈相关逻辑大量拆到了 ActivityTaskManagerService。
AMS
主要负责:
进程管理
四大组件管理
Service/Broadcast/Provider
进程状态
ANR
ATMS
主要负责:
Activity 启动
Activity 栈管理
Task 管理
Activity 生命周期调度的一部分
WMS
主要负责:
窗口管理
Window 层级
焦点管理
Surface
屏幕显示
面试可以这样回答:
早期 Activity 启动和任务栈主要由 AMS 管理,Android 10 后拆分出了 ATMS,专门负责 Activity 和 Task 管理;AMS 更偏向进程和组件整体调度,WMS 负责窗口显示。
八、Activity 启动中涉及的几个核心类
面试常会问源码链路,这些类要知道。
1. Activity
开发者写的页面。
startActivity(intent)
2. Instrumentation
负责协助 Activity 启动、生命周期调用、测试注入等。
常见源码链路中会出现:
Instrumentation.execStartActivity()
Instrumentation.newActivity()
Instrumentation.callActivityOnCreate()
3. ActivityTaskManagerService / ActivityManagerService
系统服务端,负责启动调度。
4. ActivityStarter
负责 Activity 启动请求的处理。
例如:
解析启动参数
检查启动权限
处理 launchMode
处理 Intent Flags
5. ActivityRecord
系统服务端对一个 Activity 的描述。
可以理解为:
Framework 中记录一个 Activity 状态的对象
包括:
ActivityInfo
Intent
所在 Task
生命周期状态
token
进程信息
6. Task
任务栈。
以前源码中常见 TaskRecord,新版本中逐渐演进成 Task。
7. ActivityThread
App 进程中的主线程管理类。
8. H / Handler
ActivityThread 内部 Handler,用于在主线程处理生命周期消息。
9. ClientTransaction
Android 9 之后引入,用于统一向 App 进程发送生命周期事务。
例如:
LaunchActivityItem
ResumeActivityItem
PauseActivityItem
StopActivityItem
DestroyActivityItem
AMS/ATMS 会通过 Binder 把这些事务发给 App 进程。
九、AMS 和 Binder 的关系
AMS 是一个系统服务,App 进程不能直接调用它的方法对象,只能通过 Binder IPC。
例如:
App 进程
↓ Binder
system_server 进程中的 AMS
早期常见接口:
IActivityManager
现在 Activity 启动相关还有:
IActivityTaskManager
应用层调用:
startActivity()
底层本质是跨进程调用系统服务。
面试可以这样说:
AMS 运行在 system_server 中,App 进程通过 Binder 调用 AMS 暴露的接口,AMS 再通过 Binder 回调 App 进程中的 ApplicationThread,让 ActivityThread 执行具体生命周期。
十、ApplicationThread 是什么?
ApplicationThread 是 ActivityThread 内部的 Binder 对象。
它的作用是:
让 AMS 可以反向调用 App 进程。
关系如下:
App 调用 AMS:通过 IActivityManager Binder
AMS 调用 App:通过 IApplicationThread Binder
例如 AMS 想让 App 创建 Activity,会调用 App 进程的:
ApplicationThread.scheduleLaunchActivity()
然后 App 进程中 ActivityThread 的 Handler 收到消息,最终执行 Activity 生命周期。
简化图:
App进程:ActivityThread
↑ ↓
ApplicationThread IActivityManager
↑ ↓
system_server:AMS/ATMS
十一、Activity 启动时如果 App 进程不存在怎么办?
这是高频面试问题。
答案:
AMS/ATMS 会先解析目标 Activity,发现目标进程不存在时,请求 Zygote fork 一个新进程。新进程启动后执行 ActivityThread.main(),然后 attach 到 AMS,AMS 再继续启动 Activity。
流程:
startActivity()
↓
AMS/ATMS 发现目标进程不存在
↓
AMS 调用 Process.start()
↓
通过 socket 请求 Zygote fork
↓
Zygote fork 出 App 进程
↓
App 进程执行 ActivityThread.main()
↓
创建 Looper、ActivityThread
↓
ActivityThread.attach()
↓
AMS 绑定 Application
↓
创建 Application
↓
启动目标 Activity
十二、Activity 生命周期是谁调用的?
面试中要注意,不要简单说 AMS 直接调用。
准确说法:
AMS/ATMS 负责调度生命周期,真正调用 Activity 生命周期方法的是 App 进程中的 ActivityThread,具体通过 Instrumentation 完成调用。
例如:
AMS/ATMS 发出 LaunchActivityItem
↓
ActivityThread 接收事务
↓
performLaunchActivity()
↓
Instrumentation.newActivity()
↓
Activity.attach()
↓
Instrumentation.callActivityOnCreate()
↓
Activity.onCreate()
所以:
AMS:发命令
ActivityThread:执行命令
Instrumentation:具体调用生命周期
十三、AMS 如何管理进程优先级?
Android 会根据组件状态给进程设置不同优先级,也就是 OOM Adj。
进程优先级大致如下:
1. 前台进程
例如:
正在和用户交互的 Activity
正在执行 onReceive 的 BroadcastReceiver
正在执行生命周期回调的 Service
前台 Service
最不容易被杀。
2. 可见进程
例如:
Activity 可见但不在前台
比如弹窗覆盖后面的 Activity
3. 服务进程
例如:
启动了普通后台 Service
4. 缓存进程
例如:
Activity 已经不可见,但是进程暂时缓存
内存不足时容易被杀。
AMS 会维护进程状态,并把信息传递给底层 LMKD,系统在内存不足时根据优先级杀进程。
十四、AMS 和 ANR 的关系
ANR,全称:
Application Not Responding
AMS 会参与很多 ANR 的触发和处理。
例如:
1. Service ANR
如果 Service 在规定时间内没有完成启动、绑定等操作,可能 ANR。
前台 Service:约 20s
后台 Service:约 200s
2. BroadcastReceiver ANR
如果 onReceive() 执行太久,会 ANR。
前台广播:约 10s
后台广播:约 60s
3. ContentProvider ANR
Provider 发布超时可能 ANR。
4. Input ANR
输入事件分发超时通常和 WMS/InputDispatcher 有关,但最终 ANR 处理也会涉及 AMS。
面试重点:
ANR 本质是主线程长时间没有响应系统调度或输入事件。AMS 负责部分超时检测、收集 traces、弹出 ANR 对话框或杀进程。
十五、AMS 常见源码路径
如果面试偏源码,可能需要知道一些类名。
不同版本路径会有差异,但大体是:
frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java
frameworks/base/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
frameworks/base/core/java/android/app/ActivityThread.java
frameworks/base/core/java/android/app/Instrumentation.java
frameworks/base/core/java/android/app/IActivityManager.aidl
frameworks/base/core/java/android/app/IApplicationThread.aidl
Android 10 以后,Activity/Task 相关很多在:
frameworks/base/services/core/java/com/android/server/wm/
十六、面试中 AMS 高频问题
下面是常见面试题和回答思路。
问题 1:AMS 是什么?有什么作用?
回答:
AMS 是运行在 system_server 进程中的核心系统服务,负责管理应用进程和四大组件,包括 Activity、Service、BroadcastReceiver、ContentProvider 的启动和生命周期调度,同时还负责任务栈管理、进程优先级管理、ANR 监控等。
问题 2:AMS 运行在哪个进程?
回答:
system_server 进程。
补充:
系统启动时 Zygote fork 出 system_server,system_server 中启动 AMS、WMS、PMS 等系统服务。
问题 3:Activity 的生命周期是 AMS 调用的吗?
推荐回答:
不完全是。AMS/ATMS 负责生命周期调度,真正调用 Activity 生命周期方法的是 App 进程中的 ActivityThread,并通过 Instrumentation 执行具体的 onCreate、onStart、onResume 等方法。
问题 4:startActivity 后发生了什么?
回答主线:
Activity.startActivity()
→ Instrumentation.execStartActivity()
→ Binder 调用 ATMS/AMS
→ 解析 Intent 和 ActivityInfo
→ 检查权限、launchMode、Intent Flag
→ 找 Task 或创建 Task
→ 如果进程不存在,请求 Zygote fork
→ App 进程 ActivityThread.main()
→ attach 到 AMS
→ AMS/ATMS 发送启动事务
→ ActivityThread 创建 Activity
→ 调用 onCreate/onStart/onResume
问题 5:App 进程不存在时,AMS 怎么启动它?
回答:
AMS 调用 Process.start,通过 socket 请求 Zygote fork 新的 App 进程。新进程启动后执行 ActivityThread.main(),然后通过 ActivityThread.attach() 把 ApplicationThread 传给 AMS,AMS 再通过这个 Binder 对象调度 Application 和 Activity 的创建。
问题 6:AMS 和 ActivityThread 是什么关系?
回答:
AMS 在 system_server 进程,负责系统侧管理和调度;ActivityThread 在 App 进程,负责执行具体组件生命周期。两者通过 Binder 通信。App 调 AMS 使用 IActivityManager/IActivityTaskManager,AMS 回调 App 使用 IApplicationThread。
问题 7:ApplicationThread 是什么?
回答:
ApplicationThread 是 ActivityThread 内部的 Binder 服务端对象,它实现了 IApplicationThread 接口。AMS 通过它向 App 进程发送生命周期调度请求,比如启动 Activity、创建 Service、分发 Receiver 等。
问题 8:AMS 和 WMS 的区别?
回答:
AMS/ATMS:负责 Activity 生命周期、任务栈、进程和组件管理
WMS:负责窗口管理、窗口层级、焦点、Surface 显示
补充:
一个 Activity 能显示出来,需要 AMS/ATMS 调度生命周期,也需要 WMS 管理窗口。
问题 9:AMS 和 PMS 的关系?
回答:
PMS 负责解析安装包和维护组件信息。AMS 启动 Activity、Service、Receiver、Provider 时,需要通过 PMS 查询目标组件信息,并进行权限、exported 等检查。
问题 10:AMS 如何管理任务栈?
回答:
AMS/ATMS 会根据 Activity 的 launchMode、Intent Flags、taskAffinity 等信息决定 Activity 放入哪个 Task,是否复用已有实例,是否清理栈顶页面,是否创建新 Task。
可以顺带说:
standard:每次创建新实例
singleTop:栈顶复用
singleTask:任务栈中复用,清理上方 Activity
singleInstance:独占任务栈
问题 11:onNewIntent 是谁触发的?
回答:
当 Activity 因为 singleTop、singleTask 或相关 Intent Flag 被复用时,AMS/ATMS 不会重新创建 Activity,而是通过 ActivityThread 调度调用 Activity 的 onNewIntent()。
问题 12:Service 的启动流程和 AMS 有什么关系?
回答:
startService 或 bindService 最终都会通过 Binder 请求 AMS。AMS 解析 Service 信息,检查权限,如果目标进程不存在则启动进程,然后通过 ApplicationThread 通知 ActivityThread 创建 Service,并调用 onCreate、onStartCommand 或 onBind。
问题 13:广播是 AMS 管理的吗?
回答:
是。动态广播注册、广播发送、广播队列、有序广播调度、Receiver 超时等都由 AMS 参与管理。广播最终会通过 ActivityThread 调用 Receiver 的 onReceive。
问题 14:ANR 和 AMS 有什么关系?
回答:
AMS 负责监控 Service、BroadcastReceiver、ContentProvider 等组件的超时,并参与 ANR 处理。发生 ANR 时,AMS 会收集进程信息和 traces,然后决定弹 ANR 对话框或杀进程。
问题 15:Android 10 之后 AMS 有什么变化?
回答:
Android 10 后将 Activity 和 Task 管理相关逻辑从 AMS 中拆分到了 ActivityTaskManagerService,简称 ATMS。现在 Activity 启动、Task 管理更多由 ATMS 负责,但很多场景面试中仍习惯统称 AMS。
十七、面试回答模板
如果面试官问:
你了解 AMS 吗?
你可以这样回答:
AMS 是 Android Framework 层的核心系统服务,运行在 system_server 进程中。
它主要负责应用进程和四大组件的管理,包括 Activity、Service、BroadcastReceiver、ContentProvider 的启动和生命周期调度,同时还负责进程优先级、任务栈、ANR 等。
App 进程和 AMS 之间通过 Binder 通信。比如 startActivity 时,应用侧会通过 Instrumentation 最终 Binder 调用到 AMS/ATMS,系统解析 Intent、检查权限、处理 launchMode 和 Task。如果目标进程不存在,AMS 会请求 Zygote fork 新进程。新进程启动 ActivityThread 后 attach 到 AMS,AMS 再通过 ApplicationThread 反向通知 App 进程创建 Activity。真正调用 onCreate、onResume 的是 ActivityThread 和 Instrumentation,而不是 AMS 直接调用。
这段回答基本可以覆盖大多数 AMS 基础面试题。
十八、重点记忆图
你可以记这张图:
startActivity()
↓
Instrumentation
↓ Binder
ATMS / AMS 【system_server】
↓
PMS 查询组件信息
↓
处理 launchMode / Task / 权限
↓
进程不存在?
↓
Zygote fork App 进程
↓
ActivityThread.main() 【App 进程】
↓
ActivityThread.attach()
↓ Binder
AMS 保存 ApplicationThread
↓ Binder 回调
ApplicationThread
↓
ActivityThread Handler
↓
Instrumentation
↓
Activity.onCreate/onStart/onResume
十九、最核心结论
AMS 面试最重要的几个点:
1. AMS 运行在 system_server 进程
2. AMS 是四大组件和进程管理核心服务
3. App 和 AMS 通过 Binder 通信
4. Activity 生命周期由 AMS 调度,ActivityThread 执行
5. 进程不存在时 AMS 请求 Zygote fork
6. Activity 栈和 Task 由 AMS/ATMS 管理
7. Android 10 后 Activity/Task 主要拆到 ATMS
8. AMS 参与 ANR 检测和进程优先级管理
一句话总结:
AMS 是 Android 系统中负责“应用进程和组件运行秩序”的核心调度中心。