Android Activity启动流程详解
目录
Activity 启动流程详细解析
1. 应用层发起启动请求
1.1 调用 startActivity()
1.2 通过 Instrumentation 转发请求
2. 系统服务处理(AMS 阶段)
2.1 Binder IPC 通信
2.2 AMS 处理流程
2.3 跨进程回调 ApplicationThread
3. 目标进程初始化(ActivityThread 阶段)
3.1 进程创建(Zygote Fork)
3.2 初始化 ActivityThread
3.3 创建 Application 对象
4. 目标 Activity 的创建与生命周期
4.1 处理 AMS 的启动请求
4.2 创建 Activity 实例
4.3 生命周期回调
5. 界面渲染(WindowManager 与 View 系统)
5.1 视图树构建
5.2 视图测量、布局、绘制
5.3 同步到屏幕
6. 流程图解
7. 关键机制深度解析
7.1 Binder IPC 在启动流程中的作用
7.2 启动模式(LaunchMode)的影响
7.3 性能优化点
8. 总结
Activity 启动流程详细解析
Activity 的启动流程是 Android 系统中涉及多个组件协作的核心机制,从用户调用 startActivity()
到目标 Activity 完成界面渲染,整个过程分为 应用层请求、系统服务处理、进程管理、界面渲染 四个阶段,涉及 Binder IPC、AMS、Zygote、ActivityThread、WindowManager 等关键组件。以下是分步骤详细解析:
1. 应用层发起启动请求
1.1 调用 startActivity()
-
入口:通过
Activity.startActivity(Intent)
或Context.startActivity(Intent)
发起请求。 -
Intent 参数:
Intent intent = new Intent(this, TargetActivity.class); startActivity(intent);
-
关键操作:
-
Intent
封装目标 Activity 的类名、包名、启动模式(launchMode
)等信息。 -
调用
Instrumentation.execStartActivity()
(实际执行启动逻辑)。
-
1.2 通过 Instrumentation
转发请求
-
跨进程通信入口:
// Activity.java Instrumentation.ActivityResult ar = mInstrumentation.execStartActivity( this, mMainThread.getApplicationThread(), mToken, this, intent, requestCode, options);
-
作用:
Instrumentation
是系统监控应用与组件交互的“钩子”,负责将启动请求通过 Binder 传递给 AMS。
2. 系统服务处理(AMS 阶段)
2.1 Binder IPC 通信
-
客户端:应用进程通过
ActivityManagerProxy
(AMS 的 Binder 代理对象)发送请求。 -
服务端:请求到达
ActivityManagerService
(AMS),执行startActivity()
核心逻辑。
2.2 AMS 处理流程
-
步骤:
-
权限验证:检查调用方是否有权限启动目标 Activity。
-
解析 Intent:
-
根据
Intent
中的ComponentName
解析目标 Activity 信息。 -
若未显式指定类名,通过
PackageManagerService
匹配隐式 Intent。
-
-
任务栈(Task Stack)管理:
-
根据目标 Activity 的
launchMode
(如standard
、singleTop
)决定是否复用现有实例或创建新任务栈。 -
例如:
singleTask
会清除目标 Activity 上方的其他 Activity。
-
-
进程检查:
-
若目标 Activity 所属应用进程未启动,触发
Zygote
创建新进程。 -
若进程已存在,直接复用。
-
-
2.3 跨进程回调 ApplicationThread
-
Binder 回调:AMS 通过
IApplicationThread
接口(ActivityThread
的内部类)通知应用进程处理后续逻辑。 -
关键代码:
// AMS 通过 Binder 调用应用进程的 ApplicationThread.scheduleLaunchActivity() app.thread.scheduleLaunchActivity(intent, ...);
3. 目标进程初始化(ActivityThread 阶段)
3.1 进程创建(Zygote Fork)
-
触发条件:若目标应用进程未启动,AMS 通过
Zygote
进程 fork 新进程。 -
流程:
-
AMS 向
Zygote
发送 socket 请求。 -
Zygote
复制自身进程,生成新进程。 -
新进程执行
ActivityThread.main()
入口方法。
-
3.2 初始化 ActivityThread
-
主线程初始化:
// ActivityThread.java public static void main(String[] args) { Looper.prepareMainLooper(); ActivityThread thread = new ActivityThread(); thread.attach(false); // 绑定到 AMS Looper.loop(); }
-
绑定 AMS:
ActivityThread.attach()
通过 Binder 向 AMS 注册应用进程。
3.3 创建 Application
对象
-
触发:AMS 回调
bindApplication()
。 -
流程:
-
加载
Application
类(通过ClassLoader
)。 -
实例化
Application
并调用onCreate()
。 -
初始化
ContentProvider
(按优先级顺序)。
-
4. 目标 Activity 的创建与生命周期
4.1 处理 AMS 的启动请求
-
回调入口:
ApplicationThread.scheduleLaunchActivity()
。 -
封装参数:将 AMS 传递的数据封装为
ActivityClientRecord
。 -
发送消息:通过
Handler
将启动请求发送到主线程消息队列。
4.2 创建 Activity 实例
-
反射创建实例:
// ActivityThread.java java.lang.ClassLoader cl = appContext.getClassLoader(); Activity activity = mInstrumentation.newActivity(cl, component.getClassName(), intent);
-
关键对象:
-
ContextImpl
:Activity 的上下文环境,持有Resources
、PackageInfo
等。 -
Window
:每个 Activity 关联一个PhoneWindow
对象。
-
4.3 生命周期回调
-
顺序调用:
-
onCreate()
:初始化界面(setContentView()
)。 -
onStart()
:Activity 可见但未聚焦。 -
onResume()
:Activity 进入前台并获取焦点。
-
-
触发界面渲染:
onResume()
完成后,WindowManager
将DecorView
添加到屏幕。
5. 界面渲染(WindowManager 与 View 系统)
5.1 视图树构建
-
setContentView()
:// Activity.java public void setContentView(@LayoutRes int layoutResID) { getWindow().setContentView(layoutResID); initWindowDecorActionBar(); }
-
PhoneWindow
创建DecorView
并加载布局文件。
-
5.2 视图测量、布局、绘制
-
ViewRootImpl
:管理视图树的三大流程:-
measure()
:计算 View 的尺寸。 -
layout()
:确定 View 的位置。 -
draw()
:将 View 绘制到屏幕上。
-
5.3 同步到屏幕
-
WindowManager.addView()
:// WindowManagerGlobal.java ViewRootImpl root = new ViewRootImpl(view.getContext(), display); root.setView(view, wparams, panelParentView);
-
ViewRootImpl
通过Choreographer
监听垂直同步信号(VSync),触发界面刷新。
-
6. 流程图解
用户调用 startActivity()
│
↓
Instrumentation.execStartActivity()
│
↓ (Binder IPC)
AMS.startActivity()
│
↓
AMS 解析 Intent、检查权限、管理任务栈
│
↓
目标进程是否存在? ── 否 → Zygote fork 新进程
│
↓
AMS 通过 ApplicationThread 回调目标进程
│
↓ (Handler 消息机制)
ActivityThread.handleLaunchActivity()
│
↓
创建 Activity 实例 → onCreate() → onStart() → onResume()
│
↓
WindowManager 添加 DecorView
│
↓
ViewRootImpl 触发 measure/layout/draw
│
↓
界面显示到屏幕
7. 关键机制深度解析
7.1 Binder IPC 在启动流程中的作用
-
客户端:应用进程通过
ActivityManagerProxy
发送请求。 -
服务端:AMS 运行在
system_server
进程,通过Binder
线程池处理请求。 -
跨进程回调:AMS 通过
IApplicationThread
接口回调应用进程。
7.2 启动模式(LaunchMode)的影响
-
standard:默认模式,每次启动新实例。
-
singleTop:栈顶复用,触发
onNewIntent()
。 -
singleTask:栈内复用,清除上方 Activity。
-
singleInstance:独占任务栈,全局唯一实例。
7.3 性能优化点
-
冷启动优化:减少
Application.onCreate()
和首屏 Activity 的初始化耗时。 -
延迟加载:将非关键操作移至
onResume()
之后或子线程。 -
主题预加载:使用
windowBackground
避免白屏。
8. 总结
Activity 的启动流程是 Android 系统设计的核心体现,涵盖 IPC 通信、进程管理、组件生命周期、界面渲染 等多个维度。理解此流程有助于:
-
性能调优:定位启动耗时瓶颈。
-
问题排查:分析 ANR、界面卡顿等问题的根因。
-
系统定制:修改 AMS 或 ActivityThread 逻辑实现特殊需求(如插件化、多任务管理)。