Parcelable & Intent extra

Android 如果想將自己寫的 data type 的 object 傳到其他 ActivityFragment 之類的地方的話,就要用 Parcelable 來做 serialization/deserialization。Parcelable 有點像 Java 本身的 Serializable,不過 Parcelable 是 Android SDK 內專為 Android 而特設的,所以會快過 Serializable

最近寫 Android app 時無意中發現 IntentgetParcelableExtra return 出來的 object 是會重用的。如果我有個 object 用 Parcelable intent extra 在 Activity A 傳去 Activity B,而在 Activity B 用 getParcelableExtra 取回這個 object 然後再改一下 object 的 field,之後返回 Activity A 再傳相同的 object 去 Activity B,用 getParcelableExtra 取回這個 object 是會取得先前在 Activity B 改動過的 object,而不是 Activity A 那個原本的 object。

所以如果打算會改動 getParcelableExtra 傳回的 object 的話,最好都是複製一個來改,不要直接改傳回的 object。如果是 Kotlin data object 的話,可以用 copy 這個 method。

另外,Kotlin 1.1.4 的 Android Extensions plugin 新增了 @Parcelize annotation 來自動生成 Parcelable 相關的 code。但它是實驗功能,還未有正式說明文檔。如果不想用實驗功能的話,可以用 PaperParcel 之類的 library。