3.3 KiB
3.3 KiB
AMS原理
目录
AMS架构
AMS 简介
// AMS:Activity Manager Service
// 管理 Activity、Service、BroadcastReceiver 等组件
// 系统服务,运行在 system_server 进程
AMS 职责
// 1. Activity 生命周期管理
// 2. Service 生命周期管理
// 3. BroadcastReceiver 管理
// 4. 进程管理
// 5. 任务栈管理
Activity启动流程
启动流程
1. startActivity()
2. ActivityManagerService.startActivity()
3. ActivityStackSupervisor.startActivityLocked()
4. ActivityStack.startActivityLocked()
5. ActivityStack.resumeTopActivityLocked()
6. ActivityStackSupervisor.realStartActivityLocked()
7. ApplicationThread.scheduleLaunchActivity()
8. ActivityThread.handleLaunchActivity()
9. Activity.onCreate()
关键步骤
// 1. 检查权限和 Intent
// 2. 创建 ActivityRecord
// 3. 检查目标进程是否存在
// 4. 如果不存在,启动进程
// 5. 发送启动消息到目标进程
// 6. 目标进程创建 Activity
Service启动流程
启动流程
1. startService()
2. ActivityManagerService.startService()
3. ActiveServices.startServiceLocked()
4. ActiveServices.bringUpServiceLocked()
5. ApplicationThread.scheduleCreateService()
6. ActivityThread.handleCreateService()
7. Service.onCreate()
绑定流程
1. bindService()
2. ActivityManagerService.bindService()
3. ActiveServices.requestServiceBindingLocked()
4. ApplicationThread.scheduleBindService()
5. ActivityThread.handleBindService()
6. Service.onBind()
BroadcastReceiver流程
注册流程
1. registerReceiver()
2. ActivityManagerService.registerReceiver()
3. 保存到 ReceiverList
发送流程
1. sendBroadcast()
2. ActivityManagerService.broadcastIntent()
3. 查找匹配的 Receiver
4. 发送到目标进程
5. ApplicationThread.scheduleReceiver()
6. ActivityThread.handleReceiver()
7. BroadcastReceiver.onReceive()
AMS源码分析
关键类
// ActivityManagerService:AMS 主类
// ActivityStack:Activity 栈
// ActivityStackSupervisor:栈管理器
// ProcessRecord:进程记录
// ActivityRecord:Activity 记录
关键方法
// startActivity():启动 Activity
// startService():启动 Service
// broadcastIntent():发送广播
// getRunningAppProcesses():获取运行进程
面试常见问题
Q1: AMS 的作用?
答案:
- 管理 Activity、Service、BroadcastReceiver
- 管理进程和任务栈
- 系统核心服务
Q2: Activity 启动流程?
答案:
- startActivity()
- AMS.startActivity()
- 检查权限和 Intent
- 创建或复用进程
- 发送启动消息
- ActivityThread 创建 Activity
Q3: Service 启动流程?
答案:
- startService()
- AMS.startService()
- 检查进程是否存在
- 启动进程(如需要)
- 创建 Service
- 调用 onCreate()
Q4: BroadcastReceiver 流程?
答案:
- 注册:registerReceiver()
- 发送:sendBroadcast()
- AMS 查找匹配的 Receiver
- 发送到目标进程
- 调用 onReceive()
最后更新:2024年