Binder機制分析(3)—— 實現自己的Service

yangxi_001發表於2016-12-27

本文是對《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

相關文章