您的位置:首页 > 移动开发 > Android开发

设计模式之代理模式 Android代码分析

2016-10-28 16:06 661 查看

一,基本概念

1,代理模式(Proxy):为其他对象提供一种代理以控制对这个对象的访问。所谓代理,就是一个人或者机构代表另一个人或者机构采取行动。在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。

2,代理模式的组成:

Abstract Subject:抽象主题-声明真实主题和代理主题共同的接口

Real Subject:真实主题-真实的对象,需要被代理主题引用

Proxy Subject:代理主题-因为ProxySubject引用了RealSubject,并且实现了跟RealSubject一样的接口,所以ProxySubject可以操作RealSubject,还可以提供一些附加操作,例如before & after

结构图:



二,android 源码中使用简单代理的事例:

1,Android中ActivityManager的方法调用

可以去源码中看ActivityManager的方法调用如:获取运行应用进程信息

public List<RunningAppProcessInfo> getRunningAppProcesses() {
try {
return ActivityManagerNative.getDefault().getRunningAppProcesses();
} catch (RemoteException e) {
return null;
}
}


ActivityManager中并没有具体实现,而是通过代理ActivityManagerNative.getDefault()来实现的,来分析代理的整个实现过程:

1,Android中ActivityManager中相关类的继承关系图



通过类图可以知道ActivityManager之间继承关系,代理模式使用了双层代理,一层是你类似aidl中的调用关系:

对应角色 关系:

IActivityManager –> 定义的aidl文件生成的java文件的外围接口类–>代理中的共同抽象接口

ActivityManagerNative–>生成的Stub类–>代理中的共同抽象接口(由于要进程间通信继承啦Binder)

ActivityManagerService –>aidl中实现Stub类的service–>代理中的具体实现

ActivityManagerProxy–>生成的Proxy类–>代理类

第二层是ActivityManager类似持有ActivityManagerProxy。

2,Android中ActivityManager中类的建立过程

ActivityManagerNative.getDefault()的源码

static public IActivityManager getDefault() {
return gDefault.get();
}
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”)获取ActivityManagerService 的引用,安卓系统启动ActivityManagerService 服务时,会将引用添加到ServerManager中统一管理

二,动态代理实现

动态代理:在程序运行时,运用反射机制动态创建而成。

JDK动态代理中包含一个类和一个接口:

InvocationHandler接口:

public interface InvocationHandler {

public Object invoke(Object proxy,Method method,Object[] args) throws Throwable;

}

参数说明:

Object proxy:指被代理的对象。

Method method:要调用的方法

Object[] args:方法调用时所需要的参数

可以将InvocationHandler接口的子类想象成一个代理的最终操作类,替换掉ProxySubject。

Proxy类:

Proxy类是专门完成代理的操作类,可以通过此类为一个或多个接口动态地生成实现类,此类提供了如下的操作方法:

public static Object newProxyInstance(ClassLoader loader, Class
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息