Kotlin进阶-10-Activity的启动流程

目录

1、介绍

2、Launcher 请求 AMS 过程

3、 AMS 到 ApplicationThread的调用过程

4、ActivityThread 启动 Activity 的过程

5、根 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 成立。

接着调用 InstrumentationexecStartActivity() 方法,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 的引用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值