四大組件之Activity(一)-啟動(dòng)過程概覽

本文針對(duì)Activity的啟動(dòng)主線進(jìn)行梳理。先捋大流程,后續(xù)再針對(duì)細(xì)節(jié)進(jìn)行學(xué)習(xí)。

一、概覽關(guān)鍵流程
form Gityuan

啟動(dòng)流程關(guān)鍵主線梳理:

  1. 點(diǎn)擊桌面App圖標(biāo),Launcher進(jìn)程采用Binder IPC向AMS發(fā)起startActivity請(qǐng)求;

  2. AMS接收到請(qǐng)求后,向zygote進(jìn)程發(fā)送創(chuàng)建進(jìn)程的請(qǐng)求,由Zygote進(jìn)程fork出新的子進(jìn)程,即App進(jìn)程;

  3. App進(jìn)程,通過Binder IPC向AMS發(fā)起attachApplication請(qǐng)求;

  4. AMS在收到請(qǐng)求后,進(jìn)行一系列準(zhǔn)備工作后,再通過binder IPC向App進(jìn)程發(fā)送scheduleLaunchActivity請(qǐng)求;

  5. App進(jìn)程的binder線程(ApplicationThread)在收到請(qǐng)求后,通過handler向主線程發(fā)送LAUNCH_ACTIVITY消息;

  6. 主線程在收到Message后,創(chuàng)建目標(biāo)Activity,并回調(diào)Activity.onCreate()等方法。

到此,App便正式啟動(dòng),開始進(jìn)入Activity生命周期,執(zhí)行完onCreate/onStart/onResume方法,UI渲染結(jié)束后便可以看到App的主界面。

二、詳細(xì)調(diào)用流程

下面再看看詳細(xì)的Activity啟動(dòng)流程(包括top activity切換與activity stop過程) :

Activity啟動(dòng)主要牽扯到兩個(gè)進(jìn)程 :app進(jìn)程 與 system_server進(jìn)程。按Binder IPC切換劃分為如下幾個(gè)節(jié)點(diǎn):

  1. app 觸發(fā)activity的啟動(dòng)流程。
    點(diǎn)擊桌面App圖標(biāo),Launcher進(jìn)程采用Binder IPC向AMS發(fā)起startActivity請(qǐng)求。

  2. system_server 接收activity啟動(dòng)請(qǐng)求,開始做一些前期準(zhǔn)備工作。

  • 獲取對(duì)應(yīng)Activity,并對(duì)基本信息進(jìn)行驗(yàn)證。
  • 根據(jù)launcheMode和Flag配置task。
  • 如果之前存在前臺(tái)Acitivity,則讓它先進(jìn)入pause狀態(tài)。
  1. app 讓之前前臺(tái)顯示的activity進(jìn)入pause狀態(tài)。
    這部分很簡單,看流程圖就足夠。

4 system_server 進(jìn)程準(zhǔn)備。
ActivityStackSupervisor #startSpecificActivityLocked
判斷當(dāng)前要啟動(dòng)的activity所在的進(jìn)程是否存在,如果不存在則創(chuàng)建進(jìn)程。

5 app ActivityThread 通過消息機(jī)制來處理Activity的Launch

6 system_server activity stop時(shí),調(diào)整task。

7 app 通知app執(zhí)行stop回調(diào)。

三、執(zhí)行流
  • Activity要通知系統(tǒng)進(jìn)程
    Activity-->Instrumentation-->ActivityManagerNative—>
    Binder IPC 進(jìn)入系統(tǒng)進(jìn)程
    -->ActivityManagerService-->ActivityStackSupervisor/ActivityStack

  • 系統(tǒng)進(jìn)程要管理Activity
    ApplicationThreadNative-->
    Binder IPC 進(jìn)入App進(jìn)程
    -->ActivityThread.ApplicationThread-->ActivityThread.H-->Instrumentation-->Activity

  • Activity A 啟動(dòng) Activity B
    生命周期相關(guān)的整個(gè)過程是:a.onPause()-->b.onCreate()-->b.onStart()-->b.onResume()-->a.onStop()

從整個(gè)Activity流程看,主要能拆分為如下幾個(gè)關(guān)鍵段:

  1. Activity的task/stack管理
  2. Zygote fork 進(jìn)程的過程
  3. 應(yīng)用層Activity啟動(dòng)流程
    另外,starting Window流程也可以了解下。

先寫這么多,后續(xù)慢慢總結(jié)。

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

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

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