Android AIDL 進(jìn)程間通信使用筆記
AIDL
AIDL是Android Interface definition language的縮寫(xiě),Android 接口定義語(yǔ)言
您可以利用它定義客戶端與服務(wù)使用進(jìn)程間通信 (IPC) 進(jìn)行相互通信時(shí)都認(rèn)可的編程接口
多用于App A 與 App B之間通信
aidl支持的數(shù)據(jù)類(lèi)型
- Java 編程語(yǔ)言中的所有原語(yǔ)類(lèi)型(如 int、long、char、boolean 等等)
- String、CharSequence、List、Map
- 實(shí)現(xiàn)Parcelable接口的對(duì)象,并創(chuàng)建對(duì)應(yīng)的.aidl文件
- 其他的.aidl文件生成的接口
aidl的類(lèi)型
- 對(duì)象aidl文件
package com.mark.aidl; parcelable Entry;
- 接口aidl文件
package com.mark.aidl; interface IRemoteService { int getPid(); }
AIDL的使用
具體的使用官網(wǎng)已經(jīng)說(shuō)的很清楚,不再贅述,可以看下面的資料和我的源碼
筆記
- List的實(shí)際接收的具體類(lèi)始終是 ArrayList
- Map的實(shí)際接收的具體類(lèi)始終是 HashMap
- 對(duì)象類(lèi)型的包名需要和對(duì)應(yīng)的aidl文件的包名一致
- 客戶端和服務(wù)端的aidl文件及包名必須一致
綁定服務(wù)
Intent i = new Intent("com.mark.aidl.action.AIDL_SERVICE");
i.setPackage("com.mark.aidl");
bindService(i, mConnection, BIND_AUTO_CREATE);
定向TAG
非原語(yǔ)參數(shù)都需要指示數(shù)據(jù)走向的方向標(biāo)記。可以是 in、out 或 inout(見(jiàn)以下示例)。
原語(yǔ)默認(rèn)為 in,不能是其他方向
參考資料:探索AIDL定向tag in out inout原理
- 定向tag in 修飾的的參數(shù),經(jīng)序列化后傳遞服務(wù)端,服務(wù)端反序列化得到一個(gè)與之值相同的新的對(duì)象;
- 定向tag out 修飾的參數(shù),客戶端不會(huì)序列化該參數(shù),而是服務(wù)端調(diào)用無(wú)參構(gòu)造方法新建了一個(gè)對(duì)象,待目標(biāo)方法返回后,將參數(shù)寫(xiě)入reply返回給客戶端;
- 定向tag inout 基本上算是in、out的并集,為什么說(shuō)基本上,因?yàn)閛ut會(huì)在服務(wù)端通過(guò)new關(guān)鍵字來(lái)新建一個(gè)對(duì)象,而inout已經(jīng)通過(guò)反序列化客戶端傳過(guò)來(lái)的數(shù)據(jù)得到一個(gè)新的對(duì)象,就沒(méi)有別要再new一個(gè)了。
源碼奉上
github地址
- AidlClient 為客戶端
- AidlTest 為服務(wù)端