那么,什么叫基于消息的進(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)歡迎;