IPC簡介
IPC是
Inter-Process Communication
的縮寫,含義爲進程間通信或者跨進程通信,是指兩個進程之間進行數據交換的過程。進程和線程
線程是CPU調度的最小單元,同時線程是一種有限的系統資源。進程一般指一個執行單元,在PC和移動設備上指一個程序或者一個應用。一個進程可以包含多個線程,因此進程和線程是包含與被包含關係。Android中的多進程模式
在Android中使用多進程方法,一種是給四大組件在AndroidMenifest中指定android:process屬性。
另外一種就是通過JNI在Native層fork一個新的進程。
開啓新進程的兩種方式
<activity android:name="cn.dzws.android.scrollrespondUtils.activity.RecyclerViewActivity" android:process=":remote"/> (1) <activity android:name="cn.dzws.android.scrollrespondUtils.activity.ScrollViewActivity" android:process="cn.dzws.android.scrollrespondUtils.remote"/>(2)
進程名以
:
開頭的進程屬於當前應用的私有進程,其他應用的組件不可以和它跑在同一個進程中。進程名不以:
開頭的進程屬於全局進程,其他應用可以通過ShareUID方式可以和它跑在同一個進程中。
兩個應用通過ShareUID跑在同一個進程中是有要求的,需要這兩個應用有相同的ShareUID並且簽名相同纔可以。多進程模式的運行機制,以及多進程帶來的問題。
public class UserManager { public static int userUid = 1; } (1)RecyclerViewActivity先將userUid賦值爲2 (2)ScrollViewActivity獲取到的userUid還爲1
每個進程都會分配一個獨立的虛擬機,不同的虛擬機在內存上分配有不同的地址空間,這就導致不同的虛擬機中訪問同一個類對象會產生多份副本。
所有運行在不同進程中的四大組件,只要它們之間需要通過內存來共享數據都會共享失敗,這也是多進程帶來的主要影響。Serializable、Parcelable、Binder
Serializable
和Parcelable
接口爲數據序列化接口。
Serializable
需要指定serialVersionUID
(可以手動指定也可以由編譯器自動生成)序列化和反序列化時兩者serialVersionUID
是相同的就可以正常進行操作。
如果不手動指定serialVersionUID
這個值則會隨着當前類的數據結構變化而變化,導致反序列化失敗造成程序crash
;
Serializable
主要是通過io流進行將數據讀寫到本地來進行持久化的。
Parcelable
是Android平臺提供的數據序列化接口,主要用在內存序列化上。
Binder
是Android
中的一個類,實現了IBinder接口,從IPC
角度來說Binder
是Android
中的一種跨進程通信方式,Binder
還可以理解爲一種虛擬的物理設備,它的設備驅動是/dev/binder/
,它還是客戶端和服務端進行通信的媒介。
個人理解:Binder
基本原理是 進程間將數據序列化存儲至/dev/binder/
,再由另外進程將數據進行反序列化取出,至此完成了進程間的通信(Binder機制是一個很深入的話題,現在只提基本原理,不聊上層實現細節。)