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

啟動(dòng)流程關(guān)鍵主線梳理:
點(diǎn)擊桌面App圖標(biāo),Launcher進(jìn)程采用Binder IPC向AMS發(fā)起startActivity請(qǐng)求;
AMS接收到請(qǐng)求后,向zygote進(jìn)程發(fā)送創(chuàng)建進(jìn)程的請(qǐng)求,由Zygote進(jìn)程fork出新的子進(jìn)程,即App進(jìn)程;
App進(jìn)程,通過Binder IPC向AMS發(fā)起attachApplication請(qǐng)求;
AMS在收到請(qǐng)求后,進(jìn)行一系列準(zhǔn)備工作后,再通過binder IPC向App進(jìn)程發(fā)送scheduleLaunchActivity請(qǐng)求;
App進(jìn)程的binder線程(ApplicationThread)在收到請(qǐng)求后,通過handler向主線程發(fā)送LAUNCH_ACTIVITY消息;
主線程在收到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):
app觸發(fā)activity的啟動(dòng)流程。
點(diǎn)擊桌面App圖標(biāo),Launcher進(jìn)程采用Binder IPC向AMS發(fā)起startActivity請(qǐng)求。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)。
-
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-->ActivityActivity A 啟動(dòng) Activity B
生命周期相關(guān)的整個(gè)過程是:a.onPause()-->b.onCreate()-->b.onStart()-->b.onResume()-->a.onStop()
從整個(gè)Activity流程看,主要能拆分為如下幾個(gè)關(guān)鍵段:
- Activity的task/stack管理
- Zygote fork 進(jìn)程的過程
- 應(yīng)用層Activity啟動(dòng)流程
另外,starting Window流程也可以了解下。
先寫這么多,后續(xù)慢慢總結(jié)。