ServiceManager学习 (manager与Service之间关系)
在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源码。
