前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >026android初级篇之ActivityManager的Proxy模式初识

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

作者头像
上善若水.夏
发布2018-09-28 10:40:57
5710
发布2018-09-28 10:40:57
举报
文章被收录于专栏:上善若水上善若水

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

Proxy模式

意图:

代码语言:javascript
复制
   为其他对象提供一种代理以控制这个对象的访问。

适用性:

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这个单例对象

代码语言:javascript
复制
 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模式的运用
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016.01.21 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Proxy模式
  • 意图:
  • 适用性:
    • 1. 远程代理( Remote Proxy ):
      • 2. 虚代理(Virtual Proxy)
        • 4. 保护代理(Protection Proxy):
          • 5. 智能指引(Smart Reference):
          • Android中ActivityManager
          • ActivityManager相关类关系
            • 如何通过代理对象来执行真正对象请求;
            • 代理的实现
              • 执行过程
              • 参考链接
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档