8.2 Service3

weixin_33968104發表於2018-07-11

Binder機制

IBinder:1.遠端物件的基本介面,是為了高效能而設計的輕量級遠端呼叫機制的核心部分;

               2.該介面定義了與遠端物件間互動的協議,不僅用於遠端呼叫,也用於程式內呼叫;

(是Android給我們提供的一個程式間通訊(IPC)的一個介面(不直接實現),通過繼承Binder類來實現程式間通訊)

2354038-84c95864239b8542.png
Binder機制淺析

Android使用Binder機制來實現程式間的通訊的原因

2354038-a2b00e477c2a1d86.png
分析

無需關心底層如何實現,只需按照AIDL的規則,自定義一個介面檔案, 然後呼叫呼叫介面中的方法,就可以完成兩個程式間的通訊。

與訊息,廣播等方式相比,適用於涉及多程式併發情況下的程式間通訊。


AIDL使用詳解

IPC:跨程式通訊(interprocess communication);

AIDL:Binder機制使用的介面語言(Android Interface Definition Language),並非程式語言,只是定義兩個程式間的通訊介面;

注意事項:1.介面名詞需要與aidl檔名相同;

                  2.介面和方法前面不要加訪問許可權修飾符:public ,private,protected等,也不能用static final;

                  3.AIDL預設支援的型別包括Java基本型別,String,List,Map,CharSequence;

                  4.處3以外的其他型別需要import宣告,自定義型別作為引數或者返回值需實現Parcelable介面;

                  5.自定義型別和AIDL生成的其它介面型別在aidl描述檔案中,應該顯式import,即便在該類和定義的包在同一個包中;

                  6.非原始型別中,除了String和CharSequence以外,其餘均需要一個方向指示符( in、out、和inout)

                      in表示由客戶端設定,out表示由服務端設定,inout表示客戶端和服務端都設定了該值;

案例1:簡單資料通訊

服務端:1.main目錄下(與java目錄平級),新建aidl資料夾及檔案(與java主包包名層級一致)

2354038-f2e7775fcd96f448.png
建立aidl檔案

            2.建立server端的AIDLService(供clicent端連線呼叫)

            (建立IBinder實現類繼承Stub,再返回給Service的onBind方法,使之同時實現IPerson介面和IBinder介面)

2354038-01acf06d5f2b0cdb.png
建立Service
2354038-19a1bbb25ba55013.png
清單配置

客戶端:1.將服務的aidl資料夾拷過來(保持一致);

               2.繫結遠端service,通過con轉換IBinder,最後呼叫服務端方法;

2354038-135fe0d20c2c3c00.png
使用


案例2:複雜資料通訊

服務端客戶端流程同簡單資料,這裡只演示覆雜資料處理 部分。

1.自定義資料型別並實現序列化;

2.新建該資料型別的aidl檔案;

3.建立業務aidl及service服務

4.client端由於包名與服務端不一致,需修改build.gradle

2354038-54b858b699be6d40.png
序列化
2354038-3149a0566cd329a1.png
結構
2354038-1a70aff0cd42234a.png
業務aidl
2354038-d50b45e2aa4fa22e.png
build配置

直接通過Binder的onTransact完成跨程式通訊 

服務端:

2354038-6e6bf5fe6e56dad7.png
服務端Service
2354038-2c800274dff69cb6.png
清單配置service

客戶端:

2354038-8e99fcaeee42527b.png
客戶端連線service呼叫

相關文章