tips:
- xxxNative extends Binder implements Ixxx
- Instrumentation 儀表, 控制著Application 的 onCreate 和 Activity的全部生命周期(創(chuàng)建的時候都經(jīng)過它), 這樣便于控制
過程
概括起來就是發(fā)送Handler給主線程, 主線程調(diào)用handle方法去執(zhí)行的過程
主線程 ActivityThread 的 main() 方法中:
a. 先創(chuàng)建了主Looper和主Handler,
b. 創(chuàng)建了ActivityThread ,attach()
方法中, 拆成兩步, 獲取 IBinder 和 加入 application的Binder調(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" 標(biāo)簽的 IBinder 傳給 IActivityManager返回到第1步回到 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 中 關(guān)于descriptor 也只有一句String descriptor = "android.app.IApplicationThread";
小結(jié)一下, 就是 ApplicationThread 的無參構(gòu)造方法用到了父類的父類的 Binder的 attachInterface(this, descriptor), 而其中的descriptor為它實現(xiàn)的接口 IApplicationThread 的常量字符串"android.app.IApplicationThread";
回到 ActivityThread
此時 thread 就 attach 上了 IActivityManager 和 IApplicationThread 這倆接口的實現(xiàn), 進入了 Looper 主循環(huán)終于等到了 ActivityManagerService
AMS處理消息時執(zhí)行到,thread.bindApplication(...)
也就是說
ApplicationThread以IApplicationThread的身份到了ActivityManagerService中在讶,經(jīng)過一系列的操作蛇捌,最終被調(diào)用了自己的bindApplication()方法磕诊,發(fā)出初始化Applicationd的消息爷贫。
又回到了 ApplicationThread(ActivityThread的內(nèi)部類)
其中bindApplication(...)
的最后發(fā)出了 H.BIND_APPLICATION 消息, 交給 外部類ActivityThread 處理.-
終于回到了 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
繼續(xù)在 ActivityThread 中, Application 初始化完成后, 系統(tǒng)會根據(jù)manifest中的配置發(fā)送一個intent去啟動activity,
當(dāng)收到創(chuàng)建 Activity 的 handler 的消息后, 開始執(zhí)行handleLaunchActivity
, 其中調(diào)用了performLaunchActivity(r, customIntent)
方法,
- 在 performLaunchActivity 方法中, Instrumentation 的實例調(diào)用
newActivity
方法, 簡單粗暴的一句反射就創(chuàng)建了 Activity, 接下來判斷是不是isPersistable(), 選擇是不是持久化的 Activity
- 最后回到 ActivityThread 繼續(xù)onResume等方法
純UML圖如下
以及 大神 的流程圖