那么,什么叫基于消息的進程間通信方式呢?看個圖理解下:
可以看到,我們可以在客戶端發(fā)送一個Message給服務(wù)端,在服務(wù)端的handler中會接收到客戶端的消息,然后進行對應(yīng)的處理,處理完成后,再將結(jié)果等數(shù)據(jù)封裝成Message,發(fā)送給客戶端,客戶端的handler中會接收到處理的結(jié)果。
? ? ? ?介入正題,跨進程通訊可以通過Binder來實現(xiàn),在android中最容易實現(xiàn)的跨進程通訊可以通過兩個獨立的app來實現(xiàn),一個作為Server一個作為client;
首先,在Server中創(chuàng)建一個Service,然后重點來了,在onBind方法中返回的IBinder我們可以用兩個東西來替換從而實現(xiàn)跨進程通訊:1.Messenger 2.AIDL文件;
如果使用Messenger,在onBind方法中我們使用Messenger.getBinder()方法,
通過上述代碼,可以發(fā)現(xiàn)最終的MessengerImpl類繼承IMessenger.Stub,所以歸根到底都是ADIL的實現(xiàn)機制。
然后來講一下AIDL的實現(xiàn)方法,Binder的連接形式是以Server和Client在兩端,Binder在中間充當一個中間者,為了兩端各自的安全,Binder提供給兩端的是Proxy,其中用到了Proxy設(shè)計模式,而且這個代理中只有空的方法,
舉個例子:
Client端想獲取Server端的add()方法返回的數(shù)據(jù),就會告訴Binder需要add()返回數(shù)據(jù),進程之間通信的數(shù)據(jù)都會經(jīng)過運行在內(nèi)核空間里面的驅(qū)動,驅(qū)動在數(shù)據(jù)流過的時候做了一點手腳,它并不會給Client進程返回一個真正的object對象,而是返回一個看起來跟object一模一樣的代理對象objectProxy,這個objectProxy也有一個add方法,但是這個add方法沒有Server進程里面object對象的add方法那個能力;objectProxy的add只是一個傀儡,它唯一做的事情就是把參數(shù)包裝然后交給驅(qū)動,最終通過Binder向Server提交獲取add方法的請求,然后獲取到數(shù)據(jù)最終返回給Client。
然后現(xiàn)在我們深入了解下AIDL和Binder的工作方式,因為表達能力有限,這邊我會引用鴻神的原話,當然你們也可以直接看他的博客,今后盡量不做搬運工:http://blog.csdn.net/lmj623565791/article/details/38461079;
以上是我自己學(xué)習(xí)以后的認識,源碼在鴻神博客中也有,如有問題可以留言,那是相當歡迎;