android进阶解密 第四章 android8.0四大组件的工作过程

一.根Activity的启动过程:

分成三部分讲解:Laucher请求AMS过程,AMS到ApplicationThread的过程,ActivityThread启动Activity过程。

1.Laucher请求AMS过程时序图:

android进阶解密 第四章 android8.0四大组件的工作过程

注意:

①.Instrumentation主要是用来监控应用程序和系统之间的交互,在Instrumentation的execStartActivity方法中调用了ActivityManager.getService().startActivity方法和checkStartActivityResult方法。

②.ActivityManager.getService().startActivity是8.0中的代码,采用的是AIDL的方式实现进程间通讯的;在8.0之前是ActivityManagerNative.getDefualt().startActivity采用的是代理对象ActivityManagerProxy来与AMS进行跨进程通讯的;本质上都采用了binder机制。

③.checkStartActivityResult的作用是检查启动结果,当一个activity无法正常启动就会抛出异常,常见的androidManifest异常就是此处抛出的。

2.AMS到ApplicationThread的调用过程

时序图如下:

android进阶解密 第四章 android8.0四大组件的工作过程

注意:

①.ActivityStarter是android 7.0 新加的类,他是加载activity的控制类,会收集所有的逻辑来决定如何将Intent和Flags转换为Activity,并将Activity和Task以及Stack相关联。(7.0之前的版本直接调用的是ActivityStackSupervisor中的startActivityMayWait方法进入ActivityStackSupervisor的逻辑)

②.在ActivityStarter的第一个startActivity的方法中得到代表Launcher进程的callApp对象,他是ProcessRecord类型;然后根据callApp创建ActivityRecord的r。

③.startActivityUnchecked主要处理与栈管理相关逻辑,此处中会创建新的TaskRecord,也就是会创建新的任务栈。

ProcessRecord:进程的描述。

ActivityRecord:activity的描述。

TaskRecord:任务栈的描述。

④.app.thread.scheduleLauchActivity中的app.thread是IApplicationThread,他的实现是ActivityThread的内部类ApplicationThread,其中ApplicationThread继承IApplicationThread.Stub,实现原理的AIDL的跨进程通讯。IApplicationThread这个Binder接口的实现者Application·完成了大量的和activity以及service启动/停止相关的功能。

3.ActivityThread启动Activity的过程

时序图如下:

android进阶解密 第四章 android8.0四大组件的工作过程

注意:

①.因为Application是一个binder,所以H的handlerMessage方法是为了将当前代码的逻辑从线程池切换到当前的主线程。

②.r.packageInfo是描述类LoadedApk,LoadedApk是用来描述已加载的apk文件。

③.r是ActivityClientRecord,在performLaunchActivity中通过r和r.packageInfo文件继续传递并创建context,activity,application以及完成下面的操作。