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 条评论
登录 后参与评论

相关文章

来自专栏禹都一只猫博客

Flask RESTful API 简单的设计一个 GET 请求接口

1.8K5
来自专栏你不就像风一样

史上最全面的Spring Boot配置文件详解

Spring Boot在工作中是用到的越来越广泛了,简单方便,有了它,效率提高不知道多少倍。Spring Boot配置文件对Spring Boot来说就是入门和...

1.3K2
来自专栏JMCui

SpringMVC 异常处理.

一、异常处理 Spring提供了多种方式将异常转换为响应: 特定的Spring异常将会自动映射为指定的HTTP状态码     在默认情况下,Spring会将自身...

3458
来自专栏爱撒谎的男孩

Spring MVC处理异常

注意:使用SimpleMappingExceptionResolver处理异常时,不可以使用@ExceptionHandler!

3575
来自专栏大魏分享(微信公众号:david-share)

JavaEE中资源注入松耦合的实现 | 从开发角度看应用架构13

上下文和依赖注入(CDI)规范是Java EE规范中的许多从属规范之一。虽然CDI是在Java EE 6中引入的,但CDI背后的概念已经出现在各种框架中,包括S...

1002
来自专栏butterfly100

Java并发编程:synchronized和锁优化

1. 使用方法 synchronized 是 java 中最常用的保证线程安全的方式,synchronized 的作用主要有三方面: 确保线程互斥的访问代码块,...

3527
来自专栏ImportSource

Spring Boot处理REST API错误的正确姿势

如何正确的处理API的返回信息,让返回的错误信息提供更多的含义是一个非常值得做的功能。 默认一般返回的都是难以理解的堆栈信息,然而这些信息也许对于API的客户...

60313
来自专栏xingoo, 一个梦想做发明家的程序员

JSP中文乱码问题

之前总是碰到JSP页面乱码的问题,每次都是现在网上搜,然后胡乱改,改完也不明白原因。 这次正好作下总结,中文乱码就是因为编码不符,可能出现乱码有四个地方: ...

3839
来自专栏java思维导图

Spring思维导图,让Spring不再难懂(ioc篇)

写在前面 写过java的都知道:所有的对象都必须创建;或者说:使用对象之前必须先创建。而使用ioc之后,你就可以不再手动创建对象,而是从ioc容器中直接获取对象...

4017
来自专栏Spring相关

第1章—Spring之旅—容纳你的Bean

1、Bean自身的方法  :  这个包括了Bean本身调用的方法和通过配置文件中<bean>的init-method和destroy-method指定的方法

1181

扫码关注云+社区

领取腾讯云代金券