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源码。

经验分享 程序员 微信小程序 职场和发展