看了不少网上关于Activity的启动流程,但总觉得过犹不及,所以想自己通过自己的理解总结一下,这样自己也能通过自己的话讲出
来了,没有流程图,没有源码分析,只有自己的理解以及几个主要的类和函数,就能描绘清楚Activity的启动流程。
Instrumentation:可以理解成一个应用的使用手册,是给系统看的手册,准确的说是通过对清单文件的描述创建而来的,在应用启
动前就存在的对象,其中包含了很多重要的函数,包括对Activity,Application的创建,生命周期函数的回调等等。
ActivityThread:在Activity的启动流程中,该类出现在Instrumentation中,我们知道一个应用就是一个进程,进程的main函数就在
该类中,同时还有启动以及管理Activity的作用,其中有两个重要的内部类或者是对象,ApplicationThread以及H
ApplicationThread:是ActivityThread的内部类,继承的是一个IApplicationThread.Stub从名字可以看出来实际上是一个Binder。
主要作用是实现了该Binder的函数,其中包括了对Activity以及Receiver的管理函数等。
H:是ActivityThread的内部类,继承的是Handler,主要的作用是用来发送主要信息,包括启动Activity等关键信息。
AMS:是一个Binder,出现在Instrumention中,在Activity的启动中起到了主要的作用,是第一个进行跨进程操作的对象。
ActivityStackSupervisor以及AcivityStack:在Activity的启动中完成后期的一些数据准备的功能。
以上的几个主要的类之间的相互配合,共同完成了Activity的启动,主要的说明以及流程如下:
Activity是四大组件之一,是一种展示型组件,继承关系:Activity<--ContextThemeWrapper<--ContextWrapper<--Context<--Object
1.不管是通过startActivity还是startActivityForResult启动Activity,最终都会使用startActivityForResult开始启动Activity,后者会调用
Instrumentation的execStartActivity方法开始启动Activity
2.execStartActivity中会调用AMS(实际是一个Binder)的startActivity方法,所以启动就从Instrumentation转移到了
ActivityManagerService中
3.在AMS中会串行调用ActivityStackSupervisor以及AcivityStack中的方法,最终会回到ActivityStackSupervisor的
realStartActivityLocked方法中
4.realStartActivityLocked方法又会通过Binder来调用ApplicationThread中的scheduleLaunchActivity,该方法内容主要是
通过H跨线程发送一个启动activity的消息
5.在ActivityThread中,对H发送的消息进行处理调用handleLaunchActivity,在该方法中会调用performLaunchActivity,该方法主要
完成以下工作:
a.获取组件信息
b.通过Instrumentation的newActivity方法使用类加载器创建Activity对象
c.通过LoadedApk的makeApplication尝试创建Application对象
d.通过ContextImpl对象以及Activity的attach方法完成重要数据的初始化。
e.调用Activity的onCreate方法。
至此Activity就执行到了onCreate方法,然后再通过Instrumention进行后续生命周期的回调。