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通信:
-
與AMS通信是基于其代理AMP(通過(guò)ActivityManagerNative. getDefault得到其內(nèi)部類(lèi)ActivityManagerProxy的單例對(duì)象,即AMS在客戶端(用戶進(jìn)程)的代理對(duì)象)
Activity的直接管理者是ActivityManager,但最終管理者是AMS:
- Client端發(fā)起啟動(dòng)Activity請(qǐng)求;
- AM會(huì)通過(guò)ActivityManagerNative的getDefault來(lái)得到其內(nèi)部類(lèi) ActivityManagerProxy的單例對(duì)象,即AMS在客戶端(用戶進(jìn)程)的代理對(duì)象;
- 作為代理類(lèi),AMP中含有AMS的引用,AMN和AMP都實(shí)現(xiàn)了IActivityManager;
- IActivityManager繼承了IInterface(實(shí)現(xiàn)Binder通信的必備條件),所以AMP具備了Binder通信能力;
- statActivity最終會(huì)通過(guò)AMP中的AMS引用來(lái)調(diào)用AMS的transact方法;
- 向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)系
AMS中主要涉及這三個(gè)數(shù)據(jù)結(jié)構(gòu):ActivityRecord、TaskRecord和ActivityStack;
- 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等;
- TaskRecord:描述一個(gè)Activity任務(wù)棧,主要維護(hù)了一個(gè)按歷史順序排列的ArrayList<ActivityRecord>,并包含此任務(wù)棧所屬的ActivityStack等;
- 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