日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android之ActivityManager与Proxy模式的运用

發布時間:2023/12/4 Android 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android之ActivityManager与Proxy模式的运用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

二 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 = newSingleton<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端的使用。

?

總結

以上是生活随笔為你收集整理的Android之ActivityManager与Proxy模式的运用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。