Proxy-Stub模式是为了解决进程间通信问题而设计。(推荐阅读高焕堂先生的《android设计招式之美》)
在ActivityThread中,就利用了Proxy-Stub模式实现了与ActivityManagerService的进程间调用。
//ActivityThread.java
private void attach(boolean system) {
sCurrentActivityThread = this;
mSystemThread = system;
if (!system) {
ViewRootImpl.addFirstDrawHandler(new Runnable() {
public void run() {
ensureJitEnabled();
}
});
android.ddm.DdmHandleAppName.setAppName("<pre-initialized>",
UserHandle.myUserId());
RuntimeInit.setApplicationObject(mAppThread.asBinder());
IActivityManager mgr = ActivityManagerNative.getDefault();
try {
mgr.attachApplication(mAppThread);
} catch (RemoteException ex) {
// Ignore
}
} else {
// Don't set application object here -- if the system crashes,
// we can't display an alert, we just want to die die die.
}
// add dropbox logging to libcore
}
围绕ActivityManagerNative类我们可以找到下列类关系:
//ActivityManagerNative.java
1.public abstract class ActivityManagerNative extends Binder implements IActivityManager
2.class ActivityManagerProxy implements IActivityManager
3.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;
}
};
4. static public IActivityManager asInterface(IBinder obj) {
if (obj == null) {
return null;
}
IActivityManager in = (IActivityManager)obj.queryLocalInterface(descriptor);
if (in != null) {
return in;
}
return new ActivityManagerProxy(obj);
}
//IActivityManager.java
5.public interface IActivityManager extends IInterface
//ActivityManagerService.java
6.public final class ActivityManagerService extends ActivityManagerNative
implements Watchdog.Monitor, BatteryStatsImpl.BatteryCallback
可以得到以下类图:
我们详细分析一下:
首先,
ActivityManagerNative和ActivityManagerProxy继承同一个接口IActivityManager
ActivityManagerNative是一个Stub,是服务端,
ActivityManagerProxy是一个Proxy,是客户端。
其次
ActivityManagerNative的onTransact中调用自己的抽象函数,实际调用的是继承了ActivityManagerNative类的ActivityManagerService的相应函数。这样,调用Proxy的时候,Proxy会调用到ActivityManagerNative的onTransact里,之后就可以利用这种抽象继承机制调用到extends ActivityManagerNative的ActivityManagerService的函数。
(整个Framework中只在ActivityManagerNative.asInterface中有return new ActivityManagerProxy(obj);)
再看对象的本质:
ServiceManager中用了一个HashMap存储所有的Service,都是IBinder类型
在IActivityManager am = asInterface(b);中,由代码段4可知am就是一个ActivityManagerProxy对象了。
亦即gDefault是一个ActivityManagerProxy对象,所以调用的mgr就是一个ActivityManagerProxy对象
最后
可知mgr.attachApplication(mAppThread);调用的是ActivityManagerProxy.attachApplication函数。之后通过ActivityManagerNative(即Stub)就会调用到ActivityManagerService.attachApplication中。这样,就从ActivityThread中通过Proxy-Stub模式跨进程调用了ActivityManagerService的函数。