通過Intent啟動另一個activity
傳遞簡單資料的代碼片段
接收簡單資料的代碼片段
傳遞資料包Bundle的代碼片段
接收資料包Bundle的代碼片段
值對象傳遞時需要對實體類對象進行序列化,可使用java.io中的Serializable;或者使用android.os中的Parcelable,實作自定義序列化
通過JDK自帶的序列化接口Serializable實作的對象類
通過實作Parcelable接口自定義序列化對象類
傳遞值對象的代碼片段
傳遞值對象的時候可以直接使用Intent類中的putExtra()方法
接收值對象的代碼片段
接收值對象時需要區分值對象是通過那種方式實作的序列化接口
通過Serializable接口實作序列化
可以使用Intent類中的getSerializableExtra()方法擷取對象,但需要強轉成對應的實體類對象。
通過Parcelable接口實作序列化
可以使用Intent類中的getParcelableExtra方法擷取對象,不需要強轉擷取的對象。
作用
Serializable的作用是為了儲存對象的屬性到本地檔案、資料庫、網絡流、RMI(Remote Method Invocation)以友善資料傳輸,當然這種傳輸可以是程式内的也可以是兩個程式間的。使用了反射技術,并且期間産生臨時對象
Android的Parcelable的設計初衷是因為Serializable效率過慢,為了在程式内不同元件間以及不同Android程式間(AIDL)高效的傳輸資料而設計,這些資料僅在記憶體中存在,Parcelable是通過IBinder通信的消息的載體。
效率及選擇
Parcelable的性能比Serializable好,在記憶體開銷方面較小,是以在記憶體間資料傳輸時推薦使用Parcelable,如activity間傳輸資料,而Serializable可将資料持久化友善儲存,是以在需要儲存或網絡傳輸資料時選擇Serializable,因為android不同版本Parcelable可能不同,是以不推薦使用Parcelable進行資料持久化
進階功能上
Serializable序列化不儲存靜态變量,可以使用transient關鍵字對部分字段不進行序列化,也可以覆寫writeObject、readObject方法以實作序列化過程自定義
如果用transient聲明一個執行個體變量,當對象存儲時,它的值不需要維持。換句話說,用transient關鍵字标記的成員變量不參與序列化過程。
對于Serializable,類隻需要實作Serializable接口,并提供一個序列化版本id(serialVersionUID)即可。
而Parcelable則需要實作writeToParcel、describeContents函數以及靜态的CREATOR變量(AS有相關插件 一鍵生成所需方法),實際上就是将如何打包和解包的工作自己來定義,而序列化的這些操作完全由底層實作。
代碼實作
從上面我們可以看出Parcel的寫入和讀出順序是一緻的。如果元素是list讀出時需要先new一個ArrayList傳入,否則會報空指針異常。如下:
PS: 在自己使用時,read資料時誤将前面int資料當作long讀出,結果後面的順序錯亂,報異常,當類字段較多時務必保持寫入和讀取的類型及順序一緻。
本人正在學習中