這個文集中文章主要是自己在學習中記錄的重要知識點,方便日后查閱。
IPC簡介
IPC:Inter-Process Communication進程間通信或者跨進程通信
進程:在PC或者移動設備上一個程序或者應用,一個進程可以有多個線程
線程:是CPU調度的最小單元
Android里主線程也叫UI線程,只有在UI線程里才能操作界面元素
Android中多進程模式
Android中使用多進程只有一種方法:給四大組件在AndroidMenifest中指定android:process屬性
多進程模式帶來的問題
Android為每個進程都分配一個獨立的虛擬機,不同的虛擬機在內存的分配上是不同的地址空間。這就導致在不同的虛擬機中訪問同一個對象會產生多個副本,所有運行在不同進程的四大組件,只要他們之間需要通過內存來共享數(shù)據(jù),都會共享失敗。這是多進程帶來的影響。
多進程還會帶下如下問題
- 靜態(tài)成員和單例模式失效
- 線程同步機制完全失效
- SharedPreferences可靠性下降
- Application多次創(chuàng)建
IPC基礎概念
1.Serializable接口
這是Java提供的序列化接口,可以通過ObjectOutputStream和ObjectInputStream進行序列化和反序列化操作
注:通過Serializable進行序列化和反序列化的對象內容是完全一樣的,但兩者并不是同一個對象。
2.Parcelable
只要實現(xiàn)這個接口,一個類的對象就可以實現(xiàn)序列化并可以通過Intent和Binder傳遞。系統(tǒng)中的Intent、Bundle、Bitmap等已經實現(xiàn)了該接口,可以直接序列化。Lsit、Map也可序列化,只要它們中的每個元素都是可以序列化的。
以上兩種接口的異同
Serializable接口是Java中接口,使用簡單開銷大
Parcelable 接口是Android平臺提供,使用略微復雜,效率高,優(yōu)化使用此接口。
但是要是將對象序列化到設備或者用網(wǎng)絡傳輸,過程就會稍顯復雜,建議使用Serializable
3.Binder
Binder是Android實現(xiàn)Ibinder的一個類。
下面從不同角度來介紹Binder的概念:
- IPC角度:是Android種跨進程通信的方式
- 虛擬物理設備:設備驅動是/dev/binder
- Android Framework角度:Binder是ServiceManager連接各種Manager和相應ManagerService的橋梁
- Android應用層:是服務端和客戶端通信的媒介。
Android中的IPC方式
1.使用Bundle
Activity、Service、Receiver都支持在Intent傳遞Bundle數(shù)據(jù),由于Bundle實現(xiàn)了Parcelable接口,可以在不同進程中傳輸數(shù)據(jù)。
2.文件共享
就是第一個進程中將一個對象序列化到sd卡上的文件里,在第二個進程再將sd卡中的對象內容重新反序列化成對象。這兩個對象是一樣的,但本質上還是一個對象。
文件共享方式,適合對數(shù)據(jù)同步要求不高的進程間的通信,并要妥善處理并發(fā)讀/寫的問題。
不建議在進程間通信使用SharedPreferences,因為在高并發(fā)的讀/寫訪問中,很容易會丟失數(shù)據(jù)。
3.使用Messenger
在Messenger中放入要傳遞的數(shù)據(jù),就可以實現(xiàn)數(shù)據(jù)的進程間傳遞了,它的底層實現(xiàn)的是AIDL。
4.AIDL
(看的不是很清楚,待補充)
5.使用ContentProvider
這就是Android中提供的專門用于不同應用間數(shù)據(jù)共享的方式。其底層實現(xiàn)同樣也是Binder。
6.使用Socket
簡單來說就是通過網(wǎng)絡通信,來實現(xiàn)跨進程通信。
Binder連接池
主要作用就是將每個業(yè)務模塊的Binder請求統(tǒng)一轉發(fā)到遠程Service中,避免重復創(chuàng)建Service。