讀書筆記:Android中的程序間通訊(二)
閱讀的書籍:《Android開發藝術探索》
關鍵詞:Serializable,Parcelable,Serializable和Parcelable的區別,Binder
Serializable介面:java提供的一個序列化介面,為物件提供標準的序列化和反序列化操作
想讓一個物件實現序列化,只需要這個類實現Serializable介面並宣告一個serialVersionUID(非必需)即可
如何進行物件的序列化和反序列化:
採用ObjectOutputStream和ObjectInputStream的writeObject方法和readObject方法
關於serialVersionUID
原則上序列化後的資料中的serialVersionUID只有和當前類的serialVersionUID相同才能夠正常地被反序列化
serialVersionUID的工作機制:
- 序列化的時候系統會把當前類的serialVersionUID寫入序列化的檔案中,當反序列化的時候系統會去檢測檔案中的serialVersionUID是否和當前類的serialVersionUID一致
- 如果一致就說明序列化的類的版本和當前類的版本是相同的,即可成功反序列化,否則就說明發生了變化
當我們手動指定了serialVersionUID的值以後,就可以很大程度上避免反序列化過程的失敗
特殊情況
如果類結構發生了毀滅性改變, 比如修改了類名或者成員變數的型別,這時儘管serialVersionUID驗證通過了,反序列化過程也依然會失敗
Parcelable介面:Android特有的,只要實現這個介面,一個類的物件就可以實現序列化並可以通過Intent和Binder傳遞
例子:
方法說明:
createFromParcel:從序列化後的物件中建立原始物件
newArray:建立指定長度的原始物件陣列
User(Parcel parcel):從序列化後的物件中建立原始物件
writeToParcel(Parcel dest, int flags):將當前物件寫入序列化結構中。flags為1時標識當前物件需要作為返回值返回
describeContents:返回當前物件的內容描述。如果含有檔案描述符,返回1,否則返回0
Serializable和Parcelable的區別:
- Serializable使用簡單但是開銷大,序列化和反序列化過程都需要大量I/O操作
- Parcelable使用稍微麻煩,但效率很高
使用場景
- Parcelable:記憶體序列化
- Serializable:將物件序列化到儲存裝置中或者將物件序列化後通過網路傳輸
Binder:Binder是Android中的一個類,它實現了IBinder介面
從Android應用層來說
Binder是客戶端和服務端進行通訊的媒介,當bindService的時候,服務端會返回一個包含了服務端業務呼叫的Binder物件,然後客戶端通過這個Binder物件就額可以獲取服務端提供的服務或資料
從Android FrameWork角度來說
Binder是ServiceManager連線各種Manager和對應ManagerService的橋樑
Binder的工作機制圖
- 當客戶端發起遠端請求時,當前執行緒會被掛起直到服務端程序返回資料
- 如果一個遠端方法時很耗時的,那麼不能在UI執行緒中發起此遠端請求
- 服務端的Binder方法是執行在Binder的執行緒池中的,所以Binder方法要採用同步
- 通過linkToDeath方法(對應unlinkToDeath)可以給Binder設定一個死亡代理,當Binder死亡時,能夠收到通知進而重新發起連線請請求,恢復連線