在 Android 系统中,Activity 的启动流程是一个复杂且涉及多个系统组件的过程。以下是一个详细的、逐步的解析,从用户点击图标到 Activity 展示在屏幕上的完整过程。
Activity 启动流程
-
用户点击应用图标:
- 用户在 Launcher 上点击应用图标,这会触发
Launcher
应用的点击事件处理逻辑。
- 用户在 Launcher 上点击应用图标,这会触发
-
Launcher 发起启动请求:
Launcher
调用startActivity()
方法,发送一个Intent
来启动应用的MainActivity
。startActivity()
调用会传递到Activity.startActivityForResult()
。
-
ActivityManagerService 接收请求:
- 通过 Binder 机制,启动请求传递到系统服务
ActivityManagerService
(AMS)。 AMS
的startActivity()
方法会被调用,这个方法会进行一系列的处理和检查,包括权限验证和任务栈管理。
- 通过 Binder 机制,启动请求传递到系统服务
-
ActivityStackSupervisor:
AMS
内部调用ActivityStackSupervisor
来管理 Activity 栈,并确定启动模式(如标准模式、单例模式等)。ActivityStackSupervisor
会检查当前是否存在可重用的 Activity 或者是否需要创建新的 Activity 实例。
-
创建或重用 Activity 实例:
- 如果需要创建新的 Activity 实例,
AMS
会调用startProcessLocked()
方法,启动目标应用进程。 - 如果目标应用进程已经在运行,则直接使用该进程来启动新的 Activity。
- 如果需要创建新的 Activity 实例,
-
启动应用进程:
- 如果目标应用进程还未启动,
AMS
会通过Zygote
进程来孵化新的应用进程。 Zygote
进程是一个孵化器进程,它通过fork()
系统调用创建新的应用进程,这个过程非常高效。
- 如果目标应用进程还未启动,
-
应用进程准备启动 Activity:
- 在新创建的应用进程中,
ActivityThread
是负责管理 Activity 生命周期的主要类。 ActivityThread
的main()
方法会初始化主线程的Looper
和Handler
,并进入消息循环。
- 在新创建的应用进程中,
-
ActivityThread 与 AMS 通信:
AMS
会通过 Binder 调用ApplicationThread
的scheduleLaunchActivity()
方法。ApplicationThread
是ActivityThread
的内部类,它通过 IPC 与AMS
通信。
-
ActivityThread 处理启动请求:
ActivityThread
收到scheduleLaunchActivity()
请求后,会将启动消息发送给内部的H
Handler。H
Handler 处理LAUNCH_ACTIVITY
消息,调用performLaunchActivity()
方法。
-
创建 Activity 实例:
performLaunchActivity()
方法通过反射机制创建 Activity 实例,并调用attach()
方法将其绑定到ContextImpl
上。- 调用 Activity 的生命周期方法:
onCreate()
、onStart()
和onResume()
。
-
显示 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,使得用户点击应用图标后的体验流畅而迅速。