ActivityManager与Proxy模式的运用

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

时间: 2024-11-10 13:23:25

ActivityManager与Proxy模式的运用的相关文章

Android学习——ActivityManager与Proxy模式的运用

Android学习--ActivityManager与Proxy模式的运用 - Dufresne - 博客园 一 Proxy模式 意图: ?????? 为其他对象提供一种代理以控制这个对象的访问. 适用性: l? 远程代理( Remote Proxy ): 为一个对象在不同的地址空间提供局部代表. l? 虚代理(Virtual Proxy)根据需要创建开销很大的对象.使用一个代理对象作为代表,在真正的需要时进行创建. l? 保护代理(Protection Proxy):控制对原始对象的访问.保护

Android中的代理(Proxy)模式

一. Proxy模式定义 Proxy模式,也称代理模式,是经典设计模式中的一种结构型模式,其定义是为其他对象提供一种代理以控制对这个对象的访问,简单的说就是在访问和被访问对象中间加上的一个间接层,以隔离访问者和被访问者的实现细节. 二. Proxy模式理解 当无法或者不想直接访问某个对象, 或者访问某个对象存在困难时, 可以通过一个代理对象来间接访问, 为了保证客户端使用的透明性, 委托对象与代理对象需要实现相同的接口. 例如,ActivityManager 作为客户端要访问 AMS,AMS 不

ActivityManager的代理模式

从官方文档的介绍可以看到ActivityManager的作用: 是与系统所有正在运行着的Acitivity进行交互,对系统所有运行中的Activity相关信息(Task,Memory,Service,App) 进行管理和维护:提供了相应的接口用于获取这些信息. 但是这些信息真正维护并不是ActivityManager来负责的,从其中的众多接口getXXX()可以看到其中都是使用 public List<RunningAppProcessInfo> getRunningAppProcesses(

Net Core下通过Proxy 模式

Net Core下通过Proxy 模式 NET Core下的WCF客户端也是开源的,这次发布.NET Core 2.0,同时也发布了 WCF for .NET Core 2.0.0, 本文介绍在.NET Core下如何通过Proxy 消费WCF服务. 我们现在直接可以在 standard 2.0下调用wcf服务了,不过 Microsoft WCF Web Service Reference Provider 目前是beta阶段,要使用这个插件,需要安装一个Visual Studio插件,下载地址

Java代理模式(Proxy模式)

理解并使用设计模式,能够培养我们良好的面向对象编程习惯,同时在实际应用中,可以如鱼得水,享受游刃有余的乐趣. Proxy是比较有用途的一种模式,而且变种较多,应用场合覆盖从小结构到整个系统的大结构,Proxy是代理的意思,我们也许有代理服务器等概念,代理概念可以解释为:在出发点到目的地之间有一道中间层,意为代理. 设计模式中定义:为其他对象提供一种代理以控制对这个对象的访问. 为什么要使用代理模式 授权机制 不同级别的用户对同一对象拥有不同的访问权利,如Jive论坛系统中,就使用Proxy进行授

代理(Proxy)模式简介

一.代理(Proxy)模式简介 代理模式是结构型模式. 代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用. 代理对象要继承于抽象主题,并控制原对象的引用 二.简单例子 抽象主题类 package proxy; /* * 抽象主题 */ public abstract class Subject { /* * 请求方法 */ abstract public void Request(); } 真实主题类,继承抽象 package proxy; /* * 真实主题 */ publ

Proxy模式详解--设计模式(11)

Proxy模式的产生原因:        在某些情况下,一个对象不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用. 当由于某些特定的需要调用的对象在另外一台机器上,需要跨越网络才能访问,在没有WebService的情况下我们需要直接coding去处理网络连接.处理打包.解包等等非常复杂的步骤,而WebService的出现帮我们解决了其中的一些问题简化客户端的处理,我们只需在客户端建立一个远程对象的代理,客户端就象调用本地对象一样调用该代理,再由代理去跟实际对象联

Net Core下通过Proxy 模式 使用 WCF

.NET Core下的WCF客户端也是开源的,这次发布.NET Core 2.0,同时也发布了 WCF for .NET Core 2.0.0, 本文介绍在.NET Core下如何通过Proxy 消费WCF服务. 我们现在直接可以在 standard 2.0下调用wcf服务了,不过 Microsoft WCF Web Service Reference Provider 目前是beta阶段,要使用这个插件,需要安装一个Visual Studio插件,下载地址: https://marketpla

设计模式 之代理(Proxy)模式

为什么这里要定义代理呢?所谓代理代理,当然就是你不想做的事,找别人去做,这就是代理.所以,当你写代码的时候,你想保持类的简单性.重用性,你就可以把事件尽量都交给其它类去做,自己只管做好自己的事.也就是SRP,单一职责原则.如果一个类关注的点过多,做的事情太多.这些事情不管是你直接做的,还是调用别的对象去完成的.这都不行,自己做这些事,那就会使类的功能复杂化,维护不方便.而过多地调用其它对象来完成一些事情,表面上看起来好像不错,实际上是过度耦合了.我们编写类的原则应该是追求高内聚,低耦合的.可能你