Android Activity启动流程详解
创作时间:
作者:
@小白创作中心
Android Activity启动流程详解
引用
CSDN
1.
https://blog.csdn.net/weijiangbc0/article/details/145950263
Android Activity的启动流程是系统中涉及多个组件协作的核心机制,从用户调用
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逻辑实现特殊需求(如插件化、多任务管理)。
本文原文来自CSDN,作者weijiangbc0。
热门推荐
老子智慧:职场人必备的生存之道
中国动画电影产业深度分析:市场规模近80亿,头部企业引领发展
以后可以直接从广州市区坐车到香港国际机场
猫头鹰当宠物?违法还危险!
猫头鹰:夜间霸主的狩猎秘技
地球守护者行动:为猫头鹰打造安全家园
餐品仓模式:优化餐饮供应链管理
品牌营销新策略,提升品牌价值,赢得市场认可
秋冬必吃!清蒸鲈鱼的最佳食材选择
清蒸鲈鱼:孩子的补脑神器,从选购到烹饪全攻略
猕猴桃配柑橘,舌尖伤口快愈合!
专家支招:舌头咬伤后的正确处理方法
银行卡和预付卡的分类及使用指南
黄石公园超级火山:64万年后的沉寂与监测
本命年2024年忌讳什么属相?什么颜色?
私家车被小区内绿化树砸坏,责任到底该谁来承担?
营山县十大特产
历下公安教你如何辨别涉警网络谣言
探访新西兰陶波火山:冒险家的乐园!
新西兰陶波火山喷发,环境影响几何?
春节回家,用心理学轻松应对亲戚挑战
快餐店要怎样做才会生意好起来?有哪些实用的经营策略
何罗鱼:《山海经》中的神秘神兽
山海世庐 | 《山海经》中的何罗之鱼是怎样的?
新年带TA去私人影院,甜蜜约会不打烊!
2025春节档电影市场爆发:《哪吒2》领跑,影院成消费新引擎
全民K歌上传本地伴奏攻略:电脑端和手机端两种方式详解
小满时节必吃的爽脆美味:手撕包菜制作攻略
甘蓝成减肥新宠?手撕包菜营养大揭秘!
如何查询手机号码的三种简便方法:手机自带功能、拨打运营商电话、第三方AP