Android系統程序之Activity管理——ActivityManagerService(AMS)
一. 為什麼會有AMS
對於Android app開發人員來說,Activity是其打交道最多的元件了:App的每一個介面都對應於一個Activity。每個Activity都有他的生命週期(那幾個生命週期應該已經爛熟於心了吧),所以我們應該有一種機制來記錄並管理這些Activity的狀態資訊,從而根據這些資訊,來對App的記憶體進行分配回收等管理操作。綜上,掌握好AMS的工作原理,可以較好地理解Activity元件的狀態資訊,從而瞭解到app所處的狀態:這對於App開發人員,當然也包括Android系統開發人員是十分必要的。
AMS主要職責:記錄並管理Activity(以及其他元件)的狀態(不包括內容顯示等),同時可以提供查詢功能。
二. Activity Stack
前面說到了AMS主要負責記錄並管理Activity(或其他元件)的狀態,具體的實現是在ActivityStack類中。首先該類通過列舉型別定義了Activity所有可能經歷的狀態,如下:
enum ActivityState{
INITIALIZING,
RESUMED,
PAUSING,
PAUSED,
STOPPING,
STOPPED,
FINISHING,
DESTROYING,
DESTROYED
}
有了這些狀態後,AMS又是如何記錄Activity等的狀態的呢?ActivityStack類利用了Java中封裝比較好的集合工具:這裡是利用了多個ArrayList,其中的元素都是ActivityRecord型別。ActivityRecord類負責記錄每個Activity的執行時資訊。
ActivityState,ArrayList<ActivityRecord>,ActivityRecord構成了ActivityStack的主要框架。他主要通過這三種變數來記錄並管理Activity等元件的狀態資訊。
另外,需要注意的是,ActivityManagerService其實只是一個執行緒,他寄生於SystemServer程序。(我在其他地方已經說過了,這裡小小地回顧下)Android系統在啟動時,有三類最重要的系統程序要啟動:ServiceManager,Zygote(啟動過程中會啟動DVM虛擬機器,並會啟動SystemServer程序)和SystemServer(提供本地服務程序以及Java語言編寫的眾多系統服務)。其中,SystemServer啟動後會同時啟動一些重要的系統服務,如AMS,WMS等。在這個階段,AMS就這樣寄生於SystemServer啟動了。同時,SystemServer會啟動兩類系統服務:本地服務,Java層服務。本地層服務包括:SurfaceFlinger,AudioFlinger等,Java層服務包括:AMS,WMS等。
三. Activity Task