Android Framework---ActivityManager中的Proxy模式运用

来源:互联网 发布:新网站如何优化 编辑:程序博客网 时间:2024/04/29 08:43

最近看Android源码的时候,看到了AcitivityManager,而ActivityManager就是用了标准的Proxy模式,下面我们就来看看。

从官方文档中,可看出,AcitivityManager作用:

是与系统所有正在运行着的Acitivity进行交互,对系统所有运行中的Activity相关信

息(Task,Memory,Service,App)进行管理和维护;提供了相应的接口用

于获取这些信息。
但是这些信息真正维护并不是ActivityManager来负责的,下面将会介绍。

下面先说下Proxy模式(代理模式)

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

代理模式的初衷是为了提供额外的处理或者不同的操作而在实际对象与调用者之间插入一个代理对象。其一般会出现以下情况:

 1.虚代理( Remote Proxy ):代理一些开销很大的对象,这样便能迅速返回,进行其它操作,只有在真正需要时才实例化;

 2.远程代理( Remote Proxy ): 为一个对象在不同的地址空间提供局部代表。

 3.保护代理(Protection Proxy):控制对原始对象的访问。保护代理用于对象应该有不同的访问权限的时候。

 4.智能指引(Smart Reference): 取代了简单的指针,它在访问对象时执行一些附加操作。

代理模式类型图:



在代理模式中的角色:

  ●  抽象对象角色:声明了目标对象和代理对象的共同接口,这样一来在任何可以使用目标对象的地方都可以使用代理对象。

  ●  目标对象角色:定义了代理对象所代表的目标对象。

  ●  代理对象角色:代理对象内部含有目标对象的引用,从而可以在任何时候操作目标对象;代理对象提供一个与目标对象相同的接口,以便可以在任何时候替代目标对象。代理对象通常在客户端调用传递给目标对象之前或之后,执行某个操作,而不是单纯地将调用传递给目标对象。

下面附上代码:

抽象对象角色:

public interface InterObject {    public abstract void doEexc();}
      目标对象角色:
public class RealObject implements InterObject {    @Override    public void doEexc() {        //执行的操作        System.out.println("执行操作");    }}
     代理对象角色:
public class ProxyObject implements InterObject {    RealObject realObject = new RealObject();    @Override    public void doEexc() {        //调用目标对象之前可以做相关操作        System.out.println("before");                realObject.doEexc();                //调用目标对象之后可以做相关操作        System.out.println("after");    }}

Client:
public class Client {    public static void main(String[] args) {        // TODO Auto-generated method stub        RealObject rel = new RealObject();
InterObject obj = new ProxyObject();
obj.doEexc();
}
}
执行结果:
before
执行操作
after

从上面的例子可以看出代理对象将客户端的调用委派给目标对象,在调用目标对象的方法之前跟之后都可以执行特定的操作。

看完了代理模式,下面来看看AcitivityManager框架:

上图很清楚的描述了ActivityManager框架几个主要类之间的关系。上图中绿色的部分是SDK开放给开发人员的类和接口,

蓝色的部分就是我们今天讲的一个经典的proxy模式,红色的部分就是真正的底层服务实现。

这里的一个核心思想是Proxy模式。在ActivityManager中提供了一些管理Acitivity的方法:

 public void getRecentTasks()
               
       public void getRunningTasks()


       public void getRunningServices()


       public void getRunningAppProcesses()

看下源码:

public List<RunningServiceInfo> getRunningServices(int maxNum)

            throws SecurityException {

        try {

            return (List<RunningServiceInfo>)ActivityManagerNative.getDefault()

                    .getServices(maxNum, 0);

        } catch (RemoteException e) {

            // System dead, we will be dead too soon!

            return null;

        }

    }

大家不要被这个方法名困惑ActivityManagerNative.getDefault(),稍微看下ActivityManagerNative是一个抽象类,

我们是不可能获取到他的对象。从前面的代理类分析得知,我们真正地获取的对象应该是ActivityManagerProxy对象。

可以看出以上操作都是基于ActivityManagerProxy代理类的实现。IActivityManager接口定义了所有ActivityManager框架的操作,ActivityManagerProxy实现了接口IActivityManager,但并不真正实现这些方法,它只是一个代理类,真正动作的执行为ActivityManagerNative类的子类ActivityManagerService。

为什么要用这个代理?可以这样理解,ActivityManager是一个客户端,为了隔离它与ActivityManagerService,有效降低甚至消除二者的耦合度,

在这中间使用了ActivityManagerProxy代理类,所有对ActivityManagerService的访问都转换成对代理类的访问,

这样ActivityManager就与ActivityManagerService解耦了,这是典型的proxy的应用场景。

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

ActivityManager运行在一个进程里面,ActivityManagerService运行在另一个进程内,对象在不同的进程里面,

其地址是相互独立的;采用Binder机制跨进程通信,所以我们可以得出这是一个远程代理(RemoteProxy

这篇文章主要讲里面用到的proxy模式。但是这里面涉及到了一些ActivityManager框架的问题,

只是初步探索,想要弄清楚ActivityManager的小伙伴们还需要更深入的了解哈,



0 0
原创粉丝点击