目录
3、 AMS 到 ApplicationThread的调用过程
4、ActivityThread 启动 Activity 的过程
1、介绍
Activity的启动过程分为两种,一种是根Activity的启动过程,另一种是普通Activity的启动过程。根Activity指的是应用程序启动的第一个Activity,因此根Activity的启动过程一般情况下也可以理解为应用程序的启动过程。普通Activity指的是除应用程序启动的第一个Activity之外的其他Activity。
根Activity的启动过程比较复杂,因此这里分为 3 个部分来讲,分别是 :
1、Launcher 请求 AMS 过程;
2、AMS 到 ApplicationThread 的调用过程
3、ActivityThread 启动 Activity。
2、Launcher 请求 AMS 过程
在Android系统中,Launcher的重要作用有两点:
(1)作为Android系统的启动器,用来启动应用程序。
(2)作为Android系统的桌面,用于显示和管理应用程序的快捷图标或者其他桌面组件。当 Luancher 启动后会将已安装应用程序的快捷图标显示到桌面上,这些应用程序的快捷图标就是启动根Activity的入口,当我们点击某个应用程序的快捷图标时,就会通过 Launcher 请求 AMS 来启动该应用程序。Launcher 请求 AMS 的时序图如图所示:
1、当我们点击应用程序的快捷图标时,就会调用 Launcher 的 startActivitySafely 方法,如下所示:
该类在该包内:packages/apps/Launcher3/src/com/android/launcher3/Launcher.java
2、在红色框内处将 Flag 设置为 Intent.FLAG_ACTIVITY_NEW_TASK ,这样根 Activity 会在新的任务栈中启动;
在蓝色框处会调用 startActivity() 方法,这个 startActivity() 方法在 Activity 中实现,如下所示:
frameworks/base/core/java/android/app/Activity.java
3、在 startActivity 方法中调用 startActivityForResult 方法,它的第二个参数为 -1,表示 Launcher 不需要知道 Activity 启动的结果,startActivityForResult 方法的代码如下所示:
frameworks/base/core/java/android/app/Activity.java
4、上面的 mParent 是 Activity 类型的,表示当前 Activity 的父类。因为目前根 Activity 还没有创建出来,因此,mParent == null 成立。
接着调用 Instrumentation 的 execStartActivity() 方法,Instrumentation 主要用来监控应用程序和系统的交互,execStartActivity() 方法的代码如下所示:
frameworks/base/core/java/android/app/Instrumentation.java
5、首先调用 ActivityManager 的 getService() 方法来获取 AMS 的代理对象,按着调用它的 startActivity 方法。
这里与 Android 8.0 之前代码的逻辑有些不同,Android 8.0 之前是通过 ActivityManagerNative 的 getDefault 来获取 AMS 的代理对象的,现在这个逻辑封装到了 ActivityManager 中而不是 ActivityManagerNative 中。
首先我们来查看 ActivityManager 的 getService 方法做了什么:
frameworks/base/core/java/android/app/ActivityManager.java
6、getService() 方法调用了 IActivityManagerSingleton 的 get() 方法,我们接着往下看,IActivityManagerSingleton 是一个 Singleton 类。
在红框中第一行处得到名为 "activity" 的 Service 引用,也就是 IBinder 类型的 AMS 的引用。