您的位置:首页 > 其它

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

2011-12-28 10:33 309 查看
本文是对《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();

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: