Activity啟動流程(上)

新啟動流程

與之前不同的是添加了ActivityStartController, ActivityStarter , ClientLifecycleManager

并且不同的狀態(tài)是用的是?ActivityLifecycleItem,其子類有PauseActivityItem,LaunchActivityItem等,需要實現(xiàn)preExecute, execute,PostExecute 三個主要方法

并且ActivityThread 繼承了ClientTransactionHandler,在scheduleTransaction 中執(zhí)行preExecute,并發(fā)送消息到H中,在TransactionExecutor中執(zhí)行execute和postExecute,execute執(zhí)行handle方法,postExecute執(zhí)行相應(yīng)的回調(diào)

結(jié)構(gòu)

啟動結(jié)構(gòu)圖

具體過程

1. Activity1調(diào)用startActivity,實際會調(diào)用Instrumentation類的execStartActivity方法,Instrumentation是系統(tǒng)用來監(jiān)控Activity運行的一個類,Activity的整個生命周期都有它的影子。(1- 4)

2. 通過跨進程的binder調(diào)用,進入到ActivityManagerService中,其內(nèi)部會處理Activity棧,通知Activity1 Pause,Activity1 執(zhí)行Pause 后告知AMS。(5 - 29)

3. 在ActivityManagerService中的startProcessLocked中調(diào)用了Process.start()方法。并通過連接調(diào)用Zygote的native方法forkAndSpecialize,執(zhí)行fork任務(wù)。之后再通過跨進程調(diào)用進入到Activity2所在的進程中。(30 - 36)

4. ApplicationThread是一個binder對象,其運行在binder線程池中,內(nèi)部包含一個H類,該類繼承于類Handler。主線程發(fā)起bind Application,AMS 會做一些配置工作,然后讓主線程 bind ApplicationThread,ApplicationThread將啟動Activity2的信息通過H對象發(fā)送給主線程。發(fā)送的消息是EXECUTE_TRANSACTION,消息體是一個 ClientTransaction,即 LaunchActivityItem。主線程拿到Activity2的信息后,調(diào)用Instrumentation類的newActivity方法,其內(nèi)通過ClassLoader創(chuàng)建Activity2實例。(37 - 40)

5. 通知Activity2去performCreate。(41 - 最后)

注:現(xiàn)在發(fā)送的都是EXECUTE_TRANSACTION ,通過 TransactionExecutor 來執(zhí)行?ClientTransaction, ClientTransaction 中包含各種 ClientTransactionItem,如 PauseActivityItem、LaunchActivityItem、StopActivityItem、ResumeActivityItem、DestroyActivityItem 等,這些Item的execute方法來處理相應(yīng)的handle,如handlePauseActivity、handleLaunchActivity等,通知相應(yīng)的Activity來perform。

再盜一張圖

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ā)布平臺,僅提供信息存儲服務(wù)。

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

  • 好吧,終于要開始講解Activity的啟動流程了,Activity的啟動流程相對復雜一下,涉及到了Activity...
    01_小小魚_01閱讀 942評論 1 1
  • 9.0剛剛發(fā)布沒多久,就趕緊下載了源碼看了一下,發(fā)現(xiàn)Activity的啟動流程有點小改動,但是總體上還是和以前差不...
    InBinfen閱讀 3,678評論 9 10
  • Zygote是什么?有什么作用? Android系統(tǒng)底層基于Linux Kernel, 當Kernel啟動過程會創(chuàng)...
    Mr槑閱讀 2,903評論 4 18
  • 前言 熟悉Activity的啟動流程和運行原理是一個合格的應(yīng)用開發(fā)人員所應(yīng)該具備的基本素質(zhì),其重要程度就不多做描述...
    peter_RD_nj閱讀 21,513評論 11 104
  • 一個Android系統(tǒng)的手機,面對桌面一大堆的應(yīng)用圖標,我們隨便點擊一個應(yīng)用圖標,打開該應(yīng)用,然后就進行了...
    黑衣_fy閱讀 3,423評論 0 6

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