问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

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处理流程

  • 步骤
    1. 权限验证:检查调用方是否有权限启动目标Activity。
    2. 解析Intent
  • 根据Intent中的ComponentName解析目标Activity信息。
  • 若未显式指定类名,通过PackageManagerService匹配隐式Intent。
    1. 任务栈(Task Stack)管理
  • 根据目标Activity的launchMode(如standardsingleTop)决定是否复用现有实例或创建新任务栈。
  • 例如:singleTask会清除目标Activity上方的其他Activity。
    1. 进程检查
  • 若目标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新进程。
  • 流程
    1. AMS向Zygote发送socket请求。
    2. Zygote复制自身进程,生成新进程。
    3. 新进程执行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();
}
  • 绑定AMSActivityThread.attach()通过Binder向AMS注册应用进程。

3.3 创建Application对象

  • 触发:AMS回调bindApplication()
  • 流程
    1. 加载Application类(通过ClassLoader)。
    2. 实例化Application并调用onCreate()
    3. 初始化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的上下文环境,持有ResourcesPackageInfo等。
  • Window:每个Activity关联一个PhoneWindow对象。

4.3 生命周期回调

  • 顺序调用
    1. onCreate():初始化界面(setContentView())。
    2. onStart():Activity可见但未聚焦。
    3. onResume():Activity进入前台并获取焦点。
  • 触发界面渲染onResume()完成后,WindowManagerDecorView添加到屏幕。

5. 界面渲染(WindowManager与View系统)

5.1 视图树构建

  • setContentView()
// Activity.java
public void setContentView(@LayoutRes int layoutResID) {
    getWindow().setContentView(layoutResID);
    initWindowDecorActionBar();
}
  • **PhoneWindow**创建DecorView并加载布局文件。

5.2 视图测量、布局、绘制

  • ViewRootImpl:管理视图树的三大流程:
    1. measure():计算View的尺寸。
    2. layout():确定View的位置。
    3. 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。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号