1. 程式人生 > >Android 進階13:幾種程序通訊方式的對比總結

Android 進階13:幾種程序通訊方式的對比總結

讀完本文你將瞭解:

RPC 是什麼
IDL 是什麼
IPC 是什麼
Android 幾種程序通訊方式
如何選擇這幾種通訊方式
Thanks
RPC 是什麼
RPC 即 Remote Procedure Call (遠端過程呼叫) 是一種計算機通訊協議,它為我們定義了計算機 C 中的程式如何呼叫另外一臺計算機 S 的程式,讓程式設計師不需要操心底層網路協議,使得開發包括網路分散式多程式在內的應用程式更加容易。

RPC 是典型的 Client/Server 模式,由客戶端對伺服器發出若干請求,伺服器收到後根據客戶端提供的引數進行操作,然後將執行結果返回給客戶端。

RPC 位於 OSI 模型中的會話層: 


在面向物件程式設計中,它也被叫做 “遠端方法呼叫”。

IDL 是什麼
RPC 只是一種協議,規定了通訊的規則。

在實際工作中客戶端與服務端會有各種各樣的平臺,就好像日常開發一樣,為了統一處理不同的實現,需要定義一個共同的介面,於是有了 IDL。

IDL 即 Interface Description Language (介面定義語言)。

它通過一種中立的方式來描述介面,使得在不同平臺上執行的物件和用不同語言編寫的程式可以相互通訊交流。比如,一個元件用 C++ 寫成,另一個元件用 Java 寫,仍然可以通訊。

IPC 是什麼
IPC 即 Inter-Process Communication (程序間通訊)。

Android 基於 Linux,而 Linux 出於安全考慮,不同程序間不能之間操作對方的資料,這叫做“程序隔離”。

“程序隔離”更詳細的介紹(節選自:http://blog.csdn.net/u010132993/article/details/72582655):

在 Linux 系統中,虛擬記憶體機制為每個程序分配了線性連續的記憶體空間,作業系統將這種虛擬記憶體空間對映到實體記憶體空間,每個程序有自己的虛擬記憶體空間,進而不能操作其他程序的記憶體空間,只有作業系統才有許可權操作實體記憶體空間。 
程序隔離保證了每個程序的記憶體安全。

但是在大多數情形下,不同程序間的資料通訊是不可避免的,因此作業系統必須提供跨程序通訊機制。

Android 幾種程序通訊方式
跨程序通訊要求把方法呼叫及其資料分解至作業系統可以識別的程度,並將其從本地程序和地址空間傳輸至遠端程序和地址空間,然後在遠端程序中重新組裝並執行該呼叫。

然後,返回值將沿相反方向傳輸回來。

Android 為我們提供了以下幾種程序通訊機制(供開發者使用的程序通訊 API)對應的文章連結如下:

檔案
AIDL (基於 Binder) 
Android 進階:程序通訊之 AIDL 的使用
Android 進階:程序通訊之 AIDL 解析
Binder 
Android 進階:程序通訊之 Binder 機制淺析
Messenger (基於 Binder) 
Android 進階:程序通訊之 Messenger 使用與解析
ContentProvider (基於 Binder) 
Android 進階:程序通訊之 ContentProvider 內容提供者
Socket 
Android 進階:程序通訊之 Socket (順便回顧 TCP UDP)
在上述通訊機制的基礎上,我們只需集中精力定義和實現 RPC 程式設計介面即可。

如何選擇這幾種通訊方式
《Android 開發藝術探索》中總結的已經比較全面了:

這裡再對比總結一下:

只有允許不同應用的客戶端用 IPC 方式呼叫遠端方法,並且想要在服務中處理多執行緒時,才有必要使用 AIDL
如果需要呼叫遠端方法,但不需要處理併發 IPC,就應該通過實現一個 Binder 建立介面
如果您想執行 IPC,但只是傳遞資料,不涉及方法呼叫,也不需要高併發,就使用 Messenger 來實現介面
如果需要處理一對多的程序間資料共享(主要是資料的 CRUD),就使用 ContentProvider
如果要實現一對多的併發實時通訊,就使用 Socket
Thanks
《Android 開發藝術探索》 
https://zh.wikipedia.org/wiki/%E9%81%A0%E7%A8%8B%E9%81%8E%E7%A8%8B%E8%AA%BF%E7%94%A8 
https://zh.wikipedia.org/wiki/%E6%8E%A5%E5%8F%A3%E6%8F%8F%E8%BF%B0%E8%AF%AD%E8%A8%80 
http://blog.csdn.net/u010132993/article/details/72582655 
https://developer.android.com/guide/components/processes-and-threads.html
--------------------- 
作者:拭心 
來源:CSDN 
原文:https://blog.csdn.net/u011240877/article/details/72863432 
版權宣告:本文為博主原創文章,轉載請附上博文連結!