Android藝術|IPC機制學習

IPC機制學習

文章目錄

1)IPC基礎及概念
2)Binder機制
3)IPC方式


IPC基礎及概念

  • 1.多進程模式
    • 進程與線程
      • 進程,一般指一個執行單元,在PC和移動設備上指一個程序或應用
      • 線程,CPU調度的最小單元
      • 一個進程可包含多個線程,即一個應用程序上可以同時執行多個任務
      • 開啓多進程的方式
        • 在AndroidMnifest中給四大組件指定屬性android:process
        • 進程名的命名規則:
          • 以":"開頭的進程,屬於當前應用的私有進程
          • 完整命名,屬於全局進程
      • 查看進程信息的方法
        • 通過DDMS視圖查看進程信息
      • 多進程造成的影響
        • 靜態變量和單例模式失效
        • 線程同步機制失效
        • SharedPreference的不可靠性下降
        • Applcation多次創建
          • Android系統會爲新的進程分配獨立的虛擬機,相當於系統又把這個應用重新啓動了一次
  • 2.序列化
    • 含義
      • 將一個對象轉換成可存儲或傳輸的狀態,序列化後的對象可以在網絡上進行傳輸,也可以存儲到本地
      • 需要通過Intent和Binder等傳輸類對象就必須完成對象的序列化過程。
      • 靜態成員變量屬於類,不屬於對象,所以它和和用transient關鍵字標記的成員變量不參與序列化。
    • 實現方式
      • Serializable

        • Java的序列化接口,將一個對象轉換成可存儲或可傳輸的狀態
        • 簡單但效率較低,開銷大
        • 適合將對象序列化到存儲設備或者將對象序列化到網絡設備傳輸
        • 序列化後的數據中的serialVersionUID要和當前類的serialVersionUID相同才能正常的序列化
      • Parcelable

        • Android的序列化接口,將一個對象進行分解,且分解後的每一部分都是傳遞可支持的數據類型
        • 高效但比較麻煩
        • 用在內存的序列化

Binder機制

  • 1.概念
    • 是一個類,實現IBinder接口
    • 是Android中的一種跨進程通信的方式
    • ServiceManager連接各種Manager和相應的ManagerService的橋樑
  • 2.優點
    • a.傳輸效率高、可操作性強。傳輸效率主要影響因素是內存拷貝的次數,拷貝次數越少,傳輸速率越高
      • 對於消息隊列、Socket和管道來說,數據先從發送方的緩存區拷貝到內核開闢的緩存區中,再從內核緩存區拷貝到接收方的緩存區,一共兩次拷貝
      • 對於Binder來說,數據從發送方的緩存區拷貝到內核的緩存區,而接收方的緩存區與內核的緩存區是映射到同一塊物理地址的,節省了一次數據拷貝的過程
    • b.實現C/S架構方便
    • c.安全性高
  • 3.角色
    • Server,Client,ServiceManager和Binder驅動
      • ServiceManager:服務的管理者,將Binder名字轉換爲Client中對該Binder的引用,使得Client可以通過Binder名字獲得Server中Binder實體的引用
      • Server和Client:服務端與客戶端,在Binder驅動和Service Manager提供的基礎設施上,進行Client-Server之間的通信
  • 4.工作原理
    • 服務器端:在服務端創建好了一個Binder對象後,內部就會開啓一個線程用於接收Binder驅動發送的消息,收到消息後會執行onTranscat(),並按照參數執行不同的服務端代碼。
    • Binder驅動:在服務端成功Binder對象後,Binder驅動也會創建一個mRemote對象(也是Binder類),客戶端可藉助它調用transcat()即可向服務端發送消息。
    • 客戶端:客戶端要想訪問Binder的遠程服務,就必須獲取遠程服務的Binder對象在Binder驅動層對應的mRemote引用。當獲取到mRemote對象的引用後,就可以調用相應Binder對象的暴露給客戶端的方法。

IPC方式

  • 跨進程通信,兩個進程之間進行數據交換的過程
  • 應用場景:
    • 某些模塊因特殊原因要運行在單獨線程中
    • 爲加大一個應用可使用的內存,需要用過多進程來獲取多份內存空間
  • 1.使用Bundle
    • 支持在Activity、Service和Receiver之間通過Intent.putExtra()傳遞Bundle數據。
  • 2.文件共享
    • 無併發訪問情形,交換簡單的數據實時性不高的場景
  • 3.AIDL
    • 如果在一個進程中要調用另一個進程中對象的方法,可使用AIDL生成可序列化的參數,AIDL會生成一個服務端對象的代理類,通過它客戶端實現間接調用服務端對象的方法。
    • AIDL的本質是系統提供了一套可快速實現Binder的工具
  • 4.Messager
    • 輕量級的IPC方案,通過它可在不同進程中傳遞Message對象
  • 5.ContentProvider
    • 是Android提供的專門用來進行不同應用間數據共享的方式
    • 除了onCreat()運行在UI線程中,其他的query()、update()、insert()、delete()和getType()都運行在Binder線程池中。
  • 6.Socket
    • 不僅可以跨進程,還可以跨設備通信
    • 流套接字
      • 基於TCP協議,採用流的方式提供可靠的字節流服務。
    • 數據報套接字
      • 基於UDP協議,採用數據報文提供數據打包發送的服務。
      • 不能在主線程中訪問網絡

參考

《Android開發藝術與探索》
關於Android多進程
要點提煉|開發藝術之IPC

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