在Android系统中,ServiceManager作为各个服务管理的大总管,起着非常重要的作用。如WindowManager,inputmethodManager,MediaPlayerService,AlarmManager,ActivityManager,WifiManager等等都是由ServiceManager来管理的,而服务与各自客户端通过Binder通信机制来沟通。
ServiceManager所管理的所有Service都是以相应的Manager返回给客户端,在Android系统中,Manager意思是经纪人,Manager所管理的对象是服务本身,
因为每个具体的服务一般会提供多个API接口,而Manager就是管理这些API接口。客户端一般不能直接通过Binder引用去访问具体的服务,而是要经过一个Manager
,相应的manager类对客户端是可见的,而远程服务端的类是对客户端则是隐藏的。例如:ServiceManager对客户端可见,而media.player服务对客户端是隐藏的。
而这些Manager类内部都会有一个远程服务Binder的变量,在一般情况下这些Manager的构造函数参数中都会包含这个Binder对象。简言之,先通过ServiceManager
获取远程服务的Binder引用,然后使用这个Binder引用构造一个客户端可以访问的经纪人,然后客户端就可以通过该经纪人访问远程的服务。
这种设计的作用是屏蔽直接访问远程服务,从而可以给应用程序提供灵活的,可控的API接口。
应用程序通过Manager类访问远程服务的模型
例如获取MediaService:
(1)调用defaultServiceManager获取到ServiceManager sm;
(2)通过sm 获取远程服务的binder引用 mBinder = sm->getService(String16("media.player"));
(3)将远程Binder引用转成远程服务
sp<ImediaPlayerService>mService = interface_cast<IMediaPlayerService>(mBinder)
通过asInterface()方法得到远程服务
(4)有了经纪人mService就可以使用远程服务
备注:
template<typename INTERFACE>
inline sp<INTERFACE> interface_cast(const sp<IBinder>& obj)
{
return INTERFACE::asInterface(obj);
}
interface_cast<IMediaPlayerService>(mBinder) ==>
sp<IMediaPlayerService> interface_cast(const sp<IBinder>& mBinder)
{
return IMediaPlayerService::asInterface(mBinder);
}
IMediaPlayerService::asInterface()的声明:
IInterface.h中
IMPLEMENT_META_INTERFACE宏定义
#define IMPLEMENT_META_INTERFACE(INTERFACE, NAME) \
const android::String16 I##INTERFACE::descriptor(NAME); \
const android::String16& \
I##INTERFACE::getInterfaceDescriptor() const { \
return I##INTERFACE::descriptor; \
} \
android::sp<I##INTERFACE> I##INTERFACE::asInterface( \
const android::sp<android::IBinder>& obj) \
{ \
android::sp<I##INTERFACE> intr; \
if (obj != NULL) { \
intr = static_cast<I##INTERFACE*>( \
obj->queryLocalInterface( \
I##INTERFACE::descriptor).get()); \
if (intr == NULL) { \
intr = new Bp##INTERFACE(obj); \
} \
} \
return intr; \
} \
I##INTERFACE::I##INTERFACE() { } \
I##INTERFACE::~I##INTERFACE() { } \
IMediaPlayer.cpp文件中
IMPLEMENT_META_INTERFACE(MediaPlayer, "android.media.IMediaPlayer"); // 定义MediaPlayer服务的asInterface方法
WindowManager,ActivityManager,WifiManager,AlarmManager等更多服务需要更深入研究Android源码。