[藝術探索]第二章 IPC機制(1)

  1. IPC簡介

    IPC是Inter-Process Communication的縮寫,含義爲進程間通信或者跨進程通信,是指兩個進程之間進行數據交換的過程。

    • 進程和線程
      線程是CPU調度的最小單元,同時線程是一種有限的系統資源。進程一般指一個執行單元,在PC和移動設備上指一個程序或者一個應用。一個進程可以包含多個線程,因此進程和線程是包含與被包含關係。

    • Android中的多進程模式

      在Android中使用多進程方法,一種是給四大組件在AndroidMenifest中指定android:process屬性。
      另外一種就是通過JNI在Native層fork一個新的進程。

  2. 開啓新進程的兩種方式

    • <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

    每個進程都會分配一個獨立的虛擬機,不同的虛擬機在內存上分配有不同的地址空間,這就導致不同的虛擬機中訪問同一個類對象會產生多份副本。
    所有運行在不同進程中的四大組件,只要它們之間需要通過內存來共享數據都會共享失敗,這也是多進程帶來的主要影響。

  3. Serializable、Parcelable、Binder

    SerializableParcelable接口爲數據序列化接口。

Serializable需要指定serialVersionUID(可以手動指定也可以由編譯器自動生成)序列化和反序列化時兩者serialVersionUID是相同的就可以正常進行操作。
如果不手動指定serialVersionUID這個值則會隨着當前類的數據結構變化而變化,導致反序列化失敗造成程序crash
Serializable主要是通過io流進行將數據讀寫到本地來進行持久化的。

Parcelable是Android平臺提供的數據序列化接口,主要用在內存序列化上。

BinderAndroid中的一個類,實現了IBinder接口,從IPC角度來說BinderAndroid中的一種跨進程通信方式,Binder還可以理解爲一種虛擬的物理設備,它的設備驅動是/dev/binder/,它還是客戶端和服務端進行通信的媒介。
個人理解:Binder基本原理進程間將數據序列化存儲至/dev/binder/,再由另外進程將數據進行反序列化取出,至此完成了進程間的通信(Binder機制是一個很深入的話題,現在只提基本原理,不聊上層實現細節。)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章