Android学习-ActivityManager与Proy模式的运用_第1页
Android学习-ActivityManager与Proy模式的运用_第2页
Android学习-ActivityManager与Proy模式的运用_第3页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Android 学习ActivityManager 与 Proxy 模式的运用一 Proxy 模式意图: 为其他对象提供一种代理以控制这个对象的访问。适用性:l 远程代理( Remote Proxy ): 为一个对象在不同的地址空间提供局部代表。l虚代理(Virtual Proxy)根据需要创建开销很大的对象。使用一个代理对象作为代表,在真正的需要时进行创建。I保护代理(Protection Proxy):控制对原始对象的访问。保护代理用于对象应该有不同的访问权限的时候。l智能指引(Smart Reference):取代了简单的指针,它在访问对象时执行一些附加操作。对指向实际对象的引用计 数,

2、这样当该对象没有引用时,可以自动释放它,智能指针当第一次引用一个持久对象时,将它装入内存。在访问一个实际对象前,检查是否已经锁定了它,以确保其他对象不能改变它结构:运行时刻一种可能的代理结构的对象图:理解:1 ) Remote Proxy可以隐藏一个对象存在于不同地址空间的事实。但是提供一 个代理对象,使用起来就像在使用真正的对象一样。Virtual Proxy可以进行最优化,例如根据要求创建对象。copy - on- write。根据实际的需求对所代理的对象进行合理管理(创建加载销毁)Protection Proxies和Smart Reference都允许在访问一个对象时有一些附加的内务处

3、理;对不同的访问设置权限,对对象进行保护。二 Android 中 ActivityManager从官方文档的介绍可以看到ActivityManager的作用:是与系统所有正在运行着的Acitivity进行交互,对系统所有运行中的Activity相关信息(Task,Memory,Service,App) 进行管理和维护;提供了相应的接口用于获取这些信息。但是这些信息真正维护并不是ActivityManager来负责的,从其中的众多接口 getXXX ()可以看到其中都是使用: public List getRunningAppProcesses() return ActivityManagerN

4、ative.getDefault().getRunningAppProcesses();都是通过这个ActivityManagerNative.getDefault()的操作来实现这些信息的获取。 虽然再继续进入函数查找,仍然不能知道到底是哪一个类的对象在实施具体的操作。所以要看清楚ActivityManager真正是和谁交互,就需要去探究实施Activity Manager框架相关类作、继承关系和层次结构以及控制关系。三Android中Activity Manager相关类继承层次关系看一下类结构图如下:AAAces ()inT-crfaccIBindcrtransact ()IInterf

5、aceasBindcrOAct i vi tyManagprSi.I getDefault (). get Services ()TAct.ivi AAAces ()inT-crfaccIBindcrtransact ()IInterfaceasBindcrOAct i vi tyManagprSi.I getDefault (). get Services ()TAct.ivi t yManagerBinder+trmsact 0Acti vi tyManagerNa tive -gDcfituli : IAclivilyMatittgcr +uriTriinaa.ct () tgetDef

6、ault 0 : lActivityManagerAct! v ityMan tiger ServiceActivit yMEinagerProxv mReniote : Binderi getStrv lues ()Act iv ityManager-eiRurin i nSpryi ()lActivityManager 作为 ActivityManagerProxy 和 ActivityManagerNative 的公共接口, 所以两个类具有部分相同的接口,可以实现合理的代理模式;ActivityManagerProxy 代理类是 ActivityManagerNative 的内部类;Ac

7、tivityManagerNative是个抽象类,真正发挥作用的是它的子类ActivityManagerService (系统Service组件)。 这里设计到两个过程:代理对象建立:ActivityManagerProxy代理对象的创建; 程序执行过程:如何通过代理对象来执行真正对象请求;从图中可以看出代理类: 使用 ActivityManagerProxy 代理类, 来代理 ActivityManagerNative 类的子类 ActivityManagerService; ActivityManagerService是系统统一的Service,运行在独立的进程中;通过系统ServiceM

8、anger获取;ActivityManager 运行在一个进程里面, ActivityManagerService 运行在另一个进程内, 对象在不同的进程里面,其地址是相互独立的;实现跨进程的对象访问,需要对应进程间通信的规则, 此处是采用Binder机制实现跨进程通信;所以此处的Proxy模式的运用属于:远程代理(RemoteProxy)。下面看看这两个过程。四 代理实现过程 1 代理对象建立 是在 ActivityManager 的 getRunningServices 执行时就需要代理类来执行;public List getRunningServices(int maxNum)retur

9、n ActivityManagerNative.getDefault() getServices(maxNum, 0);继续看看 ActivityManagerNative.getDefault()到底干了什么事:实际上是关乎到Singleton型的gDefault对象创建;private static final Singleton gDefault = newSingleton() protected IActivityManager create() IBinder b = ServiceManager.getService(activity);IActivityManager am =

10、 asInterface(b);return am;ServiceManager.getService(activity);获取系统的“activity”的 Service, 所有的Service都是注册到ServiceManager进行统一管理。这样就创建了一个对ActivityManagerService实例的本地代理对象ActivityManagerProxy实例。Singleton是通用的单例 模板类。ActivityManagerNative.getDefault就返回一个此代理对象的公共接口 IActivityManager类型,就可以在本地调用远程对象的 操作方法。2 执行过程这

11、个执行过程就设计到ActivityManager框架的执行流程;简单看一下这个getServices的执行过程。Localgel Rimn i ngServ i eesAcli v i(yManagerProxynnTransactLocalgel Rimn i ngServ i eesAcli v i(yManagerProxynnTransactoriT ransae i gebScrvices此图表明整个 Client 对 Service 的访问是通过 Service 的代理对象 Proxy 进行访问的。Android 中对 Service 访问的模式都是以 Client/Server 模式进行;Client 实际

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论