Activity 启动流程

在 Android 系统中,Activity 的启动流程是一个复杂且涉及多个系统组件的过程。以下是一个详细的、逐步的解析,从用户点击图标到 Activity 展示在屏幕上的完整过程。

Activity 启动流程

  1. 用户点击应用图标

    • 用户在 Launcher 上点击应用图标,这会触发 Launcher 应用的点击事件处理逻辑。
  2. Launcher 发起启动请求

    • Launcher 调用 startActivity() 方法,发送一个 Intent 来启动应用的 MainActivity
    • startActivity() 调用会传递到 Activity.startActivityForResult()
  3. ActivityManagerService 接收请求

    • 通过 Binder 机制,启动请求传递到系统服务 ActivityManagerService(AMS)。
    • AMSstartActivity() 方法会被调用,这个方法会进行一系列的处理和检查,包括权限验证和任务栈管理。
  4. ActivityStackSupervisor

    • AMS 内部调用 ActivityStackSupervisor 来管理 Activity 栈,并确定启动模式(如标准模式、单例模式等)。
    • ActivityStackSupervisor 会检查当前是否存在可重用的 Activity 或者是否需要创建新的 Activity 实例。
  5. 创建或重用 Activity 实例

    • 如果需要创建新的 Activity 实例,AMS 会调用 startProcessLocked() 方法,启动目标应用进程。
    • 如果目标应用进程已经在运行,则直接使用该进程来启动新的 Activity。
  6. 启动应用进程

    • 如果目标应用进程还未启动,AMS 会通过 Zygote 进程来孵化新的应用进程。
    • Zygote 进程是一个孵化器进程,它通过 fork() 系统调用创建新的应用进程,这个过程非常高效。
  7. 应用进程准备启动 Activity

    • 在新创建的应用进程中,ActivityThread 是负责管理 Activity 生命周期的主要类。
    • ActivityThreadmain() 方法会初始化主线程的 LooperHandler,并进入消息循环。
  8. ActivityThread 与 AMS 通信

    • AMS 会通过 Binder 调用 ApplicationThreadscheduleLaunchActivity() 方法。
    • ApplicationThreadActivityThread 的内部类,它通过 IPC 与 AMS 通信。
  9. ActivityThread 处理启动请求

    • ActivityThread 收到 scheduleLaunchActivity() 请求后,会将启动消息发送给内部的 H Handler。
    • H Handler 处理 LAUNCH_ACTIVITY 消息,调用 performLaunchActivity() 方法。
  10. 创建 Activity 实例

    • performLaunchActivity() 方法通过反射机制创建 Activity 实例,并调用 attach() 方法将其绑定到 ContextImpl 上。
    • 调用 Activity 的生命周期方法:onCreate()onStart()onResume()
  11. 显示 Activity 界面

    • onResume() 方法之后,Activity 的界面会通过 WindowManager 展示到屏幕上。
    • Activity 的根视图 DecorView 会被添加到 WindowManager,完成整个界面的渲染。

流程图示意

1. 用户点击应用图标
     ↓
2. Launcher 调用 startActivity()
     ↓
3. 通过 Binder 机制调用 AMS 的 startActivity()
     ↓
4. AMS 调用 ActivityStackSupervisor 进行任务栈管理
     ↓
5. 检查是否重用现有 Activity 或创建新实例
     ↓
6. 启动应用进程(若未运行),通过 Zygote fork 新进程
     ↓
7. 应用进程启动 ActivityThread,进入消息循环
     ↓
8. AMS 通过 ApplicationThread 调用 scheduleLaunchActivity()
     ↓
9. ActivityThread 处理 LAUNCH_ACTIVITY 消息
     ↓
10. 创建 Activity 实例并调用生命周期方法(onCreate, onStart, onResume)
     ↓
11. Activity 界面通过 WindowManager 显示到屏幕上

关键点总结

  • Binder 通信:AMS 与应用进程通过 Binder 实现 IPC 通信。
  • Zygote 进程:负责高效地创建应用进程。
  • ActivityThread:管理应用进程内的主线程和 Activity 生命周期。
  • ActivityStackSupervisor:管理任务栈和 Activity 启动模式。
  • WindowManager:负责将 Activity 的界面显示到屏幕上。

通过上述步骤,Android 系统高效地管理和启动 Activity,使得用户点击应用图标后的体验流畅而迅速。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值