Android程序間通訊 - 幾種方式的對比總結
什麼是RPC
RPC(Remote Procedure Call)即遠端過程呼叫
,它是一種通過網路從遠端計算機程式上請求服務,在不需要了解底層網路技術的協議下,即可獲取計算機程序中的資料。RPC使得開發包括網路分散式多程式在內的應用程式更加容易。
RPC在OSI網路通訊7層模型中,位於傳輸層
與應用層
之間,即位於會話層
:
RPC實現模式,就是我們常說的C/S結構,引用百度百科的定義:
RPC採用客戶機/伺服器模式。請求程式就是一個客戶機,而服務提供程式就是一個伺服器。首先,客戶機呼叫程序傳送一個有程序引數的呼叫資訊到服務程序,然後等待應答資訊。在伺服器端,程序保持睡眠狀態直到呼叫資訊到達為止。當一個呼叫資訊到達,伺服器獲得程序引數,計算結果,傳送答覆資訊,然後等待下一個呼叫資訊,最後,客戶端呼叫程序接收答覆資訊,獲得程序結果,然後呼叫執行繼續進行。
簡而言之:客戶端能向服務端傳送若干個程序請求,服務端根據傳送的程序引數依次返回對應的計算結果。RPC可以說客戶端呼叫服務端的介面的過程,是面向介面的程式設計。
RPC在Android中咋樣體現的,我們看看官方的解釋RPC與IPC的關係
Android 利用遠端過程呼叫 (RPC) 提供了一種程序間通訊 (IPC) 機制,通過這種機制,由 Activity 或其他應用元件呼叫的方法將(在其他程序中)遠端執行,而所有結果將返回給呼叫方。 這就要求把方法呼叫及其資料分解至作業系統可以識別的程度,並將其從本地程序和地址空間傳輸至遠端程序和地址空間,然後在遠端程序中重新組裝並執行該呼叫。 然後,返回值將沿相反方向傳輸回來。 Android 提供了執行這些 IPC 事務所需的全部程式碼,因此您只需集中精力定義和實現 RPC 程式設計介面即可。
要執行 IPC,必須使用 bindService() 將應用繫結到服務上。
也就是說,RPC在的Android具體體現,是依賴 bindService()的方式,在onBind方法將服務端的計算結果返回給客戶端(Activity等元件)的過程。
什麼是IPC
IPC 即 Inter-Process Communication (程序間通訊),是指程序間資料互動的過程。
Android底層是基於Linux,而Linux基於安全考慮,是不允許兩個程序間直接操作對方的資料,這就是程序隔離
在Linux系統中,虛擬記憶體機制為每個程序分配了線性連續的記憶體空間,作業系統將這種虛擬記憶體空間對映到實體記憶體空間,每個程序有自己的虛擬記憶體空間,進而不能操作其他程序的記憶體空間,每個程序只能操作自己的虛擬記憶體空間,只有作業系統才有許可權操作實體記憶體空間.程序隔離保證了每個程序的記憶體安全,但是在大多數情形下,不同程序間的資料通訊是不可避免的,因此作業系統必須提供跨程序通訊機制。
雖然Android是基於Linux,但並不能繼承Linux中的程序通訊的方式,Android有著自己程序間通訊方式。常用有如下幾種:
- Bundle (四大元件間)
- 檔案共享
- AIDL (基於Binder)
- 能自動生成Binder檔案的工具,相當於工具。
- Android程序通訊 - AIDL的使用方法
- Messenger(基於Binder)
- 類似於Hnadler發訊息用法
- Android程序間通訊 - Messenger的使用和理解
- ContentProvider(基於Binder)
- Socket(網路)
下面引用Android開發藝術探索的總結,已經很全面了
參考
- Android開發藝術探索
- https://blog.csdn.net/u010132993/article/details/72582655
- https://baike.baidu.com/item/%E8%BF%9C%E7%A8%8B%E8%BF%87%E7%A8%8B%E8%B0%83%E7%94%A8%E5%8D%8F%E8%AE%AE/6893245?fromtitle=RPC&fromid=609861
- https://developer.android.com/guide/components/processes-and-threads
- https://blog.csdn.net/u011240877/article/details/72863432