Android學習——ActivityManager與Proxy模式的運用
一 Proxy模式
意圖:
為其他對象提供一種代理以控制這個對象的訪問。
適用性:
l 遠程代理( Remote Proxy ): 為一個對象在不同的地址空間提供局部代表。
l 虛代理(Virtual Proxy)根據需要創建開銷很大的對象。使用一個代理對象作為代表,在真正的需要時進行創建。
l 保護代理(Protection Proxy):控制對原始對象的訪問。保護代理用於對象應該有不同的訪問權限的時候。
l 智能指引(Smart Reference): 取代了簡單的指針,它在訪問對象時執行一些附加操作。對指向實際對象的引用計數,
這樣當該對象沒有引用時,可以自動釋放它,智能指針當第一次引用一個持久對象時,將它裝入內存。
在訪問一個實際對象前,檢查是否已經鎖定了它,以確保其他對象不能改變它
結構:
運行時刻一種可能的代理結構的對象圖:
理解:
1 ) Remote Proxy可以隱藏一個對象存在於不同地址空間的事實。但是提供一
個代理對象,使用起來就像在使用真正的對象一樣。
2) Virtual Proxy 可以進行最優化,例如根據要求創建對象。copy - on – write。
根據實際的需求對所代理的對象進行合理管理(創建加載銷毀)
3) Protection Proxies和Smart Reference都允許在訪問一個對象時有一些附加
的內務處理;對不同的訪問設置權限,對對象進行保護。
二 Android中ActivityManager
從官方文檔的介紹可以看到ActivityManager的作用:
是與系統所有正在運行着的Acitivity進行交互,對系統所有運行中的Activity相關信息(Task,Memory,Service,App)
進行管理和維護;提供了相應的接口用於獲取這些信息。
但是這些信息真正維護並不是ActivityManager來負責的,從其中的眾多接口getXXX()可以看到其中都是使用:
public List<RunningAppProcessInfo> getRunningAppProcesses() { return ActivityManagerNative.getDefault().getRunningAppProcesses(); }
都是通過這個ActivityManagerNative.getDefault()的操作來實現這些信息的獲取。
雖然再繼續進入函數查找,仍然不能知道到底是哪一個類的對象在實施具體的操作。
所以要看清楚ActivityManager真正是和誰交互,
就需要去探究實施Activity Manager框架相關類作、繼承關系和層次結構以及控制關系。
三 Android中Activity Manager相關類繼承層次關系
看一下類結構圖如下:
IActivityManager作為ActivityManagerProxy和ActivityManagerNative的公共接口,
所以兩個類具有部分相同的接口,可以實現合理的代理模式;
ActivityManagerProxy代理類是ActivityManagerNative的內部類;
ActivityManagerNative是個抽象類,真正發揮作用的是它的子類ActivityManagerService(系統Service組件)。
這里設計到兩個過程:
代理對象建立:ActivityManagerProxy代理對象的創建;
程序執行過程:如何通過代理對象來執行真正對象請求;
從圖中可以看出代理類:使用ActivityManagerProxy代理類,來代理ActivityManagerNative類的子類ActivityManagerService;
ActivityManagerService是系統統一的Service,運行在獨立的進程中;通過系統ServiceManger獲取;
ActivityManager運行在一個進程里面,ActivityManagerService運行在另一個進程內,
對象在不同的進程里面,其地址是相互獨立的;實現跨進程的對象訪問,需要對應進程間通信的規則,
此處是采用Binder機制實現跨進程通信;所以此處的Proxy模式的運用屬於:遠程代理(RemoteProxy)。
下面看看這兩個過程。
四 代理實現過程
1 代理對象建立
是在ActivityManager的getRunningServices執行時就需要代理類來執行;
public List<RunningServiceInfo> getRunningServices(int maxNum)
return ActivityManagerNative.getDefault()
getServices(maxNum, 0);
}
繼續看看ActivityManagerNative.getDefault()到底干了什么事:
實際上是關乎到Singleton<IActivityManager>類型的gDefault對象創建;
private static final Singleton<IActivityManager> gDefault = new Singleton<IActivityManager>() { protected IActivityManager create() { IBinder b = ServiceManager.getService("activity"); IActivityManager am = asInterface(b); return am; } };
ServiceManager.getService("activity");獲取系統的“activity”的Service,
所有的Service都是注冊到ServiceManager進行統一管理。
這樣就創建了一個對ActivityManagerService實例的本地代理對象ActivityManagerProxy實例。Singleton是通用的單例模板類。
ActivityManagerNative.getDefault就返回一個此代理對象的公共接口IActivityManager類型,就可以在本地調用遠程對象的操作方法。
2 執行過程
這個執行過程就設計到ActivityManager框架的執行流程;簡單看一下這個getServices的執行過程。
此圖表明整個Client對Service的訪問是通過Service的代理對象Proxy進行訪問的。
Android中對Service訪問的模式都是以Client/Server模式進行;
Client實際上訪問Service是通過對Service的建立代理的Proxy對象進行訪問的——代理模式。
此處也可以看到如果ActivityManager相關的Remote端的Service組件可以任意進行改變替換,依然不會影響到Local端的使用。
AcitivityManager的框架十分復雜,此處主要是為了學習Proxy模式的應用。