AMS 核心机制概述
Android Activity Manager Service (AMS) 是 Android 操作系统的核心系统服务,运行在 System_server 进程中。它负责管理所有应用的 Activity 生命周期、任务栈、进程创建与销毁,以及广播和服务的协调。AMS 通过 Binder IPC(进程间通信)机制与应用进程交互,确保系统资源的高效分配和应用的平稳运行。 AMS 的设计强调进程隔离和优先级管理,以应对内存有限的移动设备环境。下面将深度解析 Activity 生命周期与进程管理的核心机制,以及 AMS 在其中的协调作用。
Activity 生命周期深度解析
Activity 是 Android 应用的用户界面组件,其生命周期由 AMS 严格管理。生命周期定义了 Activity 从创建到销毁的各个状态和过渡,确保应用在用户交互、系统事件(如旋转屏幕或低内存)下正确响应。Activity 生命周期不是简单的方法调用序列,而是与 AMS、进程管理和资源回收紧密耦合的系统。
核心回调与状态
Activity 类提供了六个核心回调,由系统(通过 AMS)在适当时机调用。这些回调对应 Activity 的状态变化:
| 回调方法 | 状态 | 目的与关键操作 | AMS 交互 |
|---|---|---|---|
onCreate(Bundle savedInstanceState) | Created(已创建) | 初始化 UI(如 setContentView())、变量和数据绑定。调用 super.onCreate(),从 savedInstanceState 恢复状态。 | AMS 创建 Activity 实例并传递给进程。 |
onStart() | Started(已启动) | 准备可见 UI,进行动画等初始化。 | AMS 确保 Activity 进入可见状态。 |
onResume() | Resumed(已恢复) | 进入前台,用户可交互。启动相机、传感器等操作。 | AMS 将 Activity 置于前台焦点。 |
onPause() | Paused(已暂停) | 部分遮挡或中断(如来电)。释放非关键资源,但不保存数据(时间短暂)。 | AMS 处理中断事件,暂停 Activity。 |
onStop() | Stopped(已停止) | 完全不可见。保存用户进度,释放资源。 | AMS 可能将进程降级为缓存状态。 |
onDestroy() | Destroyed(已销毁) | 最终清理。区分用户关闭(isFinishing() 为 true)或配置变化。 | AMS 销毁实例,可能重启新进程。 |
额外回调包括:
onRestart():在onStart()前调用,用于从 Stopped 状态恢复。onSaveInstanceState(Bundle outState):在可能销毁前保存瞬态 UI 状态(如滚动位置),系统自动保存 View 状态(需设置 ID)。onRestoreInstanceState(Bundle savedInstanceState):在onStart()后恢复状态。
Activity 状态与可见性、焦点和内存关系如下:
| 状态 | 可见性 | 焦点 | 交互性 | 内存风险 |
|---|---|---|---|---|
| Created | 否 | 否 | 否 | 低 |
| Started | 是 | 否 | 否 | 低 |
| Resumed | 是 | 是 | 是 | 最低 |
| Paused | 部分 | 否 | 否 | 中 |
| Stopped | 否 | 否 | 否 | 高(可被杀) |
| Destroyed | N/A | N/A | N/A | 已释放 |
状态过渡与 AMS 协调
Activity 的状态过渡由 AMS 调度,例如从 Activity A 切换到 B:
- A 调用
onPause()(可能并发 B 的onCreate())。 - B 依次调用
onCreate()、onStart()、onResume()。 - 如果 A 完全隐藏,调用
onStop()。
配置变化(如屏幕旋转)会触发销毁-重建流程:onPause() → onStop() → onDestroy() → 新实例的 onCreate()(传递保存状态)。AMS 使用 ActivityRecord 数据结构跟踪每个 Activity 的状态,确保任务栈(Task)正确管理。
内部机制涉及:
- Instrumentation:中介类,实际调用生命周期方法。
- ActivityThread:应用主线程,接收 AMS 的消息(如 LAUNCH_ACTIVITY)并执行回调。
- Binder IPC:应用与 AMS 通信通道。
最佳实践:使用 ViewModel 保存复杂数据(生存配置变化),LifecycleObserver 观察事件;在 onStop() 保存持久数据,避免在 onPause() 做重操作。
进程管理深度解析
Android 应用通常运行在独立的 Linux 进程中,由 AMS 负责创建、优先级分配和终止。这与 Activity 生命周期紧密相关:Activity 状态决定了进程优先级,进程死亡可能中断生命周期。
进程创建与启动
应用启动时(用户点击图标):
- Launcher 通过 PackageManagerService 获取 Manifest 数据,构建 Intent。
- 调用
startActivity(),通过 Binder IPC 发送到 AMS。 - AMS 检查进程:如果不存在,使用 Zygote fork 新进程(Zygote 是预加载的模板进程,提高启动速度)。
- 新进程中,ActivityThread 初始化,AMS 发送 LAUNCH_ACTIVITY 消息,启动 Activity 生命周期。
AMS 维护全局 Activity 栈,确保进程与组件关联。
进程优先级与 OOM Killer
AMS 根据运行组件分配进程优先级(importance hierarchy),从高到低:
| 优先级 | 描述 | 示例组件 | 终止风险 |
|---|---|---|---|
| Foreground(前台) | 用户直接交互 | Resumed Activity、正在执行的 BroadcastReceiver | 最低 |
| Visible(可见) | 用户可见但无焦点 | Paused Activity、前台 Service | 低 |
| Service(服务) | 后台工作 | 通过 startService() 启动的 Service | 中 |
| Cached(缓存) | 不需要 | Stopped Activity、无活跃组件 | 最高 |
低内存时,OOM Killer(Out-Of-Memory Killer)从 Cached 进程开始终止。AMS 不会直接杀 Activity,而是杀整个进程;被杀进程的 Activity 可能在 onStop() 后丢失(无 onDestroy() 调用)。从 Android 13 开始,Cached 进程 CPU 时间受限。
AMS 在进程管理中的作用
- 提升优先级:Activity 在 Resumed 状态时,将进程提升为 Foreground。
- 降级优先级:进入 Stopped 后,可能降为 Cached。
- 进程回收:AMS 监控内存,优先回收不活跃进程,确保前台流畅。
- 依赖管理:如 Service 绑定 Activity,会提升 Service 进程优先级。
如果进程被杀,AMS 可重启应用,但需通过 onSaveInstanceState() 保存状态。开发者应使用 JobService 或 WorkManager 处理后台任务,避免线程误用导致 ANR(Application Not Responding)。
AMS 协调 Activity 生命周期与进程管理的深度分析
AMS 是桥梁:它通过 ActivityRecord 跟踪 Activity 状态,并据此调整进程优先级。例如,启动新 Activity 时,AMS 先创建进程,然后调度生命周期回调;后台 Activity 进入 Stopped 后,AMS 可能回收进程以释放内存。这确保了系统稳定性,但要求开发者处理状态丢失(如使用 Room 或 SharedPreferences 持久化数据)。
在多用户或多窗口场景中,AMS 扩展支持(如 Magic Multi-User),进一步优化进程隔离。 总体上,AMS 的设计体现了 Android 的资源导向哲学:优先用户体验,动态管理生命周期与进程。