当前位置: 首页 > article >正文

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

    1. 权限验证:检查调用方是否有权限启动目标 Activity。

    2. 解析 Intent

      • 根据 Intent 中的 ComponentName 解析目标 Activity 信息。

      • 若未显式指定类名,通过 PackageManagerService 匹配隐式 Intent。

    3. 任务栈(Task Stack)管理

      • 根据目标 Activity 的 launchMode(如 standardsingleTop)决定是否复用现有实例或创建新任务栈。

      • 例如:singleTask 会清除目标 Activity 上方的其他 Activity。

    4. 进程检查

      • 若目标 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() 完成后,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:管理视图树的三大流程:

    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 逻辑实现特殊需求(如插件化、多任务管理)。


http://www.kler.cn/a/567846.html

相关文章:

  • yunedit-post ,api测试比postman更好
  • 使用tkinter有UI方式来拷贝Excel文件
  • 软件工程----4+1架构模型
  • C# .NET Core HttpClient 和 HttpWebRequest 使用
  • anythingLLM和deepseek4j和milvus组合建立RAG知识库
  • kubernetes 初学命令
  • PostgreSQL10 物理流复制实战:构建高可用数据库架构!
  • 建易WordPress
  • 基于PHP+MySQL校园新闻管理系统设计与实现
  • 如何在Windows环境下安装Docker
  • Mysql-如何理解事务?
  • Vue 3 状态管理实战:构建用户登录注册功能 - 掌握 Vuex 集中管理应用状态
  • I/O多路转接之select:定义、原理及应用场景
  • git rebase 和 merge的区别
  • sklearn中的决策树-分类树:泰坦尼克号生存预测
  • 全面了解机器学习:监督、无监督、半监督、深度和强化学习
  • 随身wifi wps是什么?(Wi-Fi Protected Setup)一种简化无线网络连接的技术,允许用户无需手动输入密码即可快速连接设备
  • 开源绝版经典小游戏合集
  • Spring Boot 项目中如何在 `pom.xml` 文件中引入本地 JAR 包
  • 【Python爬虫(100)】从当下到未来:Python爬虫技术的进阶之路