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相关类关系
IActivityManager作为ActivityManagerProxy和ActivityManagerNative的公共接口,所以两个类具有部分相同的接口,可以实现合理的代理模式;
ActivityManagerProxy代理类是ActivityManagerNative的内部类;
ActivityManagerNative是个抽象类,真正发挥作用的是它的子类ActivityManagerService(系统Service组件)。
如何通过代理对象来执行真正对象请求;
从图中可以看出代理类:使用ActivityManagerProxy代理类,来代理ActivityManagerNative类的子类ActivityManagerService;
ActivityManagerService是系统统一的Service,运行在独立的进程中;通过系统ServiceManger获取;
ActivityManager运行在一个进程里面,ActivityManagerService运行在另一个进程内,
对象在不同的进程里面,其地址是相互独立的;实现跨进程的对象访问,需要对应进程间通信的规则,
此处是采用Binder机制实现跨进程通信;所以此处的Proxy模式的运用属于:远程代理(RemoteProxy)。
代理的实现
获取当前正在运行的服务列表:
public List
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 gDefault = new Singleton() {
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类型,就可以在本地调用远程对象的操作方法。
执行过程
接下来希望能深入学习ActivityManager。
参考链接
- Android学习——ActivityManager与Proxy模式的运用