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

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

  1. ActivityManager的代理模式

    从官方文档的介绍可以看到ActivityManager的作用: 是与系统所有正在运行着的Acitivity进行交互,对系统所有运行中的Activity相关信息(Task,Memory,Service, ...

  2. Proxy模式:管理第三方API

    软件中的Barrier. 数据从程序移到DB中时,要跨越数据库的Barrier.消息从一个PC到另一个PC时,要跨越网络Barrier. 跨越可能是复杂的,很可能处理Barrier的Code会多于处理 ...

  3. 代理(Proxy)模式简介

    Proxy 模式简介 代理模式的两个应用: 打开文档时加载大图片 例如:如果有个对象是一张很大的图片,而这张图片需要花费很长时间才能显示出来,那么当这个图片包含在文档中的后面时,使用编辑器或浏览器打开 ...

  4. 设计模式之(三)Proxy模式

    今天学习Proxy模式.代理模式是在对已有对象操作困难或者不太方便时,选择用代理的方式对对象进行访问.Proxy实现的方法必须和被代理对象一致. 举一个简单的例子, 有一个Math类实现了IMath接 ...

  5. Proxy 模式

    在以下集中情况下可以用 Proxy模式解决问题: 1)创建开销大的对象时候,比如显示一幅大的图片,我们将这个创建的过程交给代理去完成,GoF 称之为虚代理(Virtual Proxy): 2)为网络上 ...

  6. 【结构型】Proxy模式

    代理模式是指为其他对象提供代理来控制对象的访问.这种手段有时候可以给我们带来许多好处.如:通过代理可以实现异步响应处理:通过代理可以起到保护或限制对象的使用的作用,从而提高安全性. 在设计上,用户使用 ...

  7. .Net Core下通过Proxy 模式 使用 WCF

    .NET Core下的WCF客户端也是开源的,这次发布.NET Core 2.0,同时也发布了 WCF for .NET Core 2.0.0, 本文介绍在.NET Core下如何通过Proxy 消费 ...

  8. Java设计模式(10)代理模式(Proxy模式)

    理解并使用设计模式,能够培养我们良好的面向对象编程习惯,同时在实际应用中,可以如鱼得水,享受游刃有余的乐趣. Proxy是比较有用途的一种模式,而且变种较多,应用场合覆盖从小结构到整个系统的大结构,P ...

  9. 代理(Proxy)模式简介

    一.代理(Proxy)模式简介 代理模式是结构型模式. 代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用. 代理对象要继承于抽象主题,并控制原对象的引用 二.简单例子 抽象主题类 ...

随机推荐

  1. Mac 下如何使用sed -i命令

    今天在学习Linux的过程中发现了sed这一项指令 首先,sed的全称是:Stream Editor 调用sed命令有两种形式: sed [options] 'command' file(s) sed ...

  2. 团队作业8----第二次项目冲刺(Beta阶段) 第四天

    BETA阶段冲刺第四天 1.小会议ing 2.每个人的工作 (1)昨天已完成的工作 1.修改了学生上传的方式: 2.完善了学生和老师修改的代码: (2) 今天计划完成的工作 (3) 工作中遇到的困难: ...

  3. JAVA基础第一组(前5道题)

    1.[程序1] 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一 对兔子,假如兔子都不死,问每个月的兔子总数为多少?        1.程序分析: 兔 ...

  4. 20152112308 《Java程序设计》第3周学习总结

    本周学习总结 书面作业 1.代码阅读 public class Test1 { private int i = 1;//这行不能修改 private static int j = 2; public ...

  5. Java课程设计-学生基本信息管理 201521123036

    团队课程设计博客链接 团队博客链接 个人负责模块或任务说明 个人负责模块 任务说明 用户登录,注册 登录,注册,判断用户是否存在,添加用户 学生信息管理菜单 按钮,跳转相应界面,退出程序 学生信息添加 ...

  6. java第十三次作业

    1. 本周学习总结 以你喜欢的方式(思维导图.OneNote或其他)归纳总结多网络相内关容. 2. 书面作业 1. 网络基础 1.1 比较ping www.baidu.com与ping cec.jmu ...

  7. 201521123074 《Java程序设计》第9周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. 2. 书面作业 本次PTA作业题集异常 Q1.常用异常 题目5-1 1.1 截图你的提交结果(出现学号) 1.2 自 ...

  8. 201521123053《Java程序设计》第十周学习总结

    ---恢复内容开始--- 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常与多线程相关内容. 在java多线程程序中,所有线程都不允许抛出未捕获的checked excepti ...

  9. JQUERY选中问题

    单选,复选,下拉列表的全选选中问题 基本思路就是找到元素,操作元素,关于怎么找看jquery简介,主要学习记住具体操作用到的方法   复选框的全选以及设置选中问题:   jquery中提供prop方法 ...

  10. Log4J:Log4J三大组件:Logger+Appender+Layout 格式化编程详解

    快速了解Log4J Log4J的三个组件: Logger:日志记录器,负责收集处理日志记录     (如何处理日志) Appender:日志输出目的地,负责日志的输出  (输出到什么 地方) Layo ...