? ? ? ?本文講的是,Binder通信和AIDL脯倚,一般的理解是,Binder通信可以通過(guò)AIDL來(lái)實(shí)現(xiàn)嵌屎,通過(guò)AIDL定義這樣的接口格式推正,就會(huì)自動(dòng)生成一些類。類似于WebService宝惰,嗯植榕,對(duì),感覺(jué)很類似尼夺。
? ? ? ? 最近在學(xué)習(xí)這個(gè)尊残,發(fā)現(xiàn)一些特別的點(diǎn),網(wǎng)上看了淤堵,大部分都在寫AIDL寝衫,所以,我就提出來(lái),說(shuō)一下。使用Binder通信谨胞,目前洛姑,有三種方案(其實(shí)就兩種啦汹胃。婶芭。。(其實(shí)就一種啦着饥。犀农。。))
1宰掉,直接使用Binder通信
這種情況井赌,是在通信在進(jìn)程內(nèi)的時(shí)候,使用的贵扰,看代碼:
首先仇穗,自定義一個(gè)Binder類:
然后定義一個(gè)服務(wù)端:
然后就是客戶端調(diào)用:
在onServiceConnected中獲取到的IBinder service,如果是同進(jìn)程舞丛,就直接是我們的MyBinder耘子,如果不是同進(jìn)程,IBinder service就是BinderProxy球切。所以說(shuō)谷誓,我們的第一種方式,就是只支持進(jìn)程內(nèi)通信(也就是說(shuō)吨凑,我們的這個(gè)服務(wù)端捍歪,在主配置文件中,配置的:process必須和客戶端一樣)鸵钝。
2糙臼,AIDL通信
這個(gè)網(wǎng)上講的很多啦,首先恩商,創(chuàng)建一個(gè)aidl文件:
然后就是服務(wù)端和客戶端:
3变逃,自定義AIDL所需要的文件:
參照上面aidl生成的接口文件,我們拷貝一份怠堪,然后改一改里面的代碼揽乱,就是我們自定義的接口文件了
客戶端服務(wù)端,參考aidl粟矿。這種方法凰棉,唯一的優(yōu)點(diǎn),就是不需要寫AIDL.嚷炉≡▎可是探橱。申屹。绘证。無(wú)緣無(wú)故多了很多代碼。哗讥。嚷那。
總結(jié):有一個(gè)想要總結(jié)下,就是第一種方式和第二種方式杆煞,aidl是支持進(jìn)程間和進(jìn)程內(nèi)通信的魏宽。我們看這個(gè)AIDL生成的文件會(huì)看到很有意思的一行:
這個(gè)接口在返回Binder實(shí)例的時(shí)候,是判斷决乎,如果是我們需要的队询,就直接強(qiáng)轉(zhuǎn),這個(gè)和我們第一個(gè)方案构诚,沒(méi)有任何差別(也就是進(jìn)程內(nèi)通信)蚌斩;否則,就使用Stub.Proxy()方法范嘱,返回一個(gè)實(shí)例送膳。也就是說(shuō),AIDL方式丑蛤,其實(shí)是把我們的第一種方式包含進(jìn)去了叠聋。所以,如果我們正好有這樣的場(chǎng)景受裹,只需要進(jìn)程內(nèi)通信碌补,那么第一種方法很方便。