ActivityManagerService簡析
AMS在Android系統中扮演很重要的角色,主要負責系統中四大元件的啟動、切換、排程及應用程序的管理和排程等工作,其職責與作業系統中的程序管理和排程模組相類似。當發起程序啟動或者元件啟動時,都會通過Binder通訊機制將請求傳遞給AMS,AMS再做統一處理。以下以啟動Activity為例簡析AMS的管理工作。
AMS在SystemServer程序中啟動,SystemServer的main方法會呼叫startBootstrapServices方法啟動AMS
7.0及之前,AMS通過代理模式來完成Binder通訊:
Activity的直接管理者是ActivityManager,但最終管理者是AMS:當Client端發起啟動Activity請求後,AM會通過ActivityManagerNative的getDefault來得到其內部類ActivityManagerProxy的單例物件,即AMS在客戶端(使用者程序)的代理物件,作為代理類,AMP中含有AMS的引用,AMN和AMP都實現了IActivityManager,IActivityManager繼承了IInterface(實現Binder通訊的必備條件),所以AMP具備了Binder通訊能力,statActivity最終會通過AMP中的AMS引用來呼叫AMS的transact方法,向AMS傳送啟動Activity請求,並將序列化資料傳遞給AMS,隨後AMS的子類AMN的onTransact會執行,它會將具體的啟動工作交給ActivityStater來負責。 具體流程及關係圖如下:

AMS.png
8.0之後,AMS通過AIDL完成Binder通訊。具體實現比較簡單。
ActivityRecord、TaskRecord和ActivityStack
AMS中主要涉及這三個資料結構:
ActivityRecord:儲存Activity的相關資訊,比如AndroidMainifes的節點資訊,啟動Activity的包名,所在程序,圖示主題識別符號,當前Activity狀態,所屬TaskRecord等。
TaskRecord:描述一個Activity任務棧,主要維護了一個按歷史順序排列的ArrayList<ActivityRecord>,幷包含此任務棧所屬的ActivityStack等。
ActivityStack:一個管理系統中所有Activity的管理類,真實交由ActivityStackSupervisor管理,內部維護了Activity的所有狀態,並對不同狀態的Activity進行分類管理,如最近啟動的Activity,正在暫停的Activity等。
可以藉助下圖理解三者關係:

ActivityRecord、TaskRecord、ActivityStack.png