標籤:
記得上次阿里電話面試就問,Android中的處理序間通訊有哪些?當時沒怎麼總結過,就只說了一個AIDL。今天就來總結總結吧。
什麼是處理序間通訊?
顧名思義,兩個進程之間進行資料交換的過程,那什麼又是進程呢?
說到進程我們不得不提另一個概念:線程。按照作業系統的描述,線程是CPU調度的最小單元,同時線程是一種有限的系統資源,而進程則是一個執行單元,一個進程可以包含多個線程,也就是說,進程和線程的關係是包含與被內含項目關聯性。在我們行動裝置中,進程可以理解為一個程式或者一個應用。
Android中的處理序間通訊:
1.一個應用因為某些原因需要採用多進程的模式來實現,eg:需要更大的記憶體空間,Android系統限制了一個app的記憶體大小
2.一個應用需要向其他應用擷取或者寫入資料。
我們先來說說,較少遇到的情況,一個應用的多線程運行機制:
通過設定不同的 android: process="" 的屬性,可將某個Activity設定到不能的進程中。Android為每個應用(進程)分配了一個獨立的虛擬機器,不同的虛擬機器在記憶體配置上有不同的地址空間,這就導致在不同的虛擬機器中訪問同一個類的對象會產生多份副本。
那我們如果使用一個應用多進程實現會遇到的問題:
靜態成員、單例模式和線程同步機制失效;
SharedPreferences的可靠性下降,Application會多次建立。
接下來我們就來說說Android中運用較多的兩個應用(進程)之間的通訊,IPC機制。
1.使用Bundle
四大組件中的 Activity 、 Service 、 Receiver都支援,在Intent中通過 Bundle 來傳遞資料。
Bundle 支援傳遞的資料類型:
Map;基礎資料型別 (Elementary Data Type);基礎資料型別 (Elementary Data Type)數組;ArrayList ; 序列化的資料
2.使用檔案分享權限設定
兩個進程對同一個檔案進行讀寫操作,從而實現進程間的通訊。但是這種方式不適合高並發情境,無法做到進程間的及時通訊,我們需要盡量避免並發寫操作或者可以使用線程同步來限制多個線程的寫操作。所以,檔案分享權限設定適合對資料同步要求不高的處理序間通訊。(寫入檔案,SharedPreferences)
3.使用Messenger
Messenger通過在不同進程中傳遞Message對象, 在Message之中放入我們傳入的資料,這樣可實現處理序間通訊。它的底層實現是AIDL;Messenger方法也不能很好地處理高並發情形,通過串列的方式處理用戶端發來的訊息,如果大量的孝心同時從用戶端發送到服務端,服務端需要一個一個處理,這樣Messenger就不合適了。
4.AIDL
AIDL是一個IDL語言,是通過Service進行進程間的通訊,下篇文章我們會詳解。
5.ContentProvider
ContentProvider是Android中提供的專門用於不能應用間進行資料共用的方式,它天生就適合進程間的通訊,它的底層實現是Binder,通過URI來進行我們的訪問。系統預置了許多ContentProvider,比如:通訊錄資訊、議程表資訊等等。
6.使用Socket
這相當於是通過網路來進行的處理序間通訊,他是通過Socket來實現,分為流式通訊端和使用者資料通訊端,分別應用於網路的傳輸控制層中的TCP和UDP協議。
Android中的處理序間通訊(IPC機制)