Activity啟動流程總結

AMS家族重要術語解釋
  • ActivityManagerServices,簡稱AMS,服務端對象,負責系統(tǒng)中所有Activity的生命周期。

  • ActivityThread,App的真正入口。當開啟App之后,調用main()開始運行,開啟消息循環(huán)隊列,這就是傳說的UI線程或者叫主線程。與ActivityManagerService一起完成Activity的管理工作。

  • ApplicationThread,用來實現ActivityManagerServie與ActivityThread之間的交互。在ActivityManagerSevice需要管理相關Application中的Activity的生命周期時,通過ApplicationThread的代理對象與ActivityThread通信。

  • Instrumentation,每一個應用程序只有一個Instrumetation對象,每個Activity內都有一個對該對象的引用,Instrumentation可以理解為應用進程的管家,ActivityThread要創(chuàng)建或暫停某個Activity時,都需要通過Instrumentation來進行具體的操作。

  • ActivityStack,Activity在AMS的棧管理,用來記錄經啟動的Activity的先后關系,狀態(tài)信息等。通過ActivtyStack決定是否需要啟動新的進程。

  • ActivityRecord,ActivityStack的管理對象,每個Acivity在AMS對應一個ActivityRecord,來記錄Activity狀態(tài)以及其他的管理信息。其實就是服務器端的Activity對象的映像。

  • TaskRecord,AMS抽象出來的一個“任務”的概念,是記錄ActivityRecord的棧,一個“Task”包含若干個ActivityRecord。AMS用TaskRecord確保Activity啟動和退出的順序。如果你清楚Activity的4種launchMode,那么對這概念應該不陌生。

  • zygote,zygote意為“受精卵“。Android是基于Linux系統(tǒng)的,而在Linux中,所有
    的進程都是由init進程直接或者是間接fork出來的,zygote進程也不例外。

  • 主要流程解析:

1.根Activity啟動過程中會涉及4個進程,分別是Zygote進程、Launcher進程、AMS所在進程(SystemServer進程)、應用程序進程,關系圖如下:

1、點擊桌面應用圖標,Launcher進程將啟動Activity(MainActivity)的請求以Binder的方式發(fā)送給了AMS。
2、AMS接收到啟動請求后,交付ActivityStarter處理Intent和Flag等信息,然后再交給ActivityStackSupervisior/ActivityStack 處理Activity進棧相關流程。同時以Socket方式請求Zygote進程fork新進程。
3、Zygote接收到新進程創(chuàng)建請求后fork出新進程。
4、在新進程里創(chuàng)建ActivityThread對象,新創(chuàng)建的ActivityThread就是應用的主線程,在主線程里開啟Looper消息循環(huán),開始處理創(chuàng)建Activity。
5、ActivityThread利用ClassLoader去加載Activity、創(chuàng)建Activity實例,并回調Activity的onCreate()方法,這樣便完成了Activity的啟動。

2.普通Activity啟動過程會涉及兩個進程:AMS所在進程和應用程序進程

1. Launcher請求AMS過程

Launcher -> Activty -> Instrumetation -> IActivityManager -> AMS


1)Android8.0之前是通過ActivityManagerNative的getDefault來獲取AMS的代理對象的,現在這個邏輯封裝到了ActivityManager中而不是ActivityManagerNative中

2)Android8.0之前并沒有采用AIDL,而是采用了類似AIDL的形式,用AMS的代理對象ActivityManagerProxy來與AMS進行進程間通信,Android8.0去除了ActivityManagerNative的內部類ActivityManagerProxy,代替它的是IActivityManager,它是AMS在本地的代理。

2. AMS到ApplicationThread的調用過程

AMS -> ActivityStarter -> ActivityStackSupervisor -> ActivityStack -> ApplicationThread

然后獲取ActivityStarter,

        @Override
        public ActivityStarter obtain() {
            ActivityStarter starter = mStarterPool.acquire();

            if (starter == null) {
                starter = new ActivityStarter(mController, mService, mSupervisor, mInterceptor);
            }

            return starter;
        }

1)UserHandle.getCallingUserId(),這個方法會獲得調用者的UserId,AMS根據這個UserId來確定調用者的權限
2)TaskRecord代表啟動的Activity所在的棧
3)ActivityRecord用于描述一個Activity,用來記錄一個Activity的所有信息
4)ApplicationThread繼承了IApplicationThread.Stub,是AMS所在進程(SystemServer進程)和應用程序進程的通信橋梁

3. ApplicationThread啟動Activity的過程

ApplicationThread ->ActivityThread -> H類 (hander) -> Instrumentation->Activity

ActivityThread類內部:

public final class ActivityThread extends ClientTransactionHandler {
          final ApplicationThread mAppThread = new ApplicationThread();
          final H mH = new H();
}

1)ApplicationThread是ActivityThread的內部類
2)H,它是ActivityThread的內部類并繼承自Handler,是應用程序進程中主線程的消息管理類。因為ApplicationThread是一個Binder,它的調用邏輯運行在Binder線程池中,所以這里需要用H將代碼的邏輯切換到主線程中
3)應用程序進程要啟動Activity時需要將該Activity所屬的APK加載進來,而LoadedApk就是用來描述已加載的APK文件的

參考:https://www.cnblogs.com/anni-qianqian/p/10175729.html
3分鐘看懂Activity啟動流程
https://blog.csdn.net/my_csdnboke/article/details/106173074
http://www.itdecent.cn/p/7ecb72724a26

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

相關閱讀更多精彩內容

友情鏈接更多精彩內容