與之前不同的是添加了ActivityStartController, ActivityStarter 藐吮, ClientLifecycleManager
并且不同的狀態(tài)是用的是?ActivityLifecycleItem溺拱,其子類(lèi)有PauseActivityItem,LaunchActivityItem等谣辞,需要實(shí)現(xiàn)preExecute迫摔, execute,PostExecute 三個(gè)主要方法
并且ActivityThread 繼承了ClientTransactionHandler泥从,在scheduleTransaction 中執(zhí)行preExecute攒菠,并發(fā)送消息到H中,在TransactionExecutor中執(zhí)行execute和postExecute歉闰,execute執(zhí)行handle方法辖众,postExecute執(zhí)行相應(yīng)的回調(diào)
結(jié)構(gòu)
具體過(guò)程
1. Activity1調(diào)用startActivity,實(shí)際會(huì)調(diào)用Instrumentation類(lèi)的execStartActivity方法和敬,Instrumentation是系統(tǒng)用來(lái)監(jiān)控Activity運(yùn)行的一個(gè)類(lèi)凹炸,Activity的整個(gè)生命周期都有它的影子。(1- 4)
2. 通過(guò)跨進(jìn)程的binder調(diào)用昼弟,進(jìn)入到ActivityManagerService中啤它,其內(nèi)部會(huì)處理Activity棧,通知Activity1 Pause,Activity1 執(zhí)行Pause 后告知AMS变骡。(5 - 29)
3. 在ActivityManagerService中的startProcessLocked中調(diào)用了Process.start()方法离赫。并通過(guò)連接調(diào)用Zygote的native方法forkAndSpecialize,執(zhí)行fork任務(wù)塌碌。之后再通過(guò)跨進(jìn)程調(diào)用進(jìn)入到Activity2所在的進(jìn)程中渊胸。(30 - 36)
4. ApplicationThread是一個(gè)binder對(duì)象,其運(yùn)行在binder線(xiàn)程池中台妆,內(nèi)部包含一個(gè)H類(lèi)翎猛,該類(lèi)繼承于類(lèi)Handler。主線(xiàn)程發(fā)起bind Application接剩,AMS 會(huì)做一些配置工作切厘,然后讓主線(xiàn)程 bind ApplicationThread,ApplicationThread將啟動(dòng)Activity2的信息通過(guò)H對(duì)象發(fā)送給主線(xiàn)程懊缺。發(fā)送的消息是EXECUTE_TRANSACTION疫稿,消息體是一個(gè) ClientTransaction,即 LaunchActivityItem鹃两。主線(xiàn)程拿到Activity2的信息后遗座,調(diào)用Instrumentation類(lèi)的newActivity方法,其內(nèi)通過(guò)ClassLoader創(chuàng)建Activity2實(shí)例怔毛。(37 - 40)
5. 通知Activity2去performCreate员萍。(41 - 最后)
注:現(xiàn)在發(fā)送的都是EXECUTE_TRANSACTION ,通過(guò) TransactionExecutor 來(lái)執(zhí)行?ClientTransaction, ClientTransaction 中包含各種 ClientTransactionItem拣度,如 PauseActivityItem碎绎、LaunchActivityItem、StopActivityItem抗果、ResumeActivityItem筋帖、DestroyActivityItem 等,這些Item的execute方法來(lái)處理相應(yīng)的handle冤馏,如handlePauseActivity日麸、handleLaunchActivity等,通知相應(yīng)的Activity來(lái)perform逮光。
再盜一張圖