Day17-Application和Activity启动过程

tips:
  • xxxNative extends Binder implements Ixxx
  • Instrumentation 仪表, 控制着Application 的 onCreate 和 Activity的全部生命周期(创建的时候都经过它), 这样便于控制

过程

概括起来就是发送Handler给主线程, 主线程调用handle方法去执行的过程

  1. 主线程 ActivityThread 的 main() 方法中:
    a. 先创建了主Looper和主Handler,
    b. 创建了ActivityThread , attach()方法中, 拆成两步, 获取 IBinder 和 加入 application的Binder

  2. 调用 ActivityManagerNative 的静态方法
    它是一个抽象类, 继承自Binder, 实现了 IActivityManager 接口.
    第1步的 attach() 中通过静态方法 ActivityManagerNative.getDefault(); 通过调用自己的静态单例方法 gDefault 创建出单例的 IActivityManager, 调用静态 asInterface 方法, 将 "activity" 标签的 IBinder 传给 IActivityManager返回到第1步

  3. 回到 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";

  1. 回到 ActivityThread
    此时 thread 就 attach 上了 IActivityManager 和 IApplicationThread 这俩接口的实现, 进入了 Looper 主循环

  2. 终于等到了 ActivityManagerService
    AMS处理消息时执行到, thread.bindApplication(...)
    也就是说

ApplicationThread以IApplicationThread的身份到了ActivityManagerService中,经过一系列的操作,最终被调用了自己的bindApplication()方法,发出初始化Applicationd的消息。

  1. 又回到了 ApplicationThread(ActivityThread的内部类)
    其中bindApplication(...) 的最后发出了 H.BIND_APPLICATION 消息, 交给 外部类ActivityThread 处理.

  2. 终于回到了 ActivityThread
    其中handleBindApplication 方法中分成三步.

    • 先反射创建出 Instrumentation 的实例,
    • 然后调用 LoadApk 类的makeApplication()方法创建 Application,
      • makeApplication() 中 ContextImpl 创建了 context
      • makeApplication() 最后又调用了 Instrumentation 的 newApplication方法, 将 application 反射出来绑定 context
    • 最后执行 Instrumentation 的 callApplicationOnCreate
  3. 继续在 ActivityThread 中, Application 初始化完成后, 系统会根据manifest中的配置发送一个intent去启动activity,
    当收到创建 Activity 的 handler 的消息后, 开始执行handleLaunchActivity, 其中调用了performLaunchActivity(r, customIntent)方法,

  • 在 performLaunchActivity 方法中, Instrumentation 的实例调用 newActivity 方法, 简单粗暴的一句反射就创建了 Activity, 接下来判断是不是isPersistable(), 选择是不是持久化的 Activity
  1. 最后回到 ActivityThread 继续onResume等方法

纯UML图如下

Day17-Application和Activity启动过程_第1张图片

以及 大神 的流程图
Day17-Application和Activity启动过程_第2张图片

参考
| 3分钟看懂Activity启动流程

你可能感兴趣的:(Day17-Application和Activity启动过程)