?前面一節(jié)講了AIDL最進(jìn)本的知識,這一節(jié)中將會結(jié)合更復(fù)雜的場景,更深入地介紹AIDL。(這一節(jié)的內(nèi)容會持續(xù)補充完整)
? 1、Client端是如何實現(xiàn)調(diào)用Server端方法的
? 2、AIDL支持的數(shù)據(jù)類型
? 3、AIDL數(shù)據(jù)類序列化問題
? 4、AIDL回調(diào)的使用
?當(dāng)Server端某個操作執(zhí)行完后,需要通知Client端自己完成了任務(wù),這個時候回調(diào)就帶來了很大的便利,和在同一個App中使用回調(diào)效果一樣。例如在上一節(jié)的例子中,Server完成了setName()這個操作(耗時的異步操作更能體現(xiàn)回調(diào)的作用)后,要通知Client端自己完成了任務(wù),可以進(jìn)行下一步的操作了,就是這樣一個場景?,F(xiàn)在在前面AIDL例子基礎(chǔ)上,對回調(diào)的使用步驟進(jìn)行說明。
(1)在Server端IDemoService.aidl同一目錄中添加一個新的.aidl接口文件,我這里命名為IDemoCallback.aidl,內(nèi)容如下:

(2)在IDemoService.aidl中添加注冊/反注冊兩個方法

? ? 第13行和第15行為新增的方法。將這兩個.aidl文件同步到Client端,使C/S兩端的aidl文件完全一樣,均為

最好將兩個app都編譯一遍,這樣后面有些地方可以用代碼補全,而不用手動書寫。當(dāng)然在AidlService.java中實現(xiàn)接口的時候肯定會報錯的,把新增的方法補上就可以了。
(3)在AidlService.java中添加如下加粗部分的代碼,

RemoteCallbackList是系統(tǒng)提供的一個用于存儲回調(diào)對象的列表,其對象mCallbacks用于存儲注冊的IDemoCallback對象。通過第3行的callback()方法中的內(nèi)容,我們可以推測它是采用一種類似于Broadcast的方式來實現(xiàn)回調(diào)的。當(dāng)setName()方法執(zhí)行完畢后,callback("'Andy song' is setted");就會把回調(diào)信息反饋給Client中注冊該回調(diào)的地方了。

在解綁定的地方調(diào)用unRegisterCallback()反注冊回調(diào)即可,這樣就完成了代碼整個代碼的編寫。這里需要注意注冊回調(diào)的時機(jī),一定要在setName()執(zhí)行前注冊,否則Client端收不到回調(diào)信息。
(5)運行C/S端,然后“綁定”/“解綁”,就會看到如下log信息:

第5行就是回調(diào)信息,表示回調(diào)成功。