1. 程式人生 > >讀書筆記:Android中的程序間通訊(二)

讀書筆記:Android中的程序間通訊(二)

閱讀的書籍:《Android開發藝術探索》

關鍵詞:Serializable,Parcelable,Serializable和Parcelable的區別,Binder

Serializable介面:java提供的一個序列化介面,為物件提供標準的序列化和反序列化操作

想讓一個物件實現序列化,只需要這個類實現Serializable介面並宣告一個serialVersionUID(非必需)即可

如何進行物件的序列化和反序列化:

採用ObjectOutputStream和ObjectInputStream的writeObject方法和readObject方法

關於serialVersionUID

原則上序列化後的資料中的serialVersionUID只有和當前類的serialVersionUID相同才能夠正常地被反序列化

serialVersionUID的工作機制:

  1. 序列化的時候系統會把當前類的serialVersionUID寫入序列化的檔案中,當反序列化的時候系統會去檢測檔案中的serialVersionUID是否和當前類的serialVersionUID一致
  2. 如果一致就說明序列化的類的版本和當前類的版本是相同的,即可成功反序列化,否則就說明發生了變化

當我們手動指定了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使用稍微麻煩,但效率很高

使用場景

  1. Parcelable:記憶體序列化
  2. 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死亡時,能夠收到通知進而重新發起連線請請求,恢復連線