前言? ? ? ??
Android系統(tǒng)中的進(jìn)程之間不能共享內(nèi)存,那么如果兩個(gè)不同的應(yīng)用程序之間需要通訊需要怎么辦呢?首推的肯定是今天要講的進(jìn)程通訊AIDL,即Android?Interface Definition Language(安卓接口定義語言),是Android用來執(zhí)行進(jìn)程間通訊最主要的方式之一。

????????比如,最最常用的功能,第三方登錄。第三方登錄信息的提供方(像QQ、微信、微博等)都是通過AIDL實(shí)現(xiàn)了跨進(jìn)程的數(shù)據(jù)傳遞,加上一些校驗(yàn)邏輯,保證了數(shù)據(jù)的安全性。
????????慣例,先上效果圖,github地址在文末:

一、AIDL的語法
????????首先,介紹一下AIDL的語法。
????????AIDL的語法與Java的接口寫法十分類似,甚至可以說一模一樣,但也有細(xì)微的區(qū)別,總結(jié)如下:
????????1.不能使用private、public、protect修飾方法;
? ? ? ? 2.支持傳遞數(shù)據(jù)類型有:java基本數(shù)據(jù)類型(byte、short、int、long、float、double、char、boolean)、String、CharSequence、List(接收方必須是ArrayList)、Map(接收方必須是HashMap)、其他AIDL定義的AIDL接口、實(shí)現(xiàn)Parcelable序列化的類;
? ? ? ? 3.其他AIDL定義的AIDL接口和實(shí)現(xiàn)Parcelable序列化的類必須import,即使在相同包結(jié)構(gòu)下,其余的類型不需要import;
? ? ? ? 4.對(duì)于非基本數(shù)據(jù)類型,也不是String和CharSequence類型的,需要有方向指示,包括in、out和inout,in表示由客戶端設(shè)置,out表示由服務(wù)端設(shè)置,inout是兩者均可設(shè)置。
二、AIDL使用
? ? ? ? AIDL的使用分為服務(wù)端和客戶端,由服務(wù)端創(chuàng)建service。首先我們來實(shí)現(xiàn)服務(wù)端的創(chuàng)建和AIDL創(chuàng)建。
? ? ? ? 如下圖,右鍵New創(chuàng)建AIDL文件,會(huì)直接生成一個(gè)AIDL模板類IService.aidl。

? ? ? ? 插入一個(gè)題外話,aidl的存放位置有兩種,一種是像圖中一樣,與java文件夾同級(jí)創(chuàng)建aidl文件夾,然后在其中創(chuàng)建包結(jié)構(gòu),然后aidl文件存放其中;另一種方式是放到j(luò)ava的結(jié)構(gòu)目錄中,使用這種方式需要在build文件中做相應(yīng)配置:

? ? ? ? 回歸正題,我們對(duì)生成的AIDL模板代碼進(jìn)行修改,如下,然后Build-Make Module生成相應(yīng)java文件(文件目錄:app-->build-->generated-->source--aidl-->debug):

? ? ? ? 接著創(chuàng)建一個(gè)Service(AIDLService.class)返回IService的句柄,如下圖,取一個(gè)action如<action android:name="com.leo.aidl" />

????????服務(wù)端的編寫至此完成,接下來是客戶端的編寫。
????????首先將服務(wù)端創(chuàng)建的aidl文件夾原封不動(dòng)拷貝到客戶端,必須保證路徑一致,同樣Build-Make Module生成相應(yīng)java文件。

? ? ? ? 接著,綁定service,一定記得5.0之后綁定service一定要帶上service所處的包名哦!


接下來就可以試試發(fā)送的效果啦!??!

????????到這里就完美結(jié)束啦!就可以看到開頭gif的效果啦,第一次寫分享文章不是很熟練,多多包涵,有錯(cuò)誤請(qǐng)指正,謝謝!
? ? ? ? 完整代碼請(qǐng)戳:github地址