外观
AMS 和 ATMS 有什么区别?Activity、Task、进程是什么关系?
标准回答
AMS 是 ActivityManagerService。虽然名字里有 Activity,但在现代 Android 中,大量 Activity 与任务管理工作已由 ActivityTaskManagerService,也就是 ATMS 承担。AMS 仍负责进程管理以及 Service、广播、Provider 等重要运行协调;两者会一起完成应用运行与页面切换。
ATMS 管的是系统眼中的页面与任务状态。ActivityRecord 可以理解为系统为一个页面实例维护的档案;Task 表示用户完成某件事时组织起来的一组 Activity;应用中的 Activity 对象则在应用进程里。ActivityRecord 不是把整个 Activity 对象搬进了系统进程。
进程是代码运行的容器,Task 是页面组织单位,两者不是一一对应。一个应用进程可以承载多个 Activity,甚至服务于多个任务;一个任务也可能包含来自不同应用、不同进程的 Activity。启动模式、Intent flags 和现有任务状态共同影响复用或新建行为。
例如 A 页面打开 B:ATMS 决定 B 放在哪个任务、是否复用已有实例,并协调生命周期变化;如果 B 所需进程不存在,AMS 的进程管理链路负责安排创建。最后由 B 所在进程的主线程执行页面回调,而不是由 AMS 直接在系统进程里调用 B.onCreate。
关键机制
- Activity:应用里的页面对象;ActivityRecord:系统侧跟踪页面的记录。
- Task:组织页面导航的任务;进程:代码和内存的运行容器。
- 启动或切换由系统协调,生命周期回调由应用执行。
通俗例子
在邮件应用里打开另一应用的内容页,返回时回到邮件,这可以发生在同一个任务的导航链中,但两个 Activity 并不因此运行在同一个进程。
追问与回答
按返回键就一定销毁 Activity 吗?
不能一概而论。普通页面默认返回通常结束当前 Activity,但根启动页在 Android 12 及以后有默认将任务移到后台的行为,应用也可能处理自己的返回导航。需要看页面位置、系统版本和返回实现。返回、Home、finish 和进程被杀是不同事件,不能混为一谈。
AMS 怎样决定哪个 Activity 先执行 onPause?
更准确地说,现代系统由 ATMS 等页面管理逻辑协调生命周期转换,再通过应用侧接口安排执行,应用主线程处理对应生命周期事务。系统保存目标与执行状态,应用回报执行结果。理解时先抓住“系统安排、应用执行”,具体类名和事务分发步骤再对照目标版本源码。
易混淆点
FLAG_ACTIVITY_NEW_TASK 不等于一定创建新进程,也不等于每次新建任务;系统可能复用匹配任务。配置变化重建 Activity 也不必重建进程。
参考资料
内容来源
- Android 技术札记 · 原条目
ams-atms