Activity 的启动过程分为两种,一种是根 Activity 的启动过程,另一种是普通 Activity 的启动过程。根 Activity 指的是应用程序启动的第一个 Activity,因此根 Activity 的启动过程一般情况下也可以理解为应用程序的启动过程。
根 Activity 的启动过程比较复杂,分为 3 个部分:Launcher 请求 AMS 过程、AMS 到 ApplicationThread 的调用过程和 ActivityThread 启动 Activity。
-
1、Launcher 请求 AMS 过程
-
2、AMS 到 ApplicationThread 的调用过程
-
3、ActivityThread 启动 Activity 的过程
启动过程设计到 4 个进程:Zygote 进程、Launcher 进程、AMS 所在进程(SystemServer 进程)、应用程序进程,它们之间的关系如下:
4 个进程调用时序图如下:
启动过程总结如下:
- 无论是通过 Launcher 来启动 Activity,还是通过Activity内部调用 startActivity 接口来启动新的 Activity,都通过 Binder 进程间通信进入到 ActivityManagerService 进程中,并且调用 ActivityManagerService.startActivity 接口;
- ActivityManagerService 调用 ActivityStack.startActivityMayWait 来做准备要启动的Activity的相关信息;
- ActivityStack 通知 ApplicationThread 要进行 Activity 启动调度了,这里的 ApplicationThread 代表的是调用 ActivityManagerService.startActivity 接口的进程,对于通过点击应用程序图标的情景来说,这个进程就是 Launcher 了,而对于通过在 Activity 内部调用 startActivity 的情景来说,这个进程就是这个 Activity 所在的进程了;
- ApplicationThread 不执行真正的启动操作,它通过调用 ActivityManagerService.activityPaused 接口进入到 ActivityManagerService 进程中,看看是否需要创建新的进程来启动 Activity;
- 对于通过点击应用程序图标来启动Activity的情景来说,ActivityManagerService 在这一步中,会调用 startProcessLocked 来创建一个新的进程,而对于通过在Activity内部调用 startActivity 来启动新的 Activity 来说,这一步是不需要执行的,因为新的 Activity 就在原来的 Activity 所在的进程中进行启动;
- ActivityManagerServic 调用 ApplicationThread.scheduleLaunchActivity 接口,通知相应的进程执行启动 Activity 的操作;
- ApplicationThread 把这个启动 Activity 的操作转发给 ActivityThread,ActivityThread 通过 ClassLoader 导入相应的 Activity 类,然后把它启动起来。