ServiceManager学习 (manager与Service之间关系)

来源:互联网 发布:剑三好友招募积分算法 编辑:程序博客网 时间:2024/04/30 19:25

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







0 0
原创粉丝点击