實現客戶端添加Book,Service接收並打印出書籍信息
一、創建Book類
1.創建文件夾(本文命名為aidl)
2.創建Book類並繼承Parcelable接口(原因:AIDL只能傳送繼承Parcelable接口的類)
詳見:第二章——Parcelable接口的使用(跨進程,Intent傳輸)
二.創建AIDL文件夾與Book.aidl
用AIDL File填寫名字的時候先隨便填寫(因為如果直接填Book為名字時候會報錯,只有先創建完之后再RENAME才不會報錯)
之后變成
為什么要有Book.aidl類,因為只有將類在aidl中聲明時候,AIDL才能調用Book類,接下來為如何聲明
所以說要讓AIDL能夠傳送自定義類需要 ①繼承Parcelable接口 ②創建同名.aidl文件聲明自己。
三、創建IBookManager.aidl(作用:設置讓客戶端允許調用的接口)
四、分析Binder的運行原理
注:Stub對象可以理解為Binder類
1.系統會自動生成IBookManger.java文件在
分析其屬性和方法
DESCRIPTOR:Binder的唯一表標識,"一般用類名表示"
asInterface(IBinder obj):將服務端的Binder對象轉成客戶端的所需的AIDL對象。
①:若客戶端與服務端在同一進程則返回服務端的Stub本身。
②:若客戶端與服務端在不同進程則返回的是Stub.proxy對象。
asBinder():返回當前的Binder對象
onTransact():當客戶端發起跨進程請求時,會調用此方法,返回Stub.proxy
Proxy#getBookList():我們剛才創造的接口。
運行原理:
好了,運行原理和創建方式就到這里。
五、AIDL支持的數據類型
String、Char、基本數據類型、List、Map、Parcelable
六、AIDL文件中 in類型out類型和inout數據的區別
1.只有AIDL支持的數據類型不需要,其他類型的參數必須要加上參數。
in:客戶端的參數輸入;
解析:是把實參的值賦值給行參 那么對行參的修改,不會影響實參的值
out:服務端的參數輸入;
解析:傳遞以后,行參和實參都是同一個對象,只是他們名字不同而已,對行參的修改將影響實參的值
inout:這個可以叫輸入輸出參數,客戶端可輸入、服務端也可輸入。客戶端輸入了參數到服務端后,服務端也可對該參數進行修改等,最后在客戶端上得到的是服務端輸出的參數。
分析in類型和out類型以及調用Proxy#getBookList()的運作流程
假設getBookList()有in、out類型 如:getBookList(in Book book,out String[] str);
當客戶端遠程調用此方法的時候
①:創建該方法需要的輸入類型Parcel對象_data(這里為Book),輸出類型(這里為str),和返回值對象(這里為List),寫入data中
②:調用transact發起RPC(遠程調用請求),掛起當前線程(客戶端的)
③:調用服務端的onTransact(),直到RPC返回結果,從_reply中取出PRC返回結果
④:最后返回_reply的數據(個人認為這里就是將返回的_reply的值給客戶端的str) 導致服務器端修改行參將影響實參的值