1. 程式人生 > >程序間通訊(IPC機制)精煉詳解

程序間通訊(IPC機制)精煉詳解

一、前期基礎知識儲備

IPC定義:IPC是intent-Process Communication的縮寫,含義為程序間通訊或者跨程序通訊,是指兩個程序之間進行資料交換的過程。IPC不是Android所獨有的,任何一個作業系統都需要有相應的IPC機制,比如Windows上可以通過剪貼簿、管道和郵槽等來進行程序間通訊,而Linux上可以通過命名共享內容、訊號量等來進行執行緒間通訊。對於Android來說,它也有自己的程序間通訊方式,Android建構在Linux基礎上,繼承了一部分Linux的通訊方式,同時Android也有自己特有的通訊方式。

二、Android中實現程序通訊的方式

如前文所講,Android建構在Linux基礎,繼承了部分Linux的程序通訊方式也有自己的特色通訊方式,所以Android中具體實現通訊的方式有很多,比如可以通過在Intent中附加extra來傳遞資訊,或者通過共享檔案的方式來共享資料,還可以通過採用Binder方式(Android特色)來跨程序通訊,另外,ContentProvider天生就是支援跨程序訪問的,因此我們也可以採用它來進行IPC。此外網路通訊也是可以實現資料傳遞的,所以Socket也可以用來實現IPC,下面展開來具體講解一下:

(1)AIDL

1)AIDL定義——AIDL(Android 介面定義語言) 是 Android 提供的一種程序間通訊 (IPC) 機制。我們可以利用它定義客戶端與服務使用程序間通訊 (IPC) 進行相互通訊時都認可的程式設計介面。在 Android 上,一個程序通常無法訪問另一個程序的記憶體。 儘管如此,程序需要將其物件分解成作業系統能夠識別的原語,並將物件編組成跨越邊界的物件。編寫執行這一編組操作的程式碼是一項繁瑣的工作,因此 Android 會使用 AIDL 來處理。通過這種機制,我們只需要寫好 aidl 介面檔案,編譯時系統會幫我們生成 Binder 介面。

2)AIDL 支援的資料型別——①Java 的基本資料型別;

②List 和 Map;③其他 AIDL 生成的介面;④實現 Parcelable 的實體

(2)Messager

Messager可以翻譯為信使,顧名思義,通過它可以在不同程序中傳遞Message物件,在Message中放入我們需要傳遞的資料,就可以輕鬆實現程序間資料傳遞了。Messager是一種輕量級的IPC方案,它的底層實現是AIDL。

Messager的使用方法很簡單,它對AIDL做了封裝,使得我們可以更加簡便的實現程序間通訊。同時,由於它一次處理一個請求,因此在服務端我們不用考慮執行緒同步的問題,這是因為服務端中不存在併發執行的情形。

(3)ContentProvider

ContentProvider是Android中提供的專門用於不同應用間進行資料共享的方式,從這一點看,它天生就是和程序間通訊。和Messager一樣,ContentProvider的底層實現同樣也是Binder

,由此可見,Binder在Android系統中是何等的重要。雖然ContentProvider的底層實現是Binder,但是它的使用過程要比AIDL簡單許多,這是因為系統已經為我們做好封裝,使得我們無須關心底層細節的實現即可輕鬆實現IPC。

ContentProvider儘管使用起來比較簡單,包括自己建立一個ContentProvider也不是什麼難事,但是,它的細節還是相當多,比如CRUD操作、防止SQL注入和許可權控制等等。

(4)Socket

Socket也稱為“套接字”,是網路通訊中的概念,它分為流式套接字和使用者資料套接字兩種,分別對應於網路的傳輸控制層中的TCP和UDP協議。TCP協議是面向連線的協議,提供穩定的雙向通訊功能,TCP連線的建立需要經過“三次握手”才能完成,為了提供穩定的資料傳輸功能,其本身提供了超市重傳機制,因此具有很高的穩定性;而UDP是無連線的,提供不穩定的單向通訊功能,當然UDP也可以實現雙向通訊功能。

在效能上,UDP具有更好的效率,其缺點是不保證資料一定能夠正確傳輸,尤其是在網路繁重的時候。

(5)Bundle

我們知道,四大元件中的三大元件(Activity、Service、BroadcastReceiver)都是支援在Intent中傳遞Bundle資料的,由於Bundle實現了Parcelable介面,所以它可以方便地在不同的程序間進行傳輸。基於這一點,當我們在一個程序中啟動了另一個程序的Activity、Service和BroadcastReceiver,我們就可以在Bundle中附加我們需要傳輸給遠端程序的資訊並通過Intent傳送出去。當然,我們傳輸的資料必須能夠被序列化,比如基本型別、實現了Parcellable介面的物件、實現了Serializable介面的物件以及一些Android支援的特殊物件,具體內容可以看Bundle這個類。

三、選擇合適的IPC方式


上面這張表很好的總結了幾種IPC通訊的方式的優缺點,開發者可以根據自己的實際情況,選擇最合適的IPC通訊方式。

總結(看文章的正確方式,就是看總結):引用一個問題:這種跨程序的通訊(包括AIDL)在商業上應用的多嗎,一般在什麼場合下會用到?

答:定製Android裝置或專案比較大的時候。例如:電視、手錶等裝置 一般都有一個桌面程式,但裡面的小功能太多,例如:聽歌、相簿、節目表等等,很多,如果把所有的功能都寫在一個程式,每次載入都把東西一股腦的載入到記憶體裡佔用就太大了,後臺記憶體不夠要回收的時候就有可能把桌面的主程式收走了,這肯定不是理想的效果,所以遇到比較大的專案的時候,需要將每個小模組抽取成一個獨立程序的小應用,但這些模組之間也需要互相通知,所以要用到跨程序通訊,這樣做就不用一次性的載入到記憶體裡,如果記憶體不夠的時候可以先把不可見或者空閒的應用先回收。