zoukankan      html  css  js  c++  java
  • ActivityManager的代理模式

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

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

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

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

    public List<RunningAppProcessInfo> getRunningAppProcesses() {
        return ActivityManagerNative.getDefault().getRunningAppProcesses();
    } 

      都是通过这个ActivityManagerNative.getDefault()的操作来实现这些信息的获取。

    虽然再继续进入函数查找,仍然不能知道到底是哪一个类的对象在实施具体的操作。

      所以要看清楚ActivityManager真正是和谁交互,就需要去探究实施Activity Manager框架相关类作、继承关系和层次结构以及控制关系。

         http://androidxref.com/6.0.1_r10/xref/frameworks/base/core/java/android/app/ActivityManagerNative.java

     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进行统一管理。

        static public IActivityManager asInterface(IBinder obj) {
            if (obj == null) {
                return null;
            }
            IActivityManager in =
                (IActivityManager)obj.queryLocalInterface(descriptor);
            if (in != null) {
                return in;
            }
    
            return new ActivityManagerProxy(obj);
        }

      这样就创建了一个对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端的使用。

  • 相关阅读:
    js中的true和false
    js对象
    javascript性能
    js中数组的操作
    hadoop入门手册1:hadoop【2.7.1】【多节点】集群配置【必知配置知识1】
    hadoop2.7【单节点】单机、伪分布、分布式安装指导
    hadoop2.2使用手册2:如何运行自带wordcount
    hadoop2.x常用端口、定义方法及默认端口、hadoop1.X端口对比
    hadoop2.X使用手册1:通过web端口查看主节点、slave1节点及集群运行状态
    hadoop(2.x)以hadoop2.2为例完全分布式最新高可靠安装文档
  • 原文地址:https://www.cnblogs.com/mingfeng002/p/10650364.html
Copyright © 2011-2022 走看看