专栏首页上善若水026android初级篇之ActivityManager的Proxy模式初识

026android初级篇之ActivityManager的Proxy模式初识

026android初级篇之ActivityManager的Proxy模式初识

Proxy模式

意图:

   为其他对象提供一种代理以控制这个对象的访问。

适用性:

1. 远程代理( Remote Proxy ):

为一个对象在不同的地址空间提供局部代表。

2. 虚代理(Virtual Proxy)

根据需要创建开销很大的对象。使用一个代理对象作为代表,在真正的需要时进行创建。

4. 保护代理(Protection Proxy):

控制对原始对象的访问。保护代理用于对象应该有不同的访问权限的时候。

5. 智能指引(Smart Reference):

取代了简单的指针,它在访问对象时执行一些附加操作。对指向实际对象的引用计数, 这样当该对象没有引用时,可以自动释放它,智能指针当第一次引用一个持久对象时,将它装入内存。 在访问一个实际对象前,检查是否已经锁定了它,以确保其他对象不能改变它

Android中ActivityManager

官方介绍: 是与系统所有正在运行着的Acitivity进行交互,对系统所有运行中的Activity相关信息(Task,Memory,Service,App)进行管理和维护;提供了相应的接口用于获取这些信息。

信息的维护不是真正的由ActivityManager类来负责,而是通过ActivityManagerNative.getDefault()的操作得到IActivityManager 接口得到具体的操作。

ActivityManager相关类关系

026_01.png

ActivityManager相关类关系

IActivityManager作为ActivityManagerProxy和ActivityManagerNative的公共接口,所以两个类具有部分相同的接口,可以实现合理的代理模式;

ActivityManagerProxy代理类是ActivityManagerNative的内部类;

ActivityManagerNative是个抽象类,真正发挥作用的是它的子类ActivityManagerService(系统Service组件)。

如何通过代理对象来执行真正对象请求;

从图中可以看出代理类:使用ActivityManagerProxy代理类,来代理ActivityManagerNative类的子类ActivityManagerService;

ActivityManagerService是系统统一的Service,运行在独立的进程中;通过系统ServiceManger获取;

ActivityManager运行在一个进程里面,ActivityManagerService运行在另一个进程内,

对象在不同的进程里面,其地址是相互独立的;实现跨进程的对象访问,需要对应进程间通信的规则,

此处是采用Binder机制实现跨进程通信;所以此处的Proxy模式的运用属于:远程代理(RemoteProxy)。

代理的实现

获取当前正在运行的服务列表: public List<RunningServiceInfo> getRunningServices(int maxNum) throws SecurityException { try { return ActivityManagerNative.getDefault() .getServices(maxNum, 0); } catch (RemoteException e) { // System dead, we will be dead too soon! return null; } }

getServices()函数中的实现发现gDefault这个单例对象

 private static final Singleton<IActivityManager> gDefault = new Singleton<IActivityManager>() {
    protected IActivityManager create() {
        IBinder b = ServiceManager.getService("activity");
        if (false) {
            Log.v("ActivityManager", "default service binder = " + b);
        }
        IActivityManager am = asInterface(b);
        if (false) {
            Log.v("ActivityManager", "default service = " + am);
        }
        return am;
    }
};

ServiceManager.getService("activity");获取系统的“activity”的Service,

所有的Service都是注册到ServiceManager进行统一管理。

这样就创建了一个对ActivityManagerService实例的本地代理对象ActivityManagerProxy实例。Singleton是通用的单例模板类。

ActivityManagerNative.getDefault就返回一个此代理对象的公共接口IActivityManager类型,就可以在本地调用远程对象的操作方法。

执行过程

026_02.png

接下来希望能深入学习ActivityManager。

参考链接

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 002工具及环境之查看当前局域网有那些IP在线

    用Arp -a命令,查询MAC数据 除去尾数为255的广播地址,剩下的就是当前电脑的在线列表

    上善若水.夏
  • 047android初级篇NDK原生程序执行报错

    上善若水.夏
  • L012Linux和androidNDK之执行报错CANNOT LINK EXECUTABLE: cannot locate symbol "signal" referenced by

    上善若水.夏
  • 光芯片上的神经网络

    公众号的第一篇笔记基于硅光芯片的深度学习 介绍了MIT研究组在硅光芯片上实现机器学习的实验进展。一年多之后,7月份以来又有好几篇相关的进展报道。这一篇笔记主要深...

    光学小豆芽
  • 19美元“重塑”21世纪飞艇!谷歌联合创始人Sergey Brin做到了

    谷歌联合创始人谢尔盖·布林(Sergey Brin)有一个伟大的目标,他投入数百万美元致力于建造世界上最大、最环保的飞艇。去年3月,他终于获得了收益。

    大数据文摘
  • java学习之路:11.数组排序算法

    直线选择排序是将指定的排序位置与其他数组元素分别对比,如果瞒住条件就交换元素值,注意这里区别冒泡排序,不是交换相邻元素,而是把满足条件的元素与指定的排序位置交换...

    花狗Fdog
  • 将数组内的元素随机打乱

    OECOM
  • Linux使用sshfs通过ssh挂载远端机器

    kongxx
  • Golang 中"泛型"的支持

    Golang不支持一般的类似java中的标记式泛型。很多人因此而十分不满,认为没有泛型增加了很多工作量。而目前由于泛型支持的复杂性,Golang的设计和实现者并...

    李海彬
  • 剑指Offer-旋转数组的最小数字

    package Array; /** * 旋转数组的最小数字 * 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 * 输入一个非递减...

    武培轩

扫码关注云+社区

领取腾讯云代金券