根Activity的啟動過程(應(yīng)用程序啟動過程)

Activity 的啟動過程分為兩種,一種是根 Activity 的啟動過程,另一種是普通 Activity 的啟動過程。根 Activity 指的是應(yīng)用程序啟動的第一個 Activity,因此根 Activity 的啟動過程一般情況下也可以理解為應(yīng)用程序的啟動過程。
根 Activity 的啟動過程比較復(fù)雜,分為 3 個部分:Launcher 請求 AMS 過程、AMS 到 ApplicationThread 的調(diào)用過程和 ActivityThread 啟動 Activity。

  • 1、Launcher 請求 AMS 過程

    Launcher請求AMS過程時序圖

  • 2、AMS 到 ApplicationThread 的調(diào)用過程

    AMS到ApplicationThread的調(diào)用過程時序圖

  • 3、ActivityThread 啟動 Activity 的過程

    ActivityThread啟動Activity的過程時序圖

啟動過程設(shè)計(jì)到 4 個進(jìn)程:Zygote 進(jìn)程、Launcher 進(jìn)程、AMS 所在進(jìn)程(SystemServer 進(jìn)程)、應(yīng)用程序進(jìn)程,它們之間的關(guān)系如下:


根Activity啟動過程中涉及的進(jìn)程之間的關(guān)系

4 個進(jìn)程調(diào)用時序圖如下:


根Activity啟動過程中進(jìn)程調(diào)用時序圖

啟動過程總結(jié)如下:

  1. 無論是通過 Launcher 來啟動 Activity,還是通過Activity內(nèi)部調(diào)用 startActivity 接口來啟動新的 Activity,都通過 Binder 進(jìn)程間通信進(jìn)入到 ActivityManagerService 進(jìn)程中,并且調(diào)用 ActivityManagerService.startActivity 接口;
  2. ActivityManagerService 調(diào)用 ActivityStack.startActivityMayWait 來做準(zhǔn)備要啟動的Activity的相關(guān)信息;
  3. ActivityStack 通知 ApplicationThread 要進(jìn)行 Activity 啟動調(diào)度了,這里的 ApplicationThread 代表的是調(diào)用 ActivityManagerService.startActivity 接口的進(jìn)程,對于通過點(diǎn)擊應(yīng)用程序圖標(biāo)的情景來說,這個進(jìn)程就是 Launcher 了,而對于通過在 Activity 內(nèi)部調(diào)用 startActivity 的情景來說,這個進(jìn)程就是這個 Activity 所在的進(jìn)程了;
  4. ApplicationThread 不執(zhí)行真正的啟動操作,它通過調(diào)用 ActivityManagerService.activityPaused 接口進(jìn)入到 ActivityManagerService 進(jìn)程中,看看是否需要創(chuàng)建新的進(jìn)程來啟動 Activity;
  5. 對于通過點(diǎn)擊應(yīng)用程序圖標(biāo)來啟動Activity的情景來說,ActivityManagerService 在這一步中,會調(diào)用 startProcessLocked 來創(chuàng)建一個新的進(jìn)程,而對于通過在Activity內(nèi)部調(diào)用 startActivity 來啟動新的 Activity 來說,這一步是不需要執(zhí)行的,因?yàn)樾碌?Activity 就在原來的 Activity 所在的進(jìn)程中進(jìn)行啟動;
  6. ActivityManagerServic 調(diào)用 ApplicationThread.scheduleLaunchActivity 接口,通知相應(yīng)的進(jìn)程執(zhí)行啟動 Activity 的操作;
  7. ApplicationThread 把這個啟動 Activity 的操作轉(zhuǎn)發(fā)給 ActivityThread,ActivityThread 通過 ClassLoader 導(dǎo)入相應(yīng)的 Activity 類,然后把它啟動起來。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

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