ActivityManagerService 通信淺析

AMS在Android系統(tǒng)中主要負(fù)責(zé):

  • 四大組件的啟動(dòng)、切換、調(diào)度;
  • 應(yīng)用進(jìn)程的管理和調(diào)度;

其職責(zé)與操作系統(tǒng)中的進(jìn)程管理和調(diào)度模塊相類(lèi)似。
當(dāng)發(fā)起進(jìn)程啟動(dòng)或者組件啟動(dòng)時(shí),都會(huì)通過(guò)Binder通信將請(qǐng)求傳遞給AMS,AMS再做統(tǒng)一處理。

AMS通信:

  • \color{red}{7.0及之前,AMS通過(guò)代理模式來(lái)完成Binder通信;}
    與AMS通信是基于其代理AMP(通過(guò)ActivityManagerNative. getDefault得到其內(nèi)部類(lèi)ActivityManagerProxy的單例對(duì)象,即AMS在客戶端(用戶進(jìn)程)的代理對(duì)象)

Activity的直接管理者是ActivityManager,但最終管理者是AMS:

  1. Client端發(fā)起啟動(dòng)Activity請(qǐng)求;
  2. AM會(huì)通過(guò)ActivityManagerNative的getDefault來(lái)得到其內(nèi)部類(lèi) ActivityManagerProxy的單例對(duì)象,即AMS在客戶端(用戶進(jìn)程)的代理對(duì)象;
  3. 作為代理類(lèi),AMP中含有AMS的引用,AMN和AMP都實(shí)現(xiàn)了IActivityManager;
  4. IActivityManager繼承了IInterface(實(shí)現(xiàn)Binder通信的必備條件),所以AMP具備了Binder通信能力;
  5. statActivity最終會(huì)通過(guò)AMP中的AMS引用來(lái)調(diào)用AMS的transact方法;
  6. 向AMS發(fā)送啟動(dòng)Activity請(qǐng)求,并將序列化數(shù)據(jù)傳遞給AMS,隨后AMS的子類(lèi)AMN的onTransact會(huì)執(zhí)行,它會(huì)將具體的啟動(dòng)工作交給ActivityStater來(lái)負(fù)責(zé);

具體流程及關(guān)系圖如下:


具體流程及關(guān)系
  • \color{red}{8.0之后,AMS通過(guò)AIDL完成Binder通信;}

AMS中主要涉及這三個(gè)數(shù)據(jù)結(jié)構(gòu):ActivityRecord、TaskRecord和ActivityStack;

  1. ActivityRecord:存儲(chǔ)Activity的相關(guān)信息,比如AndroidMainifes的節(jié)點(diǎn)信息,啟動(dòng)Activity的包名,所在進(jìn)程,圖標(biāo)主題標(biāo)識(shí)符,當(dāng)前Activity狀態(tài),所屬TaskRecord等;
  2. TaskRecord:描述一個(gè)Activity任務(wù)棧,主要維護(hù)了一個(gè)按歷史順序排列的ArrayList<ActivityRecord>,并包含此任務(wù)棧所屬的ActivityStack等;
  3. ActivityStack:一個(gè)管理系統(tǒng)中所有Activity的管理類(lèi),真實(shí)交由ActivityStackSupervisor 管理,內(nèi)部維護(hù)了Activity的所有狀態(tài),并對(duì)不同狀態(tài)的Activity進(jìn)行分類(lèi)管理,如最近啟動(dòng)的Activity,正在暫停的Activity等。

三者關(guān)系:


ActivityRecord、TaskRecord和ActivityStack
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容