網(wǎng)上汗牛充棟的文章都是介紹Android遠(yuǎn)程服務(wù)的,一個(gè)個(gè)將Binder機(jī)制、AIDL講得頭頭是道,然而沒(méi)有幾個(gè)人能夠給出清晰的范例說(shuō)明如何用最快的方法學(xué)會(huì)編寫和調(diào)用一個(gè)Android遠(yuǎn)程服務(wù)。若你僅僅是想如何編寫或者調(diào)用Android的遠(yuǎn)程服務(wù),而懶得去理解Binder機(jī)制是如何運(yùn)行的,那么本篇文章正好適合你。畢竟現(xiàn)在人人都會(huì)開(kāi)車,但沒(méi)有幾個(gè)人明白發(fā)動(dòng)機(jī)到底是如何運(yùn)作的。
預(yù)備知識(shí)
讀者應(yīng)該有基本的java知識(shí),和Android簡(jiǎn)單app的開(kāi)發(fā)經(jīng)驗(yàn)。
環(huán)境
代碼運(yùn)行環(huán)境:
1.ADT2014版本;
2.android:minSdkVersion=”8”;android:targetSdkVersion=”20”
3.workspace中已經(jīng)生成了appcompatv7,它的版本是android-22;
遠(yuǎn)程服務(wù)開(kāi)發(fā)教程
在開(kāi)始開(kāi)發(fā)之前,先弄清楚幾個(gè)概念:
1. IPC:進(jìn)程間通信,你只需要知道Android是依賴這個(gè)東西來(lái)進(jìn)行遠(yuǎn)程服務(wù)調(diào)用的就可以了。
2. Binder機(jī)制:Android發(fā)明的一種IPC機(jī)制,據(jù)說(shuō)非常非常的好,你就當(dāng)它是個(gè)黑盒子,通過(guò)這個(gè)黑盒子就可以進(jìn)行遠(yuǎn)程服務(wù)調(diào)用了,而且Android中的很多機(jī)制都是通過(guò)它實(shí)現(xiàn)的。
3. AIDL語(yǔ)言:一種專門用來(lái)寫遠(yuǎn)程接口的語(yǔ)言,看它的名字就知道了,Android Interface Definition
Language。AIDL語(yǔ)言可以被android提供的編譯器編譯為Java源代碼,這個(gè)Java源代碼將會(huì)被服務(wù)的和客戶端使用,用來(lái)簡(jiǎn)化遠(yuǎn)程服務(wù)開(kāi)發(fā)流程。如果你當(dāng)初玩過(guò)CORBA,那就更能明白什么是IDL語(yǔ)言了
4. IInterface接口、IBinder接口、IBinder類等等:都是用來(lái)實(shí)現(xiàn)Binder機(jī)制的接口和類,在本教程中,你就當(dāng)它們是Binder黑盒子的一部分,不需要了解。
再說(shuō)一點(diǎn),其實(shí)Android提供的ApiDemos中就有一個(gè)遠(yuǎn)程服務(wù)的標(biāo)準(zhǔn)范例,但是其一是它沒(méi)有將服務(wù)端和客戶端分開(kāi)寫,其二是例子中摻雜了太多其他的功能,因此理解起來(lái)較為困難。這個(gè)例子是com.example.android.apis.app.RemoteService,有興趣的可以在看完本文后再去詳細(xì)研究。
第一步,創(chuàng)建一個(gè)普通Android應(yīng)用
應(yīng)用名為WxbRemoteService,這個(gè)應(yīng)用可以刪掉其Activity類,但是為了簡(jiǎn)單,我們就保留所有自動(dòng)創(chuàng)建的代碼。
第二步,編寫AIDL
AIDL語(yǔ)言的語(yǔ)法和Java其實(shí)很像,你甚至可以先編寫一個(gè)Java接口,然后刪掉public、protected、private這些權(quán)限限定詞即可。例子如下IWxbService.aidl:
package com.dumaisoft.wxbremoteservice;interface IWxbService { void setName(String name); String getName();}
注意幾點(diǎn):
1.接口名和aidl文件名相同。
2.接口和方法前不用加訪問(wèn)權(quán)限修飾符public,private,protected等,也不能用final,static。
3.Aidl默認(rèn)支持的類型包話java基本類型(int、long、boolean等)和(String、List、Map、 CharSequence),使用這些類型時(shí)不需要import聲明。對(duì)于List和Map中的元素類型必須是Aidl支持的類型。如果使用自定義類型作 為參數(shù)或返回值,自定義類型必須實(shí)現(xiàn)Parcelable接口。
4.自定義類型和AIDL生成的其它接口類型在aidl描述文件中,應(yīng)該顯式import,即便在該類和定義的包在同一個(gè)包中。
5.在aidl文件中所有非Java基本類型參數(shù)必須加上in、out、inout標(biāo)記,以指明參數(shù)是輸入?yún)?shù)、輸出參數(shù)還是輸入輸出參數(shù)。
6.Java原始類型默認(rèn)的標(biāo)記為in,不能為其它標(biāo)記
IWxbService.aidl文件的位置是在com.dumaisoft.wxbremoteservice包中,只要語(yǔ)法正確,則會(huì)在ADT的gen目錄下的com.dumaisoft.wxbremoteservice包中生成java文件IWxbService.java。
新聞熱點(diǎn)
疑難解答
圖片精選