二 Android中ActivityManager

从官方文档的介绍可以看到ActivityManager的作用:

  是与系统所有正在运行着的Acitivity进行交互,对系统所有运行中的Activity相关信息(Task,Memory,Service,App)

  进行管理和维护;提供了相应的接口用于获取这些信息。

 

但是这些信息真正维护并不是ActivityManager来负责的,从其中的众多接口getXXX()可以看到其中都是使用:

public List 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 getRunningServices(int maxNum)

    return ActivityManagerNative.getDefault()

      getServices(maxNum, 0);

  }

  继续看看ActivityManagerNative.getDefault()到底干了什么事:

  实际上是关乎到Singleton类型的gDefault对象创建;

private static final Singleton gDefault = new       Singleton() {      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端的使用。

 

更多相关文章

  1. Android(安卓)核心分析 之六 -----IPC框架分析 Binder,Service,Ser
  2. Android中的Serialable和Parcelable的区别
  3. Android应用程序启动过程——Launcher源码分析
  4. Android中AIDL实现进程通信(附源码下载)
  5. Service与Android系统设计(3)
  6. android学习笔记之十二进程通信(IPC)
  7. [5] Zygote
  8. Android(安卓)性能优化之使用MAT分析内存泄露问题
  9. Android(安卓)BroadcastAnyWhere(Google Bug 17356824)漏洞详细

随机推荐

  1. Android(安卓)adapter中调用activity中的
  2. android基于tcpdump的数据包捕获完整解决
  3. Android适配(屏幕适配、国际化适配)
  4. Android(安卓): java.lang.UnsatisfiedLi
  5. android平台下基于MediaRecorder和AudioR
  6. Android星星评分控件RatingBar的使用
  7. Android studio 添加assets文件夹
  8. android 获取屏幕高度,宽度,状态栏高度
  9. 搭建Android(安卓)CTS测试环境总结
  10. Android ROM 开发技能图谱