Android Activity 启动流程是一个涉及 应用进程、系统服务、Binder IPC 通信 的复杂过程。以下是简化的核心步骤:
一、应用进程内启动(同一进程)
1. 调用 startActivity()
java
// 用户代码
startActivity(new Intent(this, TargetActivity.class));
// 实际调用链
startActivity() → startActivityForResult()
→ Instrumentation.execStartActivity()
2. 通过 Binder 通知 AMS
- Instrumentation 通过 Binder 调用 ActivityManagerService(AMS) 的
startActivity() - 当前 Activity 的
onPause()被调用
二、系统服务处理阶段
3. AMS 处理流程
java
// AMS 主要逻辑
ActivityManagerService.startActivity()
→ ActivityStarter.startActivityMayWait()
→ ActivityStarter.startActivity()
→ ActivityStarter.startActivityUnchecked()
AMS 主要工作:
- 解析 Intent(匹配 Activity)
- 权限检查
- 进程检查(目标 Activity 所在进程是否存在)
- 创建/复用任务栈(Task)
- 决定启动模式(standard、singleTop、singleTask、singleInstance)
4. 处理目标进程
- 情况A :目标 Activity 所在进程已存在
- 直接重用进程
- 情况B :进程不存在
- AMS 通过 Socket 通知 Zygote 进程 fork 新进程
- 新进程启动后,执行
ActivityThread.main()
三、目标进程初始化
5. 新进程初始化
java
// ActivityThread.main()
public static void main(String[] args) {
Looper.prepareMainLooper(); // 创建主线程Looper
ActivityThread thread = new ActivityThread();
thread.attach(false); // 绑定到AMS
Looper.loop();
}
6. 绑定到 AMS
ActivityThread.attach()通过 Binder 调用AMS.attachApplication()- AMS 发送 LAUNCH_ACTIVITY 事务给目标进程
四、Activity 实例化与生命周期
7. 处理启动事务
java
// ActivityThread 处理消息
class H extends Handler {
public void handleMessage(Message msg) {
case LAUNCH_ACTIVITY:
handleLaunchActivity(r);
break;
}
}
private void handleLaunchActivity(ActivityClientRecord r) {
// 1. 创建 Activity 实例
Activity activity = mInstrumentation.newActivity(
cl, component.getClassName(), r.intent);
// 2. 创建 Application(如果未创建)
Application app = r.packageInfo.makeApplication(false, mInstrumentation);
// 3. 调用 attach()
activity.attach(appContext, this, ...);
// 4. 调用生命周期
mInstrumentation.callActivityOnCreate(activity, r.state);
// → activity.onCreate()
handleResumeActivity(); // → onStart() → onResume()
}
8. 完整生命周期调用
scss
1. 目标进程:onCreate()
2. 目标进程:onStart()
3. 目标进程:onResume()
4. 原Activity(如果存在):onPause() → onStop()
五、关键组件角色
| 组件 | 职责 |
|---|---|
| ActivityManagerService(AMS) | 系统服务,统一调度所有 Activity |
| ActivityThread | 应用主线程,每个进程一个实例 |
| Instrumentation | 监控应用与系统的交互 |
| ApplicationThread | Binder 代理,AMS 与应用进程通信桥梁 |
| ActivityStarter | Android 7.0+,处理启动逻辑 |
| ActivityStack | 管理 Activity 回退栈 |
六、启动模式处理差异
Standard 模式
- 每次启动创建新实例
SingleTop 模式
- 检查栈顶是否为该 Activity
- 如果是,调用
onNewIntent()而非新建
SingleTask 模式
- 检查任务栈中是否已存在
- 清除其上的所有 Activity
- 调用
onNewIntent()
SingleInstance 模式
- 独占一个任务栈
七、性能优化相关
1. 启动耗时监控
java
// 开发者模式查看
adb shell am start -W packagename/activityname
// 输出结果
TotalTime: 启动总耗时
WaitTime: AMS处理耗时
2. 启动优化策略
- 冷启动:进程不存在,最慢
- 温启动:进程存在,Activity 被销毁
- 热启动:Activity 在栈中,最快
八、流程图示意
scss
应用进程 startActivity()
↓
Binder IPC 到 AMS
↓
AMS 检查权限、进程、启动模式
↓
目标进程存在? → 否 → Zygote fork 新进程
↓是
AMS 发送启动事务
↓
目标进程处理事务
↓
创建 Activity → attach() → 生命周期
↓
WindowManager 添加视图
↓
用户看到界面
注意事项
- Android 10+ 引入
ActivityTaskManagerService(ATMS)分担 AMS 工作 - Binder 调用 涉及进程间通信,是性能瓶颈之一
- 主线程操作:Activity 创建和生命周期回调都在主线程执行
理解整个流程有助于:
- 优化应用启动速度
- 处理复杂的页面跳转逻辑
- 解决 Activity 启动相关的异常问题