美文网首页
Day17-Application和Activity启动过程

Day17-Application和Activity启动过程

作者: 我不是死胖子 | 来源:发表于2017-09-13 22:29 被阅读13次
    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图如下


    以及 大神 的流程图

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

    相关文章

      网友评论

          本文标题:Day17-Application和Activity启动过程

          本文链接:https://www.haomeiwen.com/subject/tetrsxtx.html