Android AIDL Binder Messenger

那么,什么叫基于消息的進(jìn)程間通信方式呢?看個(gè)圖理解下:

可以看到,我們可以在客戶端發(fā)送一個(gè)Message給服務(wù)端,在服務(wù)端的handler中會(huì)接收到客戶端的消息,然后進(jìn)行對(duì)應(yīng)的處理,處理完成后,再將結(jié)果等數(shù)據(jù)封裝成Message,發(fā)送給客戶端,客戶端的handler中會(huì)接收到處理的結(jié)果。

? ? ? ?介入正題,跨進(jìn)程通訊可以通過Binder來實(shí)現(xiàn),在android中最容易實(shí)現(xiàn)的跨進(jìn)程通訊可以通過兩個(gè)獨(dú)立的app來實(shí)現(xiàn),一個(gè)作為Server一個(gè)作為client;

首先,在Server中創(chuàng)建一個(gè)Service,然后重點(diǎn)來了,在onBind方法中返回的IBinder我們可以用兩個(gè)東西來替換從而實(shí)現(xiàn)跨進(jìn)程通訊:1.Messenger 2.AIDL文件;

如果使用Messenger,在onBind方法中我們使用Messenger.getBinder()方法,


通過上述代碼,可以發(fā)現(xiàn)最終的MessengerImpl類繼承IMessenger.Stub,所以歸根到底都是ADIL的實(shí)現(xiàn)機(jī)制。

然后來講一下AIDL的實(shí)現(xiàn)方法,Binder的連接形式是以Server和Client在兩端,Binder在中間充當(dāng)一個(gè)中間者,為了兩端各自的安全,Binder提供給兩端的是Proxy,其中用到了Proxy設(shè)計(jì)模式,而且這個(gè)代理中只有空的方法,

舉個(gè)例子:

Client端想獲取Server端的add()方法返回的數(shù)據(jù),就會(huì)告訴Binder需要add()返回?cái)?shù)據(jù),進(jìn)程之間通信的數(shù)據(jù)都會(huì)經(jīng)過運(yùn)行在內(nèi)核空間里面的驅(qū)動(dòng),驅(qū)動(dòng)在數(shù)據(jù)流過的時(shí)候做了一點(diǎn)手腳,它并不會(huì)給Client進(jìn)程返回一個(gè)真正的object對(duì)象,而是返回一個(gè)看起來跟object一模一樣的代理對(duì)象objectProxy,這個(gè)objectProxy也有一個(gè)add方法,但是這個(gè)add方法沒有Server進(jìn)程里面object對(duì)象的add方法那個(gè)能力;objectProxy的add只是一個(gè)傀儡,它唯一做的事情就是把參數(shù)包裝然后交給驅(qū)動(dòng),最終通過Binder向Server提交獲取add方法的請(qǐng)求,然后獲取到數(shù)據(jù)最終返回給Client。

然后現(xiàn)在我們深入了解下AIDL和Binder的工作方式,因?yàn)楸磉_(dá)能力有限,這邊我會(huì)引用鴻神的原話,當(dāng)然你們也可以直接看他的博客,今后盡量不做搬運(yùn)工:http://blog.csdn.net/lmj623565791/article/details/38461079;

以上是我自己學(xué)習(xí)以后的認(rèn)識(shí),源碼在鴻神博客中也有,如有問題可以留言,那是相當(dāng)歡迎;

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容