Day17-Application和Activity启动过程
tips:
- xxxNative extends Binder implements Ixxx
- Instrumentation 仪表, 控制着Application 的 onCreate 和 Activity的全部生命周期(创建的时候都经过它), 这样便于控制
过程
概括起来就是发送Handler给主线程, 主线程调用handle方法去执行的过程
-
主线程 ActivityThread 的 main() 方法中:
a. 先创建了主Looper和主Handler,
b. 创建了ActivityThread ,attach()
方法中, 拆成两步, 获取 IBinder 和 加入 application的Binder -
调用 ActivityManagerNative 的静态方法
它是一个抽象类, 继承自Binder, 实现了 IActivityManager 接口.
第1步的 attach() 中通过静态方法ActivityManagerNative.getDefault();
通过调用自己的静态单例方法 gDefault 创建出单例的 IActivityManager, 调用静态 asInterface 方法, 将 "activity" 标签的 IBinder 传给 IActivityManager返回到第1步 -
回到 ApplicationThread (ActivityThread的内部类)
作为 ActivityThread 的内部类, 反而继承自 ApplicationThreadNative, 后者继承 Binder并实现 IApplicationThread, 所以 ApplicationThread 的对象作为第2步IActivityManager.attachApplication(IApplicationThread)
的参数也不奇怪了. ApplicationThread 的无参构造方法调用父类的构造方法, 父类的无参构造里只有这一句attachInterface(this, descriptor);
, 是父类的父类 Binder 中实现的, 将descriptor交给了Binder, 那么descriptor在哪儿呢, 对, 在接口 IApplicationThread 中 关于descriptor 也只有一句String descriptor = "android.app.IApplicationThread";
-
小结一下, 就是 ApplicationThread 的无参构造方法用到了父类的父类的 Binder的 attachInterface(this, descriptor), 而其中的descriptor为它实现的接口 IApplicationThread 的常量字符串"android.app.IApplicationThread";
-
回到 ActivityThread
此时 thread 就 attach 上了 IActivityManager 和 IApplicationThread 这俩接口的实现, 进入了 Looper 主循环 -
终于等到了 ActivityManagerService
AMS处理消息时执行到,thread.bindApplication(...)
也就是说
ApplicationThread以IApplicationThread的身份到了ActivityManagerService中,经过一系列的操作,最终被调用了自己的bindApplication()方法,发出初始化Applicationd的消息。
-
又回到了 ApplicationThread(ActivityThread的内部类)
其中bindApplication(...)
的最后发出了 H.BIND_APPLICATION 消息, 交给 外部类ActivityThread 处理. -
终于回到了 ActivityThread
其中handleBindApplication
方法中分成三步.- 先反射创建出 Instrumentation 的实例,
- 然后调用 LoadApk 类的
makeApplication()
方法创建 Application,-
makeApplication()
中 ContextImpl 创建了 context -
makeApplication()
最后又调用了 Instrumentation 的newApplication
方法, 将 application 反射出来绑定 context
-
- 最后执行 Instrumentation 的
callApplicationOnCreate
-
继续在 ActivityThread 中, Application 初始化完成后, 系统会根据manifest中的配置发送一个intent去启动activity,
当收到创建 Activity 的 handler 的消息后, 开始执行handleLaunchActivity
, 其中调用了performLaunchActivity(r, customIntent)
方法,
- 在 performLaunchActivity 方法中, Instrumentation 的实例调用
newActivity
方法, 简单粗暴的一句反射就创建了 Activity, 接下来判断是不是isPersistable(), 选择是不是持久化的 Activity
- 最后回到 ActivityThread 继续onResume等方法
纯UML图如下
以及 大神 的流程图