Android 系统中 Activity 启动流程

[复制链接]
查看898 | 回复0 | 2025-1-7 11:31:46 | 显示全部楼层 |阅读模式

立即注册,突破游客限制,与技术大牛交流切磋,畅享海量资源,让你的技术之路不再孤单!

您需要 登录 才可以下载或查看,没有账号?立即注册

×

截图202501071132074428.png
流程分解1. Launcher 进程发起启动请求
  • 步骤 1:发送 startActivity 请求
    • Launcher 进程(负责显示应用列表的桌面应用)通过 ActivityManagerProxy 调用 startActivity。
    • ActivityManagerProxy 是 ActivityManagerService (AMS) 的代理,通过 Binder 机制 与 AMS 通信。

2. system_server 进程处理启动请求
  • 步骤 2:ActivityManagerService 接收请求
    • 在 system_server 进程中,ActivityManagerService (AMS) 接收来自 Launcher 的 startActivity 请求。
    • AMS 检查请求内容,确定需要启动的应用是否已经存在对应的进程。
  • 步骤 3:如果没有对应进程,创建新进程
    • 如果目标应用进程尚未运行,AMS 通过 Zygote 进程 创建新的应用进程:
      • 向 Zygote 发送创建进程的请求(通过 Socket 机制)。
      • Zygote 是 Android 的进程孵化器,负责 fork 一个新的进程。
      • 新的应用进程启动后,回调 ApplicationThread。

3. 新进程附加到系统服务
  • 步骤 4:发送 attachApplication 请求
    • system_server 进程中的 ActivityManagerService 向新创建的应用进程发送 attachApplication 请求(通过 Binder 机制)。
    • 目的是将新进程与 AMS 绑定,建立通信。

4. 启动目标 Activity
  • 步骤 5:调用 realStartActivityLocked
    • 在 system_server 进程中,AMS 确认应用进程已准备就绪后,调用 realStartActivityLocked 方法。
    • 通过 ApplicationThreadProxy,向目标应用进程发送启动 Activity 的请求。
  • 步骤 6:发送 scheduleLaunchActivity
    • AMS 向目标应用的 ApplicationThread 发送 scheduleLaunchActivity 请求(通过 Binder 机制)。
    • 该请求包含要启动的 Activity 的详细信息。
  • 步骤 7:ApplicationThread 处理启动请求
    • 应用进程中的 ApplicationThread 收到 scheduleLaunchActivity 请求后,将任务转交给 ActivityThread。
    • ActivityThread 是应用主线程,负责调度 UI 和 Activity 生命周期。

5. Activity 生命周期回调
  • 步骤 8:调用 handleLaunchActivity
    • ActivityThread 处理 LAUNCH_ACTIVITY 消息,初始化目标 Activity,并调用它的生命周期方法。
    • 执行 Activity.onCreate(),完成 Activity 的启动。

关键通信机制
  • Binder 方式(红色箭头):
    • 用于进程间通信(IPC),连接 Launcher、system_server 和应用进程。
  • Socket 方式(紫色箭头):
    • 用于 system_server 与 Zygote 之间的通信。
  • Handler 方式(绿色箭头):
    • 用于应用进程内部的线程间通信,主要由 ActivityThread 通过消息队列调度任务。

总结
  • 这张图清晰展示了 Android 中 Activity 启动的完整流程,包括:
    • Launcher 发起请求。
    • AMS 接收请求并通过 Zygote 创建新进程。
    • 应用进程启动后与 AMS 绑定。
    • AMS 调度并启动目标 Activity。
  • 整个流程基于 Binder、Socket、Handler 等通信机制高效协作完成。


(1)点击桌面APP图标时,Launcher的startActivity()方法,通过Binder通信,调用system_server进程中AMS服务的startActivity方法,发起启动请求
(2)system_server进程接收到请求后,向Zygote进程发送创建进程的请求
(3)Zygote进程fork出App进程,并执行ActivityThread的main方法,创建ActivityThread线程,初始化MainLooper,主线程Handler,同时初始化ApplicationThread用于和AMS通信交互
(4)App进程,通过Binder向sytem_server进程发起attachApplication请求,这里实际上就是APP进程通过Binder调用sytem_server进程中AMS的attachApplication方法,AMS的attachApplication方法的作用是将ApplicationThread对象与AMS绑定
(5)system_server进程在收到attachApplication的请求,进行一些准备工作后,再通过binder IPC向App进程发送handleBindApplication请求(初始化Application并调用onCreate方法)和scheduleLaunchActivity请求(创建启动Activity)
(6)App进程的binder线程(ApplicationThread)在收到请求后,通过handler向主线程发送BIND_APPLICATION和LAUNCH_ACTIVITY消息,这里注意的是AMS和主线程并不直接通信,而是AMS和主线程的内部类ApplicationThread通过Binder通信,ApplicationThread再和主线程通过Handler消息交互。
(7)主线程在收到Message后,创建Application并调用onCreate方法,再通过反射机制创建目标Activity,并回调Activity.onCreate()等方法
(8)到此,App便正式启动,开始进入Activity生命周期,执行完onCreate/onStart/onResume方法,UI渲染后显示APP主界面


这个人还没有签名
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

图文推荐
大神求
大神求
6 天前
热门排行