IPC機制學習
文章目錄
1)IPC基礎及概念
2)Binder機制
3)IPC方式
IPC基礎及概念
- 1.多進程模式
- 進程與線程
- 進程,一般指一個執行單元,在PC和移動設備上指一個程序或應用
- 線程,CPU調度的最小單元
- 一個進程可包含多個線程,即一個應用程序上可以同時執行多個任務
- 開啓多進程的方式
- 在AndroidMnifest中給四大組件指定屬性
android:process
- 進程名的命名規則:
- 以":"開頭的進程,屬於當前應用的私有進程
- 完整命名,屬於全局進程
- 在AndroidMnifest中給四大組件指定屬性
- 查看進程信息的方法
- 通過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.安全性高
- a.傳輸效率高、可操作性強。傳輸效率主要影響因素是內存拷貝的次數,拷貝次數越少,傳輸速率越高
- 3.角色
- Server,Client,ServiceManager和Binder驅動
- ServiceManager:服務的管理者,將Binder名字轉換爲Client中對該Binder的引用,使得Client可以通過Binder名字獲得Server中Binder實體的引用
- Server和Client:服務端與客戶端,在Binder驅動和Service Manager提供的基礎設施上,進行Client-Server之間的通信
- Server,Client,ServiceManager和Binder驅動
- 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