


- 點擊桌面 App 圖標(biāo),Launcher 進程采用 Binder IPC 向 system_server 進程發(fā)起 startActivity 請求;
- system_server 進程接收到請求后,采用 Socket IPC 向 zygote 進程發(fā)送創(chuàng)建進程的請求;
- Zygote 進程 fork 出新的子進程,即 App 進程;
- App 進程,通過 Binder IPC 向 sytem_server 進程發(fā)起 attachApplication 請求;
- system_server 進程在收到請求后,進行一系列準(zhǔn)備工作后,再通過 binder IPC 向 App 進程發(fā)送 scheduleLaunchActivity 請求;
- App 進程的 binder 線程(ApplicationThread)在收到請求后,通過 Handler 向主線程發(fā)送 LAUNCH_ACTIVITY 消息;
- 主線程在收到 Message 后,通過反射機制創(chuàng)建目標(biāo) Activity,并回調(diào) Activity#onCreate() 方法;
- 至此 App 便正式啟動,開始進入 Activity 生命周期,執(zhí)行完 onCreate/onStart/onResume 方法,UI 渲染結(jié)束后便可以看到 App 的主界面。
相關(guān)對象介紹
ActivityThread 代表應(yīng)用程序的 UI 線程。App 啟動之后,會執(zhí)行 main() 方法,開啟消息循環(huán)。與 AMS 配合一起完成 Activity 的管理工作。
ApplicationThread ActivityThread 的內(nèi)部類,繼承 Stub,
用來實現(xiàn) AMS 與 ActivityThread 之間的交互。AMS 通過 ApplicationThread 的代理對象與 ActivityThread 通訊。Instrumentation 監(jiān)控系統(tǒng)和應(yīng)用的交互以及相關(guān)生命周期方法的調(diào)用。每個進程都會存在一個 Instrumentation 對象。
ActivityStack 負責(zé)管理在 Stack 和 Task 中的 Activity。AMS 用于 Activity 的棧管理,記錄已經(jīng)啟動的 Activity 的先后關(guān)系,狀態(tài)信息等。
ActivityStackSupervisor 負責(zé)管理 Stack 和 Task 的操作,可以理解為管理 ActivityStack。
ActivityTaskManagerService 用于管理 Activity 及其容器(任務(wù)、堆棧、顯示等)的系統(tǒng)服務(wù)。
ActivityRecord ActivityStack 的管理對象,每個 Activity 在 AMS 對應(yīng)一個 ActivityRecord,來記錄 Activity 的狀態(tài)以及其他的管理信息。其實就是服務(wù)器端的 Activity 對象的映像。
TaskRecord AMS 抽象出來的一個“任務(wù)”的概念,是記錄 ActivityRecord 的棧,一個“Task”包含若干個 ActivityRecord。AMS 用 TaskRecord 確保 Activity 啟動和退出的順序。
A task is a stack of activities. 任務(wù)是用戶在執(zhí)行某項工作時與之互動的一系列 Activity 的集合。
public class TransactionExecutor {
public void execute(ClientTransaction transaction) {
executeCallbacks(transaction);
executeLifecycleState(transaction);
}
public void executeCallbacks(ClientTransaction transaction) {
final List<ClientTransactionItem> callbacks = transaction.getCallbacks();
final int size = callbacks.size();
for (int i = 0; i < size; ++i) {
final ClientTransactionItem item = callbacks.get(i);
item.execute(mTransactionHandler, token, mPendingActions);
item.postExecute(mTransactionHandler, token, mPendingActions);
cycleToPath(r, postExecutionState, shouldExcludeLastTransition, transaction);
}
}
private void cycleToPath(ActivityClientRecord r, int finish, boolean excludeLastState,
ClientTransaction transaction) {
final int start = r.getLifecycleState();
// getLifecyclePath() 方法返回待執(zhí)行生命周期的數(shù)組 ,此時返回 [2,3]
final IntArray path = mHelper.getLifecyclePath(start, finish, excludeLastState);
performLifecycleSequence(r, path, transaction);
}
private void performLifecycleSequence(ActivityClientRecord r, IntArray path,
ClientTransaction transaction) {
final int size = path.size();
for (int i = 0, state; i < size; i++) {
state = path.get(i);
switch (state) {
case ON_CREATE:
mTransactionHandler.handleLaunchActivity(r, ...);
break;
case ON_START:
mTransactionHandler.handleStartActivity(r.token, ...);
break;
case ON_RESUME:
mTransactionHandler.handleResumeActivity(r.token, ...);
break;
// ...
}
}
}
/** Transition to the final state if requested by the transaction. */
private void executeLifecycleState(ClientTransaction transaction) {
// Cycle to the state right before the final requested state.
cycleToPath(r, lifecycleItem.getTargetState(), true /* excludeLastState */, transaction);
// Execute the final transition with proper parameters.
lifecycleItem.execute(mTransactionHandler, token, mPendingActions);
lifecycleItem.postExecute(mTransactionHandler, token, mPendingActions);
}
}
- ClientTransaction 客戶端事務(wù)控制者
- ClientLifecycleManager 客戶端的生命周期事務(wù)控制者
- TransactionExecutor 遠程通信事務(wù)執(zhí)行者
總結(jié)

參考
[1] 一個 APP 從啟動到主頁面顯示經(jīng)歷了哪些過程
[2] startActivity 啟動過程分析 - Gityuan
[3] 【譯】Android Application 啟動流程分析
[4] 【凱子哥帶你學(xué) Framework】Activity 啟動過程全解析
[5] Android Framework 之 Activity 啟動流程(一)
[6] 任務(wù)和返回堆棧