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。
热门推荐
吃荞麦面不健康?真相来了
石雕龟驮碑和龟背石碑有什么不同
温度过高爆燃!电动汽车充电千万注意
别墅装修案例分享:如何用极简风,诠释别墅的高级质感?
线下消费回潮、宠物店要着手做好的8件事
中国广电曾庆军:5G NR广播已在京沪皖琼开展现网试点,有望明年全国大范围覆盖
海南道教信仰全解析:主要神祇与文化特色概述
小众但惊喜!这几款Switch冷门精品游戏你可能还没有玩过
“藏粮于技”的广东实践:科技助力盐碱地大米“拼”上餐桌
Netflix揭秘《百年孤独》剧集制作,马孔多奇幻传奇即将上线
靠生酮饮食减肥,起效关键因素找到了!《细胞》:有了它,或许就不用放弃美食了
拥抱温暖冬日:自制健康热饮推荐与详尽做法
为什么一出门旅游就便秘?
我国最强的三所「双非」院校,位列全国40强!实力赶超211,直追985!
磷脂酰丝氨酸是如何提高脑力的?
日柱元男:八字命理学中的财富密码
土星落在狮子座的性格特质
《逃离塔科夫》配置需求及优化方案
《道德经》真的不提努力吗?老子的高级生活智慧,颠覆你的认知!
锦州的美食有哪些?快来看看
2025年最受欢迎的模拟飞机游戏推荐
TTL的多重含义:电子工程、网络技术与数据库管理中的重要性解析
属狗2025年结婚运势及化解方法 女性的婚配与化解之道
鸿蒙与安卓:较量与未来
十亿投资,口碑扑街?《蛟龙行动》:春节档的意外与反思
国内外光伏发电并网技术的发展现状及未来发展趋势
服务器性能调优与负载均衡策略详解
经典心理学:羊群效应
恋爱中谎话连篇的男人的特点与影响
怎么缓解手汗症