return binder;
}
getIServiceManager()
//frameworks/base/core/java/android/os/ServiceManager.java
private static IServiceManager getIServiceManager() {
if (sServiceManager != null) {
return sServiceManager;
}
sServiceManager = ServiceManagerNative.asInterface(BinderInternal.getContextObject());
return sServiceManager;
}
是通过ServiceManagerNative.asInterface()
方法来获取ServiceManager
对象,asInterface
方法的参数中是调用了BinderInternal.getContextObject()
方法。这是一个native方法。
getContextObject()
static jobject android_os_BinderInternal_getContextObject(JNIEnv* env, jobject clazz)
{
sp b = ProcessState::self()->getContextObject(NULL);
return javaObjectForIBinder(env, b);
}
由于本小节是讲解Java的,这里就不做过多的讲解了。对于ProcessState::self()->getContextObject()
这个方法,等价于new BpBinder(0)
。即BinderInternal.getContextObject()
方法最后是获取BpBinder
对象。
那么回过头来看asInterface
方法的具体实现:
ServiceManagerNative.asInterface
//frameworks/base/core/java/android/os/ServiceManagerNative.java
static public IServiceManager asInterface(IBinder obj)
{
if (obj == null) {
return null;
}
IServiceManager in =
(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)
方法就