一句话总结
Activity 的创建像一场接力赛:Launcher 发令 → SystemServer 指挥 → Zygote 造人 → App 进程干活,四棒交接完成初始化!
一、Launcher进程(第一棒:启动指令的发出者)
角色:桌面 App。
当用户点击一个应用图标时,Launcher 进程会构建一个 Intent 对象。Intent 中包含了要启动的 Activity 的信息。Launcher 随后通过 Binder IPC(进程间通信) 将这个 Intent 发送到 SystemServer 进程中的 ActivityManagerService (AMS) 。
二、SystemServer进程(第二棒:全局调度的核心)
角色:Android 系统的核心服务进程,其中运行着 AMS、PackageManagerService 等关键服务。
SystemServer 是 Activity 启动过程的“总指挥”。它接收到 Intent 后,会执行以下关键操作:
-
权限检查:验证启动请求的合法性。
-
进程判断:检查目标应用是否已经运行。
- 如果应用进程不存在,
SystemServer会通过 Socket 向 Zygote 进程发送指令,请求创建一个新的进程。 - 如果应用进程已存在,
SystemServer会直接通过 Binder 向该进程发送启动 Activity 的指令。
- 如果应用进程不存在,
三、Zygote进程(第三棒:App进程的孵化器)
角色:Android 的“模板工厂”,预加载了所有公共库和资源。
Zygote 进程收到指令后,会执行其最核心的操作:
fork系统调用:Zygote复制自身,生成一个新的子进程。这个过程采用了写时复制(Copy-on-Write) 技术,使得新进程可以快速启动并共享Zygote的内存。- 主线程入口:在新的进程中,
Zygote会执行ActivityThread.main()方法,这标志着App 主线程的正式诞生。
四、App进程(第四棒:Activity的创建与显示)
角色:新创建的应用进程,其主线程运行着 ActivityThread。
这是整个启动流程的最后一棒,也是开发者最熟悉的环节:
-
进程初始化:主线程首先初始化其消息循环系统(
Looper和MessageQueue),并创建一个ActivityThread实例。 -
Binder 注册:
ActivityThread会通过 Binder 向AMS注册一个回调接口,从而能够接收AMS发送的指令。 -
Application 创建:
AMS通过 Binder 指令通知ActivityThread,ActivityThread随后通过反射创建Application实例,并调用其onCreate()方法。 -
Activity 创建:
AMS再次发送指令,ActivityThread接收到后:- 通过反射创建目标
Activity的实例。 - 执行
attach()方法,将Context和Window绑定到Activity。 - 调用
Activity的onCreate()、onStart()和onResume()等生命周期方法。
- 通过反射创建目标
-
UI 绘制:
Activity的onResume()调用后,其DecorView被添加到WindowManager,随后触发 UI 的测量、布局和绘制,最终通过SurfaceFlinger显示到屏幕上。
五、多进程协同流程图
用户点击图标
↓
[Launcher 进程] →(Binder IPC)→ [SystemServer 进程] (AMS)
↓
[Zygote 进程] ←(Socket)←(请求fork)← [SystemServer 进程]
↓
[App 进程] →(Binder IPC)→ [SystemServer 进程] (注册)
↓
[App 进程] ←(Binder IPC)←(指令)← [SystemServer 进程] (执行onCreate等)