从业务角度分析android binder的使用

来源:互联网 发布:unity3d ai插件 编辑:程序博客网 时间:2024/05/16 17:11

    看了很多解析binder的文章,发现都从底层说起。由于涉及的代码太多,容易造成读者一开始思路不清晰。IBinder及派生类BpBinder和BBinder都属于通信层的概念,可先忽略,本文只从应用业务的角度来解析如何提供service和使用service。

1.提供Service

    对于Service提供者需实现以下类:IxxxService,BpxxxService,BnxxxService,并对外提供IxxxService接口。

 

    IxxxService类为纯虚类,只定义了Service提供的接口。

 

    BpxxxService类 的定义:class BpxxxService: public BpInterface<IxxxService>。BpxxxService类实现了IxxxService接口,不过并没有实现功能,只是通过binder发送请求给BnxxxService。BpxxxService,BpInterface以Bp开头,表明Bpxxx的类在客户端使用(即Service使用者)。

 

    BnxxxService类的定义:class BnxxxService: public BnInterface<IxxxService>。

    BnxxxService类也实现了IxxxService接口,是接口功能真正的提供者,通过binder返回调用结果。

    Service提供者需向ServiceManager注册BnxxxService,方法如下:

    defaultServiceManager()->addService(String16("服务名称"), new BnxxxService());

    BnxxxService,BnInterface以Bn开头,表明Bnxxx的类在服务端使用。

 

2.使用Service

    Service使用者只需使用IxxxService类的接口来调用Service提供的功能。

    Service使用者按如下方法获取BpxxxService实例:

    sp<IServiceManager> sm = defaultServiceManager();
    sp<IBinder> binder = sm->getService(String16("服务名称"));
     sp<IxxxService> iService = interface_cast<IxxxService>(binder);

   interface_cast<IxxxService>(binder)实际返回BpxxxService对象。interface_cast为模板函数,该函数调用IxxxService::asInterface(binder)。IxxxService::asInterface函数new BpxxxService(binder)。

    BpxxxService类代码只在cpp文件中,头文件中并没涉及,意图就是对Service使用者隐藏BpxxxService类。Service使用者实际使用的是BpxxxService类,只是通过它的基类指针IxxxService*来调用而已。

 

    可对照MediaPlayerService理解上面的描述:

    MediaPlayerService提供者:IMediaPlayerService.h IMediaPlayerService.cpp

    MediaPlayerService使用者:IMediaDeathNotifier.h IMediaDeathNotifier.cpp

 

    以上所说的是service的通用方法。当然你可以不遵循这套通用方法,自己通过读写binder设备实现。ServiceManager本身作为service就没有实现BnxxxService。