Android Activity 啟動流程

android-activity-start-process

android-activity-start-process

android-activity-start-process
  1. 點擊桌面 App 圖標(biāo),Launcher 進程采用 Binder IPC 向 system_server 進程發(fā)起 startActivity 請求;
  2. system_server 進程接收到請求后,采用 Socket IPC 向 zygote 進程發(fā)送創(chuàng)建進程的請求;
  3. Zygote 進程 fork 出新的子進程,即 App 進程;
  4. App 進程,通過 Binder IPC 向 sytem_server 進程發(fā)起 attachApplication 請求;
  5. system_server 進程在收到請求后,進行一系列準(zhǔn)備工作后,再通過 binder IPC 向 App 進程發(fā)送 scheduleLaunchActivity 請求;
  6. App 進程的 binder 線程(ApplicationThread)在收到請求后,通過 Handler 向主線程發(fā)送 LAUNCH_ACTIVITY 消息;
  7. 主線程在收到 Message 后,通過反射機制創(chuàng)建目標(biāo) Activity,并回調(diào) Activity#onCreate() 方法;
  8. 至此 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é)

Antivity 啟動流程時序圖

參考

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

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

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

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