Binder機(jī)制
IBinder:1.遠(yuǎn)程對(duì)象的基本接口,是為了高性能而設(shè)計(jì)的輕量級(jí)遠(yuǎn)程調(diào)用機(jī)制的核心部分;
? ? ? ? ? ? ? ?2.該接口定義了與遠(yuǎn)程對(duì)象間交互的協(xié)議,不僅用于遠(yuǎn)程調(diào)用,也用于進(jìn)程內(nèi)調(diào)用致燥;
(是Android給我們提供的一個(gè)進(jìn)程間通信(IPC)的一個(gè)接口(不直接實(shí)現(xiàn)),通過(guò)繼承Binder類(lèi)來(lái)實(shí)現(xiàn)進(jìn)程間通信)
Android使用Binder機(jī)制來(lái)實(shí)現(xiàn)進(jìn)程間的通信的原因
無(wú)需關(guān)心底層如何實(shí)現(xiàn)排截,只需按照AIDL的規(guī)則嫌蚤,自定義一個(gè)接口文件,?然后調(diào)用調(diào)用接口中的方法断傲,就可以完成兩個(gè)進(jìn)程間的通信脱吱。
與消息,廣播等方式相比认罩,適用于涉及多進(jìn)程并發(fā)情況下的進(jìn)程間通信箱蝠。
AIDL使用詳解
IPC:跨進(jìn)程通信(interprocess communication);
AIDL:Binder機(jī)制使用的接口語(yǔ)言(Android Interface Definition Language),并非編程語(yǔ)言宦搬,只是定義兩個(gè)進(jìn)程間的通信接口牙瓢;
注意事項(xiàng):1.接口名詞需要與aidl文件名相同;
? ? ? ? ? ? ? ? ? 2.接口和方法前面不要加訪問(wèn)權(quán)限修飾符:public ,private,protected等间校,也不能用static final矾克;
? ? ? ? ?? ? ? ? ?3.AIDL默認(rèn)支持的類(lèi)型包括Java基本類(lèi)型,String憔足,List胁附,Map,CharSequence滓彰;
? ? ? ? ? ? ? ? ? 4.處3以外的其他類(lèi)型需要import聲明控妻,自定義類(lèi)型作為參數(shù)或者返回值需實(shí)現(xiàn)Parcelable接口;
? ? ? ? ? ? ? ? ? 5.自定義類(lèi)型和AIDL生成的其它接口類(lèi)型在aidl描述文件中揭绑,應(yīng)該顯式import饼暑,即便在該類(lèi)和定義的包在同一個(gè)包中;
? ? ? ? ? ? ? ? ? 6.非原始類(lèi)型中洗做,除了String和CharSequence以外,其余均需要一個(gè)方向指示符(?in彰居、out诚纸、和inout)
? ? ? ? ? ? ? ? ? ? ? in表示由客戶(hù)端設(shè)置,out表示由服務(wù)端設(shè)置陈惰,inout表示客戶(hù)端和服務(wù)端都設(shè)置了該值畦徘;
案例1:簡(jiǎn)單數(shù)據(jù)通信
服務(wù)端:1.main目錄下(與java目錄平級(jí)),新建aidl文件夾及文件(與java主包包名層級(jí)一致)
? ? ? ? ????2.創(chuàng)建server端的AIDLService(供clicent端連接調(diào)用)
? ? ? ? ? ? (創(chuàng)建IBinder實(shí)現(xiàn)類(lèi)繼承Stub抬闯,再返回給Service的onBind方法井辆,使之同時(shí)實(shí)現(xiàn)IPerson接口和IBinder接口)
客戶(hù)端:1.將服務(wù)的aidl文件夾拷過(guò)來(lái)(保持一致);
? ? ? ? ? ? ? ?2.綁定遠(yuǎn)程service溶握,通過(guò)con轉(zhuǎn)換IBinder杯缺,最后調(diào)用服務(wù)端方法;
案例2:復(fù)雜數(shù)據(jù)通信
服務(wù)端客戶(hù)端流程同簡(jiǎn)單數(shù)據(jù)睡榆,這里只演示復(fù)雜數(shù)據(jù)處理 部分萍肆。
1.自定義數(shù)據(jù)類(lèi)型并實(shí)現(xiàn)序列化;
2.新建該數(shù)據(jù)類(lèi)型的aidl文件胀屿;
3.創(chuàng)建業(yè)務(wù)aidl及service服務(wù)
4.client端由于包名與服務(wù)端不一致塘揣,需修改build.gradle
直接通過(guò)Binder的onTransact完成跨進(jìn)程通信?
服務(wù)端:
客戶(hù)端: