根Activity的启动过程(应用程序启动过程)

Activity 的启动过程分为两种,一种是根 Activity 的启动过程,另一种是普通 Activity 的启动过程。根 Activity 指的是应用程序启动的第一个 Activity,因此根 Activity 的启动过程一般情况下也可以理解为应用程序的启动过程。
根 Activity 的启动过程比较复杂,分为 3 个部分:Launcher 请求 AMS 过程、AMS 到 ApplicationThread 的调用过程和 ActivityThread 启动 Activity。

  • 1、Launcher 请求 AMS 过程

    根Activity的启动过程(应用程序启动过程)_第1张图片
    Launcher请求AMS过程时序图

  • 2、AMS 到 ApplicationThread 的调用过程

    根Activity的启动过程(应用程序启动过程)_第2张图片
    AMS到ApplicationThread的调用过程时序图

  • 3、ActivityThread 启动 Activity 的过程

    根Activity的启动过程(应用程序启动过程)_第3张图片
    ActivityThread启动Activity的过程时序图

启动过程设计到 4 个进程:Zygote 进程、Launcher 进程、AMS 所在进程(SystemServer 进程)、应用程序进程,它们之间的关系如下:


根Activity的启动过程(应用程序启动过程)_第4张图片
根Activity启动过程中涉及的进程之间的关系

4 个进程调用时序图如下:


根Activity的启动过程(应用程序启动过程)_第5张图片
根Activity启动过程中进程调用时序图

启动过程总结如下:

  1. 无论是通过 Launcher 来启动 Activity,还是通过Activity内部调用 startActivity 接口来启动新的 Activity,都通过 Binder 进程间通信进入到 ActivityManagerService 进程中,并且调用 ActivityManagerService.startActivity 接口;
  2. ActivityManagerService 调用 ActivityStack.startActivityMayWait 来做准备要启动的Activity的相关信息;
  3. ActivityStack 通知 ApplicationThread 要进行 Activity 启动调度了,这里的 ApplicationThread 代表的是调用 ActivityManagerService.startActivity 接口的进程,对于通过点击应用程序图标的情景来说,这个进程就是 Launcher 了,而对于通过在 Activity 内部调用 startActivity 的情景来说,这个进程就是这个 Activity 所在的进程了;
  4. ApplicationThread 不执行真正的启动操作,它通过调用 ActivityManagerService.activityPaused 接口进入到 ActivityManagerService 进程中,看看是否需要创建新的进程来启动 Activity;
  5. 对于通过点击应用程序图标来启动Activity的情景来说,ActivityManagerService 在这一步中,会调用 startProcessLocked 来创建一个新的进程,而对于通过在Activity内部调用 startActivity 来启动新的 Activity 来说,这一步是不需要执行的,因为新的 Activity 就在原来的 Activity 所在的进程中进行启动;
  6. ActivityManagerServic 调用 ApplicationThread.scheduleLaunchActivity 接口,通知相应的进程执行启动 Activity 的操作;
  7. ApplicationThread 把这个启动 Activity 的操作转发给 ActivityThread,ActivityThread 通过 ClassLoader 导入相应的 Activity 类,然后把它启动起来。

你可能感兴趣的:(根Activity的启动过程(应用程序启动过程))