二 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端的使用。

Android之ActivityManager与Proxy模式的运用相关推荐

  1. 当Android遇上设计模式之代理(Proxy)模式

    文章目录 1. 代理模式 1.1 代码实现 1.2 使用场景 2. 静态代理与动态代理 设计模式六大原则: 单一职责原则:就一个类仅有一个引起它变化的原因,即类承担的职责单一性: 开放封闭原则:类.模 ...

  2. Android常用设计模式之Builder模式理解

    Android常用设计模式之Builder模式 1 单例模式 2 Builder模式 Builder模式的应用场景 总结 1 单例模式 单例模式之前有详细的介绍,可移步到链接: 常见的单例模式及其特点 ...

  3. Android架构篇-4 架构模式MVVM

    Android架构篇-4 架构模式MVVM MVVM原理 #mermaid-svg-CJmTYPxP5GkKNMic .label{font-family:'trebuchet ms', verdan ...

  4. Android学习 StateMachine与State模式

    2019独角兽企业重金招聘Python工程师标准>>> 一 State模式 意图: 允许一个对象在其内部状态改变时改变它的行为.对象看起来似乎修改了它的类.(Objects for ...

  5. Singleton + Proxy 模式+AOP

    在.NET 中,可以通过CBO来实现简单的一个msg级别的AOP, 可以参考我以前写的一个简单例子. 采用AOP 的观点来 Log 所有方法的调用 昨天正好培训了一下Remoting, 其实可以用一个 ...

  6. 结构型模式之Proxy模式

    1.意图 为其他对象提供一种代理以控制对这个访问 2.适用性 在以下情况下使用Proxy模式 (1)远程代理为一个对象在不同的地址空间提供局部代表. (2)虚代理根据需要创建开销很大的对象. (3)保 ...

  7. 【设计模式系列】结构型模式之Proxy模式

    概要 有时候可能我们不希望暴露现有对象的所有接口,只希望公开其中部分接口,具体来说,比如我们有个对象具有一系列的方法接口,如果我们只需要这些接口中间的一小部分,那么我们没必要去创建这个对象本身,我们可 ...

  8. 关于《设计模式》这本书(三)——Proxy模式

    今天随便写了一下Proxy模式,也许写得很不好.因为实际上我应用Proxy模式的次数并不是很多,如果有什么错误,请指出. 文章来源:http://dotnet.blogger.cn/sumtec/ar ...

  9. aop区别 decorator_Decorator或Proxy模式;AOP拦截器

    总结如下:过滤器实现方式在不保证功能前提下,从性能角度考虑有如下先后顺序:Decorator或Proxy模式:AOP拦截器. 考虑使用AOP拦截器时,最好选择那些受众面积比较广的功能,例如一些基础通用 ...

最新文章

  1. Java Web学习总结(22)——使用kaptcha生成验证码
  2. 2019-2020 ACM-ICPC Brazil Subregional Programming Contest
  3. angular 指令渲染_Angular JS指令有后期渲染回调吗?
  4. Intel Realsense D435 python 实战(二)
  5. Spring MVC – HTTP消息转换器
  6. 记:Ubuntu 14.04 安装32位库支持库失败
  7. 底层软件工程师的一次冒险经历
  8. oracle查询结果展示,ORACLE构造查询日期展示结果
  9. cocos2d-x中使用plist文件总结
  10. 机械制造技术基础【3】
  11. 远程桌面连接如何重启计算机,如何使用“远程桌面连接”连接到另一台计算机...
  12. 小米 2021 秋招面试总结
  13. 高通9xxx系列模块modem射频 RF LTE B41频段踩过的坑
  14. 推出全新的交互式导航和社交导航 iGibson 挑战
  15. SpringMVC(8)——格式化转换器Formatter
  16. 新版迅雷5.9开启会员皮肤去广告方法
  17. python编码转换在线_在线UTF-8编码汉字互转 | utf8编码转换器
  18. [珍藏版]微软等数据结构+算法面试100题全部出炉
  19. 扎心分享[土豪专用] 某宝卖1300元的最新微信朋友圈广告植入系统,无限制多用户版朋友圈文章内广告植入
  20. 优化小程序中频繁下拉刷新导致的定位获取失败问题

热门文章

  1. FreeSql使用WithSql+ ToSQL 查询数据
  2. AntDesign Pro + .NET Core 实现基于JWT的登录认证
  3. 【Git】Git-常用命令备忘录(二)
  4. .NET和.NET Core Web APi FormData多文件上传
  5. 读懂操作系统之虚拟内存(一)
  6. 基于 Roslyn 实现一个简单的条件解析引擎
  7. 告别2019,写给2020:干好技术,要把握好时光里的每一步
  8. 聊聊程序员的成长与价值提升
  9. Cookie、session、token对比
  10. 用.NET模拟天体运动