(IServiceManager)obj.queryLocalInterface(descriptor);
if (in != null) {
return in;
}
return new ServiceManagerProxy(obj);
}
采用了单例模式获取ServiceManager
,asInterface()
返回的是ServiceManagerProxy
(简称SMP)对象。所以最后getIServiceManager()
方法等价于new ServiceManagerProxy(new BinderProxy())
既然getIServiceManager()
获取到的是ServiceManagerProxy
,那ServiceManager.getService(name)
方法就是调用的ServiceManagerProxy.getService(name)
的方法。我们先看一下ServiceManagerProxy
是怎么被初始化的:
ServiceManagerProxy初始化
//frameworks/base/core/java/android/os/ServiceManagerNative.java
class ServiceManagerProxy implements IServiceManager {
public ServiceManagerProxy(IBinder remote) {
mRemote = remote;
}
}
mRemote
为BinderProxy
对象,该BinderProxy
对象对应于BpBinder(0)
,其作为binder代理端,指向native层大管家service Manager
。还记得BpBinder对象吗?在上一节,我们讲到了这个BpBinder对象于BBinder对象是一对一的,客户端拿着BpBinder去找BBinder,然后服务端的BBinder去做真正的事情。
emmm
好像有点懵逼了
没关系,我们捋一捋
在Java层,我们首先通过Native方法获得BpBinder对象。BpBinder对象中的handler为0的的时候,就指向的是ServiceManager了。
接下来构造一个ServiceManagerProxy,ServiceManagerProxy持有BpBinder。内部的工作也全部都是BpBinder去做的。
简单说就是获取ServiceManager,相当于你找人办事,但是人家架子很大不会自己来,先派给你一个小弟(ServiceManagerProxy),你想做什么就吩咐小弟,小弟手里拿着手机(BpBinder),你吩咐小弟任务以后,小弟通过手机拨打对应号码(BBinder)告诉办事的人。
ServiceManagerProxy.getService(name)
//frameworks/base/core/java/android/os/ServiceManagerNative.java
class ServiceManagerProxy implements IServiceManager {
public IBinder getService(String name) throws RemoteException {
Parcel data = Parcel.obtain();
Parcel reply = Parcel.obtain();
data.writeInterfaceToken(IServiceManager.descriptor);
data.writeString(name);
//mRemote为BinderProxy
mRemote.transact(GET_SERVICE_TRANSACTION, data, reply, 0);
//从reply里面解析出获取的IBinder对象
IBinder binder