Android AIDL使用過程

原文鏈接:https://blog.csdn.net/w296365959/article/details/79817203

服務端:

1.在Android Studio中 src目錄上右鍵創建一個AIDL文件 並命名,完成後會再main下自動生成一個aidl目錄,該目錄的包名和java下的包名是一致的。 

這裏寫圖片描述

創建完成後樣式如下圖所示: 

這裏寫圖片描述每次生成的.aidl文件後我們需要build一下才能讓系統生成自後我們能使用文件。因爲在進程間通信中真正起作用的並不是 AIDL 文件,而是系統據此而生成的文件,在Android Studio下,我們可以在build/generated/aidl目錄下找到這些Java文件。之後需要使用到當中的內部靜態抽象類 Stub。 
當然我們可以在所有aidl文件寫完再build,也可以每次寫完一個build一下。這裏寫圖片描述

2.我們在java對應bean目錄下 生成一個實體類(AIDL沒有用中到就不用寫了),這裏我們寫一個書籍類好了 這裏寫圖片描述
3.我們要在AIDL中用到這個實體類,所以需要用Parcelable序列化該實體類 這裏寫圖片描述
4.接着我們要把用到的bean類在上面創建的aidl包下相同目錄下創建對應實體類的aidl文件,並把它改爲聲明parcelable數據類型的AIDL文件這裏寫圖片描述
注意這裏的p是小寫。 
5.然後可以再開始寫的MyRemoteService.aidl裏定義能被客戶端調用的接口。 
至此,我們的aidl文件寫完了, 寫完後我們make project或者make對應的module讓漏掉的文件自動生成。

這裏寫圖片描述

6.接下來 在java下創建一個類IBinder繼承MyRemoteService.aidl對應的MyRemoteService.Stub,實現對應的方法 這裏寫圖片描述
7.然後使用服務暴露接口給外部 
創建一個服務RemoteService 繼承Service,實現對應方法, 
綁定MyBinder. 這裏寫圖片描述
8.在清單文件裏註冊服務 

到這裏服務端的完成了。還可以添加 接下來是客戶端了這裏寫圖片描述

客戶端: 

1.新建一個工程作爲客戶端,我們把服務端的 的aidl整個包下所有東西都拷貝到新項目中,然後make project或者make對應的module。 

2.如果aidl有用到bean實體類,我們也要把這些實體類照搬過來, 


3.接下來,我們就可以在客戶端的activity裏連接遠程服務 實現aidl通信

4.在onServiceConnected()回調中,我們使用MyRemoteService.Stub.asInterface(IBinder)方法返回我們的接口的引用。接着客戶端就可以通過它來與服務端通信了。 
mMyRemoteService.getBookName(); 
mMyRemoteService.setBookNumber(23); 
圖中方法中就是對遠程接口的調用。

某些機型需要在服務端的開啓服務才能在客戶端連接成功, 
所以還可以在在界面或application裏啓動AIDL的服務。 
我測試時 華爲榮耀7i(ATH-TL00H) 可以開啓,而vivo V3M A 則不能開啓其他進程的服務。 
app被異常結束後系統重新啓動persistent爲true的app 

添加android:persistent =“true”,使應用保活

最後,總結下 AIDL 的步驟:

服務端進程:

1:創建AIDL文件如xxx.aidl

2:在接口中自定義方法,如果有bean則實例化改bean實體類

3:構建Service遠程服務

4:最後在清單文件裏 註冊服務,其中屬性要加上export:true 讓外部程序可以訪問。

客戶端進程:

1:將服務端的AIDL文件拷貝到main文件夾下,(如果有bean也要對應拷貝)。(包名要求與服務端的一致)

2:重建一下項目檢查一下java文件是否構建成功

3:連接綁定服務,獲取aidl接口實例。 

4:按需調用遠程接口

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章