https://developer.android.google.cn/guide/components/aidl
一 實(shí)際創(chuàng)建步驟:
1.在服務(wù)module上創(chuàng)建一個(gè)AIDL文件夾(圖一)
2 創(chuàng)建在剛剛創(chuàng)建的文件夾下創(chuàng)建AIDL文件(圖二)
3 編寫(xiě)AIDL文件(圖三)自定義一個(gè)方法。
android studio 需要手動(dòng)編譯aidl文件一下罚渐,生成對(duì)應(yīng)的Java 文件却汉。
4 編寫(xiě)服務(wù)端service 類(lèi)(圖五)
“Android SDK 工具會(huì)生成一個(gè)以?.aidl?文件命名的?.java?接口文件。生成的接口包括一個(gè)名為?Stub的子類(lèi)荷并,這個(gè)子類(lèi)是其父接口(例如合砂,YourInterface.Stub)的抽象實(shí)現(xiàn),用于聲明?.aidl?文件中的所有方法源织。如需實(shí)現(xiàn)?.aidl?生成的接口翩伪,請(qǐng)擴(kuò)展生成的?Binder?接口(例如,YourInterface.Stub)并實(shí)現(xiàn)從?.aidl?文件繼承的方法谈息。服務(wù)實(shí)現(xiàn)該接口后幻工,就需要向客戶端公開(kāi)該接口,以便客戶端進(jìn)行綁定黎茎。 要為您的服務(wù)公開(kāi)該接口,請(qǐng)擴(kuò)展Service并實(shí)現(xiàn)onBind()当悔,以返回一個(gè)類(lèi)實(shí)例傅瞻,這個(gè)類(lèi)實(shí)現(xiàn)了生成的?Stub∶ぴ鳎”
----------------做具體的工作需要在service 里邊聲明一個(gè)binder接口嗅骄,這個(gè)接口由創(chuàng)建的aidl文件.Stub 的方法返回。也就是aidl里面的聲明的自定義方法由這里真正的去實(shí)現(xiàn)饼疙。比如這里是傳入客戶端的兩個(gè)整數(shù)溺森,返回他倆合。
6 編寫(xiě)客戶端代碼(圖六)
這里需要用顯示的方式去開(kāi)啟服務(wù)端窑眯,注意服務(wù)端注冊(cè)的服務(wù)的時(shí)候:
客戶端啟動(dòng)服務(wù)端服務(wù)的代碼:
“當(dāng)客戶端(如 Activity)調(diào)用?bindService()?以連接此服務(wù)時(shí),客戶端的?onServiceConnected()?回調(diào)會(huì)接收服務(wù)的?onBind()?方法返回的?mBinder?實(shí)例磅甩。當(dāng)客戶端在?onServiceConnected()?回調(diào)中收到?IBinder?時(shí)炊林,它必須調(diào)用xxxx.asInterface(service)?以將返回的參數(shù)轉(zhuǎn)換成?xxxx?類(lèi)型。"(圖七)
----------------------用stub.asinterface 方法獲取底層的代理卷要,這個(gè)代理可以調(diào)用服務(wù)端的方法渣聚,也就是通過(guò)這個(gè)方法實(shí)現(xiàn)了客戶端對(duì)服務(wù)端的操作独榴。比如返回的是IMyAidlInterface,之后九可以通過(guò)這個(gè)變量進(jìn)行客戶端對(duì)服務(wù)端的操作了奕枝。
"客戶端還必須具有對(duì) interface 類(lèi)的訪問(wèn)權(quán)限棺榔,因此如果客戶端和服務(wù)在不同的應(yīng)用內(nèi),則客戶端的應(yīng)用?src/?目錄內(nèi)必須包含?.aidl?文件(它生成?android.os.Binder?接口 — 為客戶端提供對(duì) AIDL 方法的訪問(wèn)權(quán)限)的副本隘道。"
-----------------需要在客戶端創(chuàng)建一個(gè)跟服務(wù)端一模一樣的aidl包跟aidl文件症歇,拷貝一下就行(圖八)
7 客戶端調(diào)用服務(wù)端方法
上邊通過(guò)創(chuàng)建的ServiceConnection 方法獲取了服務(wù)端的代理,設(shè)置了返回為全局變量薄声。這樣就可以使用這個(gè)代理去調(diào)用的服務(wù)端的方法了当船,例子(圖九)
aidl里邊聲明了這個(gè)方法,客戶端通過(guò)返回的遠(yuǎn)程代理可以直接調(diào)用服務(wù)端這個(gè)方法默辨,并且還能得到返回值德频。