Android Studio中如何創建AIDL


實現客戶端添加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) 導致服務器端修改行參將影響實參的值

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM