本文是对《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();
}