本文僅作為 AIDL 的初步了解與具體代碼實(shí)現(xiàn)的講解笼吟。并未深入IPC原理、Binder原理等霸旗。
一贷帮、概述
AIDL :Android Interface Definition Language,即 Android接口定義語言定硝。
- 用于定義服務(wù)器和客戶端通信接口的一種描述語言皿桑,可以拿來生成用于 IPC 的代碼。
IPC :Inter-Process Communication蔬啡,即跨進(jìn)程通信诲侮。
二、基礎(chǔ)
1.文件
AIDL文件以
.aidl
為后綴名箱蟆。-
AIDL文件分為兩類:
一類用來聲明實(shí)現(xiàn)了Parcelable接口的數(shù)據(jù)類型沟绪,以供其他AIDL文件使用那些非默認(rèn)支持的數(shù)據(jù)類型。(注:文件內(nèi)可注釋)
另一類用來定義接口方法空猜,聲明要暴露哪些接口給客戶端調(diào)用绽慈,定向Tag就是用來標(biāo)注這些方法的參數(shù)值。(注:文件內(nèi)不可注釋)
2.數(shù)據(jù)類型
byte辈毯、char坝疼、short、int谆沃、long钝凶、float、double唁影、boolean耕陷、還有String掂名、CharSequence。
實(shí)現(xiàn)了 Parcelable 接口的數(shù)據(jù)類型哟沫。
-
List 類型饺蔑。
- List承載的數(shù)據(jù)必須是AIDL支持的類型,或者是其它聲明的AIDL對象嗜诀。
-
Map類型猾警。
- Map承載的數(shù)據(jù)必須是AIDL支持的類型,或者是其它聲明的AIDL對象隆敢。
3.定向Tag
定向Tag肿嘲,在跨進(jìn)程通信中表示數(shù)據(jù)的流向,用于標(biāo)注方法的參數(shù)值筑公。
-
in:
數(shù)據(jù)只能由客戶端傳向服務(wù)端雳窟。
服務(wù)端對數(shù)據(jù)的修改不會(huì)影響到客戶端。
-
out:
數(shù)據(jù)只能由服務(wù)端傳向客戶端匣屡。
即使客戶端向方法接口傳入了一個(gè)對象封救,該對象中的屬性值也是為空的,即不包含任何數(shù)據(jù)捣作,服務(wù)端獲取到該對象后誉结,對該對象的任何操作,就會(huì)同步到客戶端這邊券躁。
-
inout:
數(shù)據(jù)可在服務(wù)端與客戶端之間雙向流通惩坑。
服務(wù)端對數(shù)據(jù)的改變同時(shí)也同步到了客戶端。
三也拜、注意
如果AIDL方法接口的參數(shù)值類型是:基本數(shù)據(jù)類型以舒、String、CharSequence或者其他AIDL文件定義的方法接口慢哈,那么這些參數(shù)值的定向 Tag 默認(rèn)是且只能是 in蔓钟。以外的參數(shù)值都需要明確標(biāo)注使用哪種定向Tag。
明確導(dǎo)包卵贱。在AIDL文件中需要明確標(biāo)明引用到的數(shù)據(jù)類型所在的包名滥沫。
-
避免出現(xiàn)類名重復(fù)導(dǎo)致無法創(chuàng)建文件的錯(cuò)誤,需要先建立AIDL文件之后再創(chuàng)建類键俱。
- 例:先創(chuàng)建
User.aidl
兰绣,再創(chuàng)建User.java
- 例:先創(chuàng)建
-
實(shí)現(xiàn) Parcelable 的類需要補(bǔ)充
readFromParcel(Parcel dest)
不然編譯不過。// 例(userName password mark 為變量) public void readFromParcel(Parcel dest) { userName = dest.readString(); password = dest.readString(); mark = dest.readByte() != 0; }
定義接口方法的 AIDL 文件是不能注釋的(否則無法編譯)编振。
寫完 接口定義需 Make Module缀辩。
在進(jìn)程間通信中真正起作用的并不是
AIDL
文件,而是系統(tǒng)據(jù)此而生成的文件,可以在以下目錄中查看系統(tǒng)生成的文件雌澄。之后需要使用到當(dāng)中的內(nèi)部靜態(tài)抽象類Stub
。調(diào)用
AIDL
的程序需要把AIDL
文件及實(shí)現(xiàn)Parcelable
接口的數(shù)據(jù)類拷貝過來(不要修改代碼杯瞻,不要修改包路徑)镐牺。
四惋戏、使用
服務(wù)端:AIDL-Service
客戶端:AIDL-Client
2020-04-24