详细时序图
🔍 一、概述:Activity启动流程的三个阶段
整个过程可概括为以下三个阶段,涉及应用进程与系统进程的多次交互:
-
应用进程发起请求
调用
Context.startActivity(),经Instrumentation和ActivityTaskManager服务(ATMS)向系统进程发起请求。 -
系统进程处理调度
ActivityTaskManagerService协调ActivityStack、Task等组件,处理启动模式、任务栈,并通知目标进程。 -
回到应用进程完成创建
通过
ActivityThread和Instrumentation创建 Activity 实例,执行生命周期回调,完成视图的测量、布局、绘制。
🧩 二、详细流程解析
阶段1:应用进程内发起启动请求
入口:Context.startActivity()→ Activity.startActivity()
-
Instrumentation 介入
Activity.startActivityForResult()会调用Instrumentation.execStartActivity()。作用:
Instrumentation是监控应用与系统交互的工具类,在此处会记录启动信息,用于测试等场景。 -
通过 Binder 跨进程调用 ATMS
Instrumentation通过ActivityTaskManager.getService()获取IActivityTaskManagerBinder 代理对象,调用其startActivity()方法。关键跨越:此时调用从应用进程进入系统进程 (
system_server)。
阶段2:系统进程调度与处理
核心系统服务:ActivityTaskManagerService(ATMS)
-
ATMS 接收请求
ActivityTaskManagerService.startActivity()被调用,开始处理启动逻辑。 -
解析 Intent 与 ActivityInfo
通过
ActivityStarter类解析 Intent,获取目标 Activity 信息(包名、类名、启动模式等)。关键检查:权限验证、Export 属性、URI 授权等。
-
任务栈(Task)与启动模式处理
- 查找或创建合适的
ActivityStack(前台栈、后台栈)。 - 根据
launchMode(standard、singleTop、singleTask、singleInstance)决定是否复用现有 Activity 实例,或创建新实例。 - 处理
Intent.FLAG_ACTIVITY_*标志位(如NEW_TASK、CLEAR_TOP)。
- 查找或创建合适的
-
进程判断与处理
- 如果目标 Activity 所在进程已存在,则直接复用该进程。
- 如果不存在,则通过
Process.start()请求 Zygote 孵化新进程(此时会触发应用冷启动)。
-
暂停当前 Activity
如果需要启动新 Activity,ATMS 会先暂停当前前台的 Activity(调用
onPause()),保证生命周期有序。 -
跨进程通知目标进程
通过
IApplicationThreadBinder 接口(即ApplicationThread在系统侧的代理),调用scheduleLaunchActivity()方法,将启动请求发送回目标应用进程。
阶段3:回到应用进程完成初始化
核心类:ActivityThread、Instrumentation
-
ActivityThread 接收请求
ApplicationThread.scheduleLaunchActivity()将启动信息封装为ActivityClientRecord,通过Handler发送到主线程消息队列。 -
处理启动事务
ActivityThread.handleLaunchActivity()被调用,依次执行:- 创建 Activity 实例:
Instrumentation.newActivity()通过类加载器创建目标 Activity 对象。 - 创建 ContextImpl:为 Activity 创建上下文环境,包括资源、主题等。
- 关联 Context 与 Activity:
Activity.attach()调用,关联ContextImpl、Window等。 - 调用 onCreate() :
Instrumentation.callActivityOnCreate()→Activity.performCreate()→onCreate()。
- 创建 Activity 实例:
-
界面初始化与显示
- 视图创建:在
onCreate()中调用setContentView(),会创建PhoneWindow和DecorView。 - 生命周期继续:
onStart()、onResume()被调用。 - 视图绘制:在
onResume()后,ViewRootImpl开始处理视图的测量、布局、绘制流程,并通过Choreographer同步 VSYNC 信号,最终将画面提交给 SurfaceFlinger 显示。
- 视图创建:在
📦 三、关键类与组件说明
| 类/组件 | 所属进程 | 作用 |
|---|---|---|
Instrumentation | 应用进程 | 监控应用与系统的交互,负责创建 Activity 实例并调用生命周期方法。 |
ActivityThread | 应用进程 | 应用主线程的管理者,接收系统调用并处理 Activity 生命周期事务。 |
ApplicationThread | 应用进程 | ActivityThread的内部类,作为 Binder 服务端供 ATMS 回调。 |
ActivityTaskManagerService(ATMS) | 系统进程 | Activity 调度的核心服务,管理任务栈、进程和生命周期状态。 |
ActivityStarter | 系统进程 | 处理启动参数、验证、栈管理,是 ATMS 的启动逻辑执行单元。 |
ActivityStack/ Task | 系统进程 | 管理 Activity 的回退栈,一个 Task 通常对应一个用户任务。 |
WindowManagerService(WMS) | 系统进程 | 管理窗口的显示顺序、动画、输入事件等。 |
⚙ 四、开发中的常见问题与调试技巧
-
启动慢(冷启动耗时)
- 优化
Application.attachBaseContext()和onCreate()中的逻辑。 - 避免在主线程进行耗时操作。
- 优化
-
启动模式不生效
- 检查
AndroidManifest中 Activity 的launchMode与代码中Intent所设 Flag 是否冲突。 - 通过
adb shell dumpsys activity activities查看当前任务栈。
- 检查
-
生命周期顺序异常
- 使用
adb shell am start-activity -S -W跟踪启动耗时与状态。 - 在
Instrumentation或ActivityThread中添加日志,观察系统回调顺序。
- 使用
📚 五、最新源码适配说明
- 自 Android 10 起,
ActivityManagerService(AMS) 中与 Activity 调度相关的功能被拆分为ActivityTaskManagerService(ATMS) ,负责管理 Task 与 Stack。 ActivityRecord、TaskRecord等类在最新源码中命名或结构可能微调,但核心逻辑不变。- 建议结合 AOSP 源码中
services/core/java/com/android/server/wm/与core/java/android/app/包进行深入阅读。
✅ 总结
Activity 启动流程是一个典型的跨进程协作过程,涉及应用进程、系统进程及可能的 Zygote 进程。理解此流程有助于:
- 优化启动性能
- 处理复杂的导航场景
- 调试生命周期相关问题
- 更好地理解 Android 系统架构
以上流程已基于 Android 13 源码梳理,核心路径在近期版本中保持稳定,可放心用于开发与面试准备。
如果需要进一步了解某个具体环节(如启动模式处理、视图绘制链路等),可继续深入查阅对应模块的源码及官方文档。