什么是aidl
aidl英文全稱是Android Interface Definition Language,即Android接口定義語(yǔ)言,AIDL與其他IDL語(yǔ)言類似, 它允許你定義客戶端與服務(wù)端達(dá)成一致的程序接口使用進(jìn)程間通信相互交流。 在Android上面,一個(gè)進(jìn)程不能正常的訪問另一個(gè)進(jìn)程的內(nèi)存。 所以說,他們需要分解他們的對(duì)象為操作系統(tǒng)可以理解的基本單位,然后為你把這些對(duì)象按次序跨越進(jìn)程邊界 書寫這些代碼是單調(diào)冗長(zhǎng)的,所以android使用AIDL為咱們處理這個(gè)問題。
注意:使用AIDL只有在你允許來(lái)自不同應(yīng)用的客戶端跨進(jìn)程通信訪問你的service,并且想要在你的service種處理多線程的時(shí)候才是必要的。 如果你不需要執(zhí)行不同應(yīng)用之間的IPC并發(fā),你應(yīng)該通過實(shí)現(xiàn)Binder建立你的接口,或者如果你想執(zhí)行IPC,但是不需要處理多線程。那么使用Messenger實(shí)現(xiàn)你的接口
aidl所支持的類型
默認(rèn)支持的數(shù)據(jù)類型包括:?
Java中的八種基本數(shù)據(jù)類型,包括 byte,int,long,float,double,boolean,char (不支持short類型)
String 類型。
CharSequence類型。
List類型:List中的所有元素必須是AIDL支持的類型之一,或者是一個(gè)其他AIDL生成的接口,或者是定義的parcelable(下文關(guān)于這個(gè)會(huì)有詳解)。List可以使用泛型。
Map類型:Map中的所有元素必須是AIDL支持的類型之一,或者是一個(gè)其他AIDL生成的接口,或者是定義的parcelable。Map是不支持泛型的
aidl的使用
1,傳遞基本類型的使用
模擬一種場(chǎng)景,就是在客戶端輸入兩個(gè)數(shù),在服務(wù)端計(jì)算客戶端輸入的兩個(gè)數(shù)的和然后返回給客戶端,客戶端用來(lái)顯示兩個(gè)數(shù)的和
(1)首先在服務(wù)端 創(chuàng)建aidl文件,具體步驟如下,如下圖所示

點(diǎn)擊AIDL Folder? 輸入aidl,ok即可
(2)在aidl包下創(chuàng)建aidl文件,步驟如下圖所示

(3)在aidl文件中寫入需要的接口方法并且編譯

如果結(jié)果如下圖所示,則代表編譯成功

(4)在服務(wù)端寫一個(gè)service將aidl接口暴露出去

至此服務(wù)端的事已經(jīng)干完了
(5)在客戶端中將服務(wù)端中的aidl文件復(fù)制一份,一定要注意的是包括包名必須要與服務(wù)端保持一致,不然會(huì)報(bào)以下錯(cuò)誤?java.lang.SecurityException: Binder invocation to an incorrect interface
(6)當(dāng)客戶端啟動(dòng)的時(shí)候通過綁定Service的形式與服務(wù)端建立連接

(7)當(dāng)客戶端與服務(wù)端綁定之后需要在客戶端拿到定義的接口的代理類的對(duì)象,然后用代理類的對(duì)象調(diào)用在aidl文件中定義的方法,返回計(jì)算結(jié)果并且顯示


2,傳遞自定義類型的使用?
模擬一種情景,就是在客戶端點(diǎn)擊按鈕一次,將自定義的一個(gè)類型的數(shù)據(jù)傳遞到服務(wù)端,服務(wù)端收到數(shù)據(jù)之后,將其加入到集合中并且返回
(1)(2)步驟與基本類型相同,不再進(jìn)行重復(fù)
(3)在服務(wù)端創(chuàng)建一個(gè)Person類,并且實(shí)現(xiàn)Parcelable接口,并且手動(dòng)在該類中定義一個(gè)名稱叫做CREATOR的變量,必須注意的是名字必須叫這個(gè),并且依次讀取在writeToParcel中寫入的數(shù)據(jù),如下所示

在aidl文件中加入 如下方法 ,并且手動(dòng)在aidl文件中導(dǎo)入Person的包,比如:import com.example.aidlserver.bean.Person;??

編譯服務(wù)端,會(huì)發(fā)現(xiàn)報(bào)如下錯(cuò)誤

這是因?yàn)檫@樣寫編譯器是不認(rèn)識(shí)Person的,必須接入一個(gè)aidl文件去描述Person,要注意的是此aidl文件必須要與Person類的包名保持一致,如下所示

至此服務(wù)端的工作就做完了
(4)將剛才在服務(wù)端寫入的aidl文件和Person類拷貝一份到客戶端,注意包名保持一致
(5)在客戶端調(diào)用服務(wù)端,步驟與基本類型一致,不再贅述了,運(yùn)行結(jié)果如下所示

源碼地址:https://github.com/zhanmusi2323/AidlClient