Binder机制分析(3)—— 实现自己的Service

来源:互联网 发布:淘宝的信用评价体系 编辑:程序博客网 时间:2024/04/29 10:04

本文转载于:http://blog.csdn.net/ljsbuct/article/details/7108052

本文是对《Android技术内幕-系统卷》第三章的摘抄和整理。



1. 到这里,我们应该已经理解了Android的Binder机制,当需要自己实现一个核心服务时,应该注意哪些问题呢?
    1)核心服务通常在独立的进程里执行。
    2)必须提供IBinder 接口,让应用程序可以跨进程绑定和呼叫。
    3)因为共享,所以必须确保多线程安全(Thread-safe)。
    4)以C++类别定义,获取其对象,通过ServiceManager的协助,将该对象参考值传给IServiceManager::addService()函数,加入到Binder Driver 里。
    5)应用程序可通过ServiceManager 的协助远距离绑定该核心服务,此时ServiceManager 会回传IBinder 接口给应用程序。
    6)应用程序可通过IBinder::transact()函数与核心服务互传数据。

2. 下面以C++代码为例来分析如何实现一个自己的Service。假设我们需要实现的服务接口为TestService,名称为service.testservice,具体流程如下:
首先,定义ITestService接口,即TestService服务,如代码清单3-63所示。
    2.1 定义ITestService接口
   
class ITestService: public IInterface      {      public:          DECLARE_META_INTERFACE(TestService);//申明宏          virtual getTestService() = 0;          virtual setTestService() = 0;      } 
 
    2.2 然后,定义BnTestService接口和BpTestService接口,如代码清单3-64所示
    //BnTestService的定义  
    class BnTestService: public BnInterface<ITestService>
    {  
    public:  
        virtual status_t    onTransact( uint32_t code,  
                                        const Parcel& data,  
                                        Parcel  
    reply,  
                                        uint32_t flags = 0);  
    };  
    //BnTestService的实现  
 
IMPLEMENT_META_INTERFACE(TestService, "Android.testservice.IestService");      status_t BnTestService::onTransact(          uint32_t code, const Parcel& data, Parcel      reply, uint32_t flags)      {          switch(code) {              case GET_TESTSERVICE: {                  CHECK_INTERFACE(ITestService, data, reply);                  return NO_ERROR;              } break;      }

    
    //BpTestService的实现     
class BpTestService: public BpInterface<ITestService>    {      public:          BpTestService (const sp<IBinder>& impl)              : BpInterface< ITestService >(impl)          {          }          //getTestService          //setTestService      }

  2.3 写好了自己的服务,最后是使用自己服务的方法
    使用TestService
  
 int main()      {          sp<ProcessState> proc(ProcessState::self());          sp<IServiceManager> sm = defaultServiceManager();          sm->addService("service.testservice",new TestService());          ProcessState::self()->startThreadPool();          IPCThreadState::self()->joinThreadPool();      }