您的位置:首页 > 其它

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

2016-12-27 19:14 363 查看
本文是对《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();  
    } 

转自:http://blog.csdn.net/ljsbuct/article/details/7108052
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: