學習AmS有段時日了,總結下,也好梳理一下自己的思路。小兵一個,有些地方理解不對,大家可以互相討論,交流才有進步嗎~~~
AmS可以說是Android上層系統最核心的模塊之一,其主要完成管理應用進程的生命周期以及進程的Activity,Service,Broadcast和Provider等。
從系統運行的角度看,AmS可以分為Client端和Service端:Client端運行在各個app進程,app進程實現了具體的Activity,Service等,告訴系統我有那些Activity,Service等,並且調用系統接口來完成顯示;Service端運行在SystemServer進程,是系統級別的ActivityManagerService的具體實現,其響應Client端的系統調用請求,並且管理Client端各個app進程的生命周期。
圖1 AmS基本類圖
如上面AmS基本類圖,在Client端,我們平常接觸的Application,Service和Activity都是Context的子類,Context理解為環境,上下文,也就是它能夠告訴系統當前我運行的Activity,Service的情況,顯示那些View,干那些活等。Context是一個abstract類,定義的方法具體實現在ContextImpl中,ContextWrapper作為Context的裝飾類,里面的成員變量mBase指向ContextImpl,當然這兒並不是一定要執行ContextImpl,只要是繼承了Context,實現了里面定義的接口,都可以實例化mBase對象。
另外我們注意到我們調用很多Android的接口,必須要傳入Context對象,通常我們直接將Activity對象作為參數傳入,如果方法內部定義全局變量或者static的變量,導致長期占用mContext引用,這就會導致Activity對象無法被JVM回收,對此這樣的引用占用,很可能導致OOM。我們注意到Application也是繼承自Context,所以Application也是Context,我們知道Application在一個應用啟動時就創建,所以我們的app一直存在着全局的Context對象——Application對象,那么我們在一些已知的全局占用Context對象引用的方法調用上可以傳遞Application對象來避免上面所說的OOM。
IActivityManager接口定義了app訪問AmS的接口,主要是應用請求AmS要完成某些操作,比如啟動、finish某個Activity,啟動、stop某個Service。ActivityManagerService實現了IActivityManager中定義的接口,該類可以說是AmS的核心,AmS的所有具體工作基本上都在該類中或者通過該類控制,ActivityManagerService的實例在進程SystemServer剛啟動時初始化。IApplicationThread接口定義了AmS可以訪問app的接口,AmS通過這些接口控制app進程以及完成app的響應,ApplicationThread是IApplicationThread接口的具體實現,ApplicationThread的實例是在app進程啟動時創建ActivityThread對象時初始化,ActivityThread的成員變量mAppThread就是ApplicationThread對象。另外為了實現跨進程調用,ActivityManagerProxy和ApplicationThreadProxy分別實現了IActivityManager和IApplicationThread接口,其作為各自的代理供client和server使用。
AmS也是作為一個系統服務,通過ActivityManager定義了一些借口可以供app使用,ActivityManager中訪問AmS的接口都是通過ApplicationThreadProxy實現的。
如下圖是AmS內部主要數據結構類圖,看了code相信大家都會知道這些類都是干什么的,這兒只是總結一下。
圖2 AmS內部主要數據結構類圖