Day17-Application和Activity啟動過程

tips:
  • xxxNative extends Binder implements Ixxx
  • Instrumentation 儀表, 控制著Application 的 onCreate 和 Activity的全部生命周期(創(chuàng)建的時候都經(jīng)過它), 這樣便于控制

過程

概括起來就是發(fā)送Handler給主線程, 主線程調(diào)用handle方法去執(zhí)行的過程

  1. 主線程 ActivityThread 的 main() 方法中:
    a. 先創(chuàng)建了主Looper和主Handler,
    b. 創(chuàng)建了ActivityThread , attach()方法中, 拆成兩步, 獲取 IBinder 和 加入 application的Binder

  2. 調(diào)用 ActivityManagerNative 的靜態(tài)方法
    它是一個抽象類, 繼承自Binder, 實現(xiàn)了 IActivityManager 接口.
    第1步的 attach() 中通過靜態(tài)方法 ActivityManagerNative.getDefault(); 通過調(diào)用自己的靜態(tài)單例方法 gDefault 創(chuàng)建出單例的 IActivityManager, 調(diào)用靜態(tài) asInterface 方法, 將 "activity" 標簽的 IBinder 傳給 IActivityManager返回到第1步

  3. 回到 ApplicationThread (ActivityThread的內(nèi)部類)
    作為 ActivityThread 的內(nèi)部類, 反而繼承自 ApplicationThreadNative, 后者繼承 Binder并實現(xiàn) IApplicationThread, 所以 ApplicationThread 的對象作為第2步 IActivityManager.attachApplication(IApplicationThread) 的參數(shù)也不奇怪了. ApplicationThread 的無參構(gòu)造方法調(diào)用父類的構(gòu)造方法, 父類的無參構(gòu)造里只有這一句attachInterface(this, descriptor);, 是父類的父類 Binder 中實現(xiàn)的, 將descriptor交給了Binder, 那么descriptor在哪兒呢, 對, 在接口 IApplicationThread 中 關于descriptor 也只有一句 String descriptor = "android.app.IApplicationThread";

  • 小結(jié)一下, 就是 ApplicationThread 的無參構(gòu)造方法用到了父類的父類的 Binder的 attachInterface(this, descriptor), 而其中的descriptor為它實現(xiàn)的接口 IApplicationThread 的常量字符串"android.app.IApplicationThread";

  1. 回到 ActivityThread
    此時 thread 就 attach 上了 IActivityManager 和 IApplicationThread 這倆接口的實現(xiàn), 進入了 Looper 主循環(huán)

  2. 終于等到了 ActivityManagerService
    AMS處理消息時執(zhí)行到, thread.bindApplication(...)
    也就是說

ApplicationThread以IApplicationThread的身份到了ActivityManagerService中,經(jīng)過一系列的操作,最終被調(diào)用了自己的bindApplication()方法,發(fā)出初始化Applicationd的消息。

  1. 又回到了 ApplicationThread(ActivityThread的內(nèi)部類)
    其中bindApplication(...) 的最后發(fā)出了 H.BIND_APPLICATION 消息, 交給 外部類ActivityThread 處理.

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

    • 先反射創(chuàng)建出 Instrumentation 的實例,
    • 然后調(diào)用 LoadApk 類的makeApplication()方法創(chuàng)建 Application,
      • makeApplication() 中 ContextImpl 創(chuàng)建了 context
      • makeApplication() 最后又調(diào)用了 Instrumentation 的 newApplication方法, 將 application 反射出來綁定 context
    • 最后執(zhí)行 Instrumentation 的 callApplicationOnCreate
  3. 繼續(xù)在 ActivityThread 中, Application 初始化完成后, 系統(tǒng)會根據(jù)manifest中的配置發(fā)送一個intent去啟動activity,
    當收到創(chuàng)建 Activity 的 handler 的消息后, 開始執(zhí)行handleLaunchActivity, 其中調(diào)用了performLaunchActivity(r, customIntent)方法,

  • 在 performLaunchActivity 方法中, Instrumentation 的實例調(diào)用 newActivity 方法, 簡單粗暴的一句反射就創(chuàng)建了 Activity, 接下來判斷是不是isPersistable(), 選擇是不是持久化的 Activity
  1. 最后回到 ActivityThread 繼續(xù)onResume等方法

純UML圖如下


以及 大神 的流程圖

參考
簡書 | 3分鐘看懂Activity啟動流程

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容