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

Android学习——ActivityManager与Proxy模式的运用 - Dufresne - 博客园

一 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-07-31 03:54:10

Android学习——ActivityManager与Proxy模式的运用的相关文章

ActivityManager与Proxy模式的运用

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

Android学习CursorWrapper与Decorator模式 (转至http://www.cnblogs.com/bastard/archive/2012/05/31/2527944.html)

一 Decorator模式 意图: 动态的给一个对象添加一些额外的职责.就增加功能来说,Decorator模式相比生成子类更为灵活. 动态的给一个对象,而不是对整个类添加额外职责,说明此模式将采用的结构是组合而不是继承: 要给一个对象添加职责,通常可以使用其类的派生类对象替换当前对象,但这显得不够灵活, 继承结构属于静态形式,系统往往并不知道有这样的类存在: 而我们需要的在某些时刻让对象具有一些额外的职责,额外的职责很可能是来自我们自己的扩展或者某些时刻的特定需求等. 于是通过一种方式对现有的对

Android学习CursorWrapper与Decorator模式

Android学习CursorWrapper与Decorator模式 - Dufresne - 博客园 一 Decorator模式 意图: 动态的给一个对象添加一些额外的职责.就增加功能来说,Decorator模式相比生成子类更为灵活. 动态的给一个对象,而不是对整个类添加额外职责,说明此模式将采用的结构是组合而不是继承: 要给一个对象添加职责,通常可以使用其类的派生类对象替换当前对象,但这显得不够灵活, 继承结构属于静态形式,系统往往并不知道有这样的类存在: 而我们需要的在某些时刻让对象具有一

Android中的代理(Proxy)模式

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

Android与设计模式——代理(Proxy)模式

在阎宏博士的<JAVA与模式>一书中开头是这样描述代理(Proxy)模式的: 代理模式是对象的结构模式.代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用. 代理模式的结构. 所谓代理,就是一个人或者机构代表另一个人或者机构采取行动.在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用. 代理模式类图如下: 在代理模式中的角色: ●抽象对象角色(Phone):声明了目标对象和代理对象的共同接口,这样一来在任何可以使用目标对象

Android学习之访问者模式详解

本文和大家分享的主要是android设计模式中的访问者模式相关内容,一起来看看吧,希望对大家学习android有所帮助. 访问者模式 访问者模式属于行为模式. 访问者模式中属于相对比较复杂的一类,它会在A中让B访问,而实际在B中实际调用的是A的方法. class A { public void method1(){ System.out.println("AAAAAA"); } public void method2(B b){ b.showA(this); } } class B {

Android中ActivityManager学习笔记(3)

在之前写过2篇关于ActivityManager的文章,如下所示.都是通过实战去了解里面的信息,现在感觉太繁琐,所以做一个api介绍比较详细.就像之前学习Telephony那样,对整体了解整个ActivityManager很有用. Android中ActivityManager学习笔记(1)-MemoryInfo Android中ActivityManager学习笔记(2)-RunningServiceInfo ActivityManager android.app包,含有6个内部类: Memo

【转】 Pro Android学习笔记(五二):ActionBar(5):list模式

可以在action bar中加入spinner的下来菜单,有关spinner,可以参考Pro Android学习笔记(二十):用户界面和控制(8):GridView和Spinner. list的样式和theme有关,如果theme设置不正确,还可能会出现异常. 相关的代码如下: public class ListActionBarDemo extends SearchTestCase3 implements OnNavigationListener{ //List触发的回调函数接口    @Ov

【转】 Pro Android学习笔记(五一):ActionBar(4):标准和Tab模式

之前,我们学习的Action Bar是标准模式,Tab模式的如下图所示. 对于Tab,我们在Android学习笔记(二二): 多页显示-Tag的使用中学习过,但Action Bar的tab更适合fragment的使用.我们在之前实现的标准Action Bar的基础上添加导航用的tab,代码如下: public class TabbedActionBarDemo extends SearchTestCase3 implements ActionBar.TabListener{    @Overri