Android學習——ActivityManager與Proxy模式的運用

來源:互聯網
上載者:User

 

  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模式的應用。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.