Android源码是最好的学习教材,理解了源码中的设计模式和设计思想对于编程能力的提升大有帮助,本文就从ActivityManager入手开始学习Android源码。 一。ActivityManager的作用是为系统中所有运行着的Activity提供交互的接口,主要的接口围绕着运行中的进程信息,任务信息,服务信息等。ActivityManager相关的结构类图如下:
类图中描述的ActivityManager机制采用的是代理模式,将自己要实现的功能委托给别人实现,使得结构更加简洁,
职责更加清晰,不用关心其他本职责以外的事物,降低了与其他类之间的耦合。同时也起到了保护代理对象和被代理对象
的作用,以及有利于后期的扩展等作用。这里以获取正在运行的服务信息为例进行说明,函数的源码为: ActivityManager.java
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.java
static public IActivityManager asInterface(IBinder obj){
...
return new ActivityManagerProxy(obj);
}
static public IActivityManager getDefault(){
...
IBinder b = ServiceManager.getService("activity");
gDefault = asInterface(b);
return gDefault;
}
ActivityManager调用getRunningServices()函数,但其自己并未实现该功能,而是进而调用了ActivityManagerProxy代理类
的getServices()函数,该类是ActivityManagerNative的代理类,这两个类都实现了IActivityManager接口,这就是代理模式
的结构。当调用ActivityManagerProxy代理类的getServices()函数时,会去调用ActivityManagerNative中的相应函数,但该
类也没有真正的实现具体的功能,而是通过Binder进程通信机制去调用ActivityManagerService中的getServices()函数,
在ActivityManagerService中实现了具体的功能。调用的时序图如下:
其中的transact()函数和onTransact()函数是Binder机制提供的,实现跨进程的通信,这里暂不讨论。这样将上层的
功能转移给了代理,由代理再转移给底层去实现,层次分明,功能明确,同时也提高了设计的安全性。
(一点愚见,欢迎指正。)