日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

[z]純Native的Service

 techres 2012-02-17

6.6.1 純Native的Service

2011-09-22 10:19 鄧凡平 機械工業(yè)出版社 我要評論(0) 字號:T | T
一鍵收藏,隨時查看,分享好友!

《深入理解Android:卷I》第6章深入理解Binder,本章拓展思考部分討論了與Binder有關(guān)的三個問題,它們分別是Binder和線程的關(guān)系、死亡通知以及匿名Service。筆者希望,通過本章的學(xué)習(xí),大家能更深入地認(rèn)識Binder的本質(zhì)。本節(jié)為大家介紹純Native的Service。

AD:

6.6 學(xué)以致用

全書中可能惟有Binder系統(tǒng)有如此大的魅力,讓我單獨用一節(jié)來介紹如何使用它。

6.6.1 純Native的Service

純Native的Service表示代碼都在Native層。Native層有很多Service,前面的MS不就是一個重量級的嗎?

假設(shè)Service叫Test,我們該如何實現(xiàn)呢?完全可以模仿MS!具體實現(xiàn)過程如代碼所示:

[-->Test.cpp::范例]

  1. int main()  
  2. {  
  3.    sp<ProcessState> proc(ProcessState::self());  
  4.   sp<IServiceManager> sm = defaultServiceManager();  
  5.   //記住注冊你的服務(wù),否則誰也找不著你!  
  6.   sm->addService(“service.name”,new Test());  
  7.   //如果壓力不大,可以不用單獨搞一個線程。  
  8.   ProcessState::self()->startThreadPool();  
  9.   //這個是必須的,否則主線程退出了,你也完了。  
  10.   IPCThreadState::self()->joinThreadPool();  

Test是怎么定義的呢?我們是跨進程的C/S,所以本地需要一個BnTest,對端需要提供一個代理BpTest。為了不暴露Bp的身份,Bp的定義和實現(xiàn)都放在BnTest.cpp中了。

注意 你雖可以暴露Bp的身份(輸出它的頭文件),但卻沒有必要,因為客戶端用的是基類ITest指針。

1. 我能干什么

ITest接口表明了它所提供的服務(wù),例如getTest和setTest等,這個與業(yè)務(wù)邏輯相關(guān),代碼如下所示:

說明 getTest也可以返回一個ITestService類型的Service!

[-->ITest.h::聲明ITest]

  1. //需要從IInterface派生  
  2. class ITest: public IInterface。  
  3. {  
  4. public:  
  5.   //神奇的宏 DECLARE_META_INTERFACE。  
  6.   DECLARE_META_INTERFACE(Test);  
  7.   virtual void getTest() = 0;  
  8.   virtual void setTest() = 0;  
  9. }//ITest是一個接口類。 

2. 定義BnTest和BpTest

為了把ITest融入到Binder系統(tǒng),需要定義BnTest和對客戶端透明的BpTest。BnTest定義既可以與上面的Test定義放在一塊,也可以分開,如下所示:

[-->ITest.h::聲明BnTest]

  1. class BnTest: public BnInterface<ITest> 
  2. {  
  3. public:  
  4.    //由于ITest是個純虛類,而BnTest只實現(xiàn)了
    onTransact函數(shù),所以BnTest依然是一個純虛類。  
  5.     virtual status_t    onTransact( uint32_t code,  
  6.                                     const Parcel& data,  
  7.                                     Parcel* reply,  
  8.                                     uint32_t flags = 0);  
  9.  
  10. }; 

另外,我們還要使用IMPLEMENT宏。參考BnMediaPlayerService的方法,把BnTest和BpTest的實現(xiàn)都放在ITest.cpp中,如下所示:

[-->ITest.cpp::BnTest的實現(xiàn)]

  1. IMPLEMENT_META_INTERFACE(Test, "android
    .Test.ITest");//IMPLEMENT宏  
  2.  
  3. status_t BnTest::onTransact(  
  4.     uint32_t code, const Parcel& data,
    Parcel* reply, uint32_t flags)  
  5. {  
  6.     switch(code) {  
  7.         case GET_Test: {  
  8.            CHECK_INTERFACE(ITest, data, reply);  
  9.              getTest();//子承父業(yè),由Test完成。  
  10.             return NO_ERROR;  
  11.         } break; //SET_XXX類似。  
  12. ....... 

BpTest也在這里實現(xiàn)吧,如下所示:

[-->ITest.cpp::BpTest的實現(xiàn)]

  1. class BpTest: public BpInterface<ITest> 
  2. {  
  3. public:  
  4.     BpXXX (const sp<IBinder>& impl)  
  5.         : BpInterface< ITest >(impl)  
  6.     {  
  7. }  
  8. vitural getTest()  
  9. {  
  10. Parcel data, reply;  
  11.    data.writeInterfaceToken(ITest::getInterfaceDescriptor());  
  12.    data.writeInt32(pid);  
  13.    //打包請求數(shù)據(jù),然后交給BpBinder通信層處理。  
  14.    remote()->transact(GET_Test, data, &reply);  
  15.    return;  
  16. }  
  17. //setTest類似。  
  18. ...... 

純Native的Service寫起來量大一些,上面的代碼還只是把C/S的框架寫好了,真正的業(yè)務(wù)處理尚未開始,不過感覺卻很踏實,很厚重。那么,Java層的Service該怎么寫呢?

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多