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é)如下:
- 無論是通過 Launcher 來啟動 Activity,還是通過Activity內(nèi)部調(diào)用 startActivity 接口來啟動新的 Activity,都通過 Binder 進(jìn)程間通信進(jìn)入到 ActivityManagerService 進(jìn)程中,并且調(diào)用 ActivityManagerService.startActivity 接口;
- ActivityManagerService 調(diào)用 ActivityStack.startActivityMayWait 來做準(zhǔn)備要啟動的Activity的相關(guān)信息;
- 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)程了;
- ApplicationThread 不執(zhí)行真正的啟動操作,它通過調(diào)用 ActivityManagerService.activityPaused 接口進(jìn)入到 ActivityManagerService 進(jìn)程中,看看是否需要創(chuàng)建新的進(jìn)程來啟動 Activity;
- 對于通過點(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)行啟動;
- ActivityManagerServic 調(diào)用 ApplicationThread.scheduleLaunchActivity 接口,通知相應(yīng)的進(jìn)程執(zhí)行啟動 Activity 的操作;
- ApplicationThread 把這個啟動 Activity 的操作轉(zhuǎn)發(fā)給 ActivityThread,ActivityThread 通過 ClassLoader 導(dǎo)入相應(yīng)的 Activity 類,然后把它啟動起來。


