Activity启动流程

37 阅读4分钟

详细时序图

whiteboard_exported_image-2.png

🔍 一、概述:Activity启动流程的三个阶段

整个过程可概括为以下三个阶段,涉及应用进程系统进程的多次交互:

  1. 应用进程发起请求

    调用 Context.startActivity(),经 Instrumentation和 ActivityTaskManager服务(ATMS)向系统进程发起请求。

  2. 系统进程处理调度

    ActivityTaskManagerService协调 ActivityStackTask等组件,处理启动模式、任务栈,并通知目标进程。

  3. 回到应用进程完成创建

    通过 ActivityThread和 Instrumentation创建 Activity 实例,执行生命周期回调,完成视图的测量、布局、绘制。


🧩 二、详细流程解析

阶段1:应用进程内发起启动请求

入口Context.startActivity()→ Activity.startActivity()

  1. Instrumentation 介入

    Activity.startActivityForResult()会调用 Instrumentation.execStartActivity()

    作用Instrumentation是监控应用与系统交互的工具类,在此处会记录启动信息,用于测试等场景。

  2. 通过 Binder 跨进程调用 ATMS

    Instrumentation通过 ActivityTaskManager.getService()获取 IActivityTaskManagerBinder 代理对象,调用其 startActivity()方法。

    关键跨越:此时调用从应用进程进入系统进程 (system_server)。


阶段2:系统进程调度与处理

核心系统服务ActivityTaskManagerService(ATMS)

  1. ATMS 接收请求

    ActivityTaskManagerService.startActivity()被调用,开始处理启动逻辑。

  2. 解析 Intent 与 ActivityInfo

    通过 ActivityStarter类解析 Intent,获取目标 Activity 信息(包名、类名、启动模式等)。

    关键检查:权限验证、Export 属性、URI 授权等。

  3. 任务栈(Task)与启动模式处理

    • 查找或创建合适的 ActivityStack(前台栈、后台栈)。
    • 根据 launchMode(standard、singleTop、singleTask、singleInstance)决定是否复用现有 Activity 实例,或创建新实例。
    • 处理 Intent.FLAG_ACTIVITY_*标志位(如 NEW_TASKCLEAR_TOP)。
  4. 进程判断与处理

    • 如果目标 Activity 所在进程已存在,则直接复用该进程。
    • 如果不存在,则通过 Process.start()请求 Zygote 孵化新进程(此时会触发应用冷启动)。
  5. 暂停当前 Activity

    如果需要启动新 Activity,ATMS 会先暂停当前前台的 Activity(调用 onPause()),保证生命周期有序。

  6. 跨进程通知目标进程

    通过 IApplicationThreadBinder 接口(即 ApplicationThread在系统侧的代理),调用 scheduleLaunchActivity()方法,将启动请求发送回目标应用进程。


阶段3:回到应用进程完成初始化

核心类ActivityThreadInstrumentation

  1. ActivityThread 接收请求

    ApplicationThread.scheduleLaunchActivity()将启动信息封装为 ActivityClientRecord,通过 Handler发送到主线程消息队列。

  2. 处理启动事务

    ActivityThread.handleLaunchActivity()被调用,依次执行:

    • 创建 Activity 实例Instrumentation.newActivity()通过类加载器创建目标 Activity 对象。
    • 创建 ContextImpl:为 Activity 创建上下文环境,包括资源、主题等。
    • 关联 Context 与 ActivityActivity.attach()调用,关联 ContextImplWindow等。
    • 调用 onCreate()Instrumentation.callActivityOnCreate()→ Activity.performCreate()→ onCreate()
  3. 界面初始化与显示

    • 视图创建:在 onCreate()中调用 setContentView(),会创建 PhoneWindow和 DecorView
    • 生命周期继续onStart()onResume()被调用。
    • 视图绘制:在 onResume()后,ViewRootImpl开始处理视图的测量、布局、绘制流程,并通过 Choreographer同步 VSYNC 信号,最终将画面提交给 SurfaceFlinger 显示。

📦 三、关键类与组件说明

类/组件所属进程作用
Instrumentation应用进程监控应用与系统的交互,负责创建 Activity 实例并调用生命周期方法。
ActivityThread应用进程应用主线程的管理者,接收系统调用并处理 Activity 生命周期事务。
ApplicationThread应用进程ActivityThread的内部类,作为 Binder 服务端供 ATMS 回调。
ActivityTaskManagerService(ATMS)系统进程Activity 调度的核心服务,管理任务栈、进程和生命周期状态。
ActivityStarter系统进程处理启动参数、验证、栈管理,是 ATMS 的启动逻辑执行单元。
ActivityStackTask系统进程管理 Activity 的回退栈,一个 Task 通常对应一个用户任务。
WindowManagerService(WMS)系统进程管理窗口的显示顺序、动画、输入事件等。

⚙ 四、开发中的常见问题与调试技巧

  1. 启动慢(冷启动耗时)

    • 优化 Application.attachBaseContext()和 onCreate()中的逻辑。
    • 避免在主线程进行耗时操作。
  2. 启动模式不生效

    • 检查 AndroidManifest中 Activity 的 launchMode与代码中 Intent所设 Flag 是否冲突。
    • 通过 adb shell dumpsys activity activities查看当前任务栈。
  3. 生命周期顺序异常

    • 使用 adb shell am start-activity -S -W跟踪启动耗时与状态。
    • 在 Instrumentation或 ActivityThread中添加日志,观察系统回调顺序。

📚 五、最新源码适配说明

  • 自 Android 10 起,ActivityManagerService(AMS) 中与 Activity 调度相关的功能被拆分为 ActivityTaskManagerService(ATMS) ,负责管理 Task 与 Stack。
  • ActivityRecordTaskRecord等类在最新源码中命名或结构可能微调,但核心逻辑不变。
  • 建议结合 AOSP 源码中 services/core/java/com/android/server/wm/与 core/java/android/app/包进行深入阅读。

✅ 总结

Activity 启动流程是一个典型的跨进程协作过程,涉及应用进程、系统进程及可能的 Zygote 进程。理解此流程有助于:

  • 优化启动性能
  • 处理复杂的导航场景
  • 调试生命周期相关问题
  • 更好地理解 Android 系统架构

以上流程已基于 Android 13 源码梳理,核心路径在近期版本中保持稳定,可放心用于开发与面试准备。

如果需要进一步了解某个具体环节(如启动模式处理、视图绘制链路等),可继续深入查阅对应模块的源码及官方文档。