? 前言:Activity就是Android世界的controller,它們構成了Android App里面的每一個頁面,當然我們還會使用Fragment來將頁面進一步劃分,通過Fragment可以對特定業務模塊的View+邏輯封裝,讓其與Activity解耦,同時還可以有自己的生命周期,讓我們控制布局繪制和進行資源回收,這些都是Fragment的好處,以后有機會再談,今天,我們想討論的是Activity頁面之間跳轉時,互相傳值的方法選擇。
? 我們知道,像int,long,double等基本類型和String都可以直接使用Intent類提供的putExtra方法直接打包傳遞,但很多時候,我們要傳遞的可能是一個實體類的對象,要傳遞一個實體類對象,有二種辦法,標記類實現Serializable接口 或者 添加代碼實現Parcelable接口,注意的是Serializable接口沒有任何實際方法需要實現,它只是一個標記,標記可以進行序列化。Serialiable是Java提供的序列化接口,它將對象按規則轉化為字節隊列,字節隊列可以進行網絡傳輸,這樣可以讓java的對象跨環境的進行傳輸,序列化只能序列化成員變量,而靜態變量和方法不會被序列化,transient關鍵字修飾的變量也不會被序列化。Java中反序列化時通過SerialVersionUID來判斷是否能夠反序列化,所以需要序列化的類最好都能給出一個固定的SerialVersionUID值,如下
而Parcelable是Android提供的接口,它主要是通過writeToParcel(),將需要持久化的字段保存到一個Parcel對象里面,然后通過CREATOR
從Parcel對象中,取出相應的字段,完成對象的恢復,很明顯這里Parcelable有它的優勢,需要保存哪些字段我們可以自由控制,因為寫接口暴露給我們了,需要恢復哪些字段,我們同樣可以控制,所以相對于Serializable,存儲的代價小很多,因為Serializable需要保存很多額外的字段來保證反序列化能夠成功。
? ? 現在我們還是通過一個具體的實例來介紹這二種Activity傳值的基本使用方法。假設,我們現在有一個商品Good的列表,Good類是這樣的
第一個需求是點擊列表的一個cell,跳轉到Good的詳情頁,即我們需要將點擊對應的Good對象傳遞到詳情Activity。第二個需求是點擊任何一個cell,將全部的Good信息傳遞到詳情Activity,即傳遞一個Good數組。
我們先來看第一個需求,先用Serializable的方法,發送很簡單
接收對象也很簡單
我們再來使用Parcelable接口來傳遞,先定義一個類ParcelableGood
發送數據也很簡單
接收也同樣類似
第一個需求很簡單就搞定了,我們再來搞定第二個需求,傳Good的數組給詳情Activity,如果使用Serializable的話,Intent沒有提供putExtra直接傳遞Good數組的重載方法,所以我們需要做一個包裝類,我新建一個WrapGood類如圖
這樣就可以直接傳遞一個WrapGood,間接達到傳遞Good數組的目的,
接收數據
因為Intent提供了putExtra方法直接傳遞Parcelable數組的重載,所以可以直接使用,
從Intent中取出Parcelable數組更簡單
? 現在為止Good里面的屬性都是基本類型或者String,當然它的屬性也可以是另外一個實體類,假設是GoodExtra類,這個時候如果要用Serializable序列化,GoodExtra也必須要標記Serializable接口。如果要使用Parcelable,GoodExtra同樣要實現我們上面介紹的writeToParcel 和 CREATOR。
? 最后我們來做一個總結,上面已經介紹了在Android開發中Serializable和Parcelable的用法,我們推薦使用Parcelable,理由大致有3個:1.Parcelable是Android 框架提供給我使用的,Google提供了比較好的接口和文檔支持,例如上面的putExtra,就有對Parcelable數組的重載方法。2. Parcelable效率更高,Parcelable底層實現是內存的copy,速度很快,Serializable是IO操作,而且會用到反射,相對比較慢,國外有人測試過,Parcelable比Serializable從序列化到傳輸到反序列化,平均要快10倍左右。3.最后一個原因也是最重要的原因,Parcelable要序列化哪些字段,我們完全可以控制,而且還可以在其中加入各種轉換,修飾,因為寫接口暴露給我們了,我們可以自由定制,而Serializable就顯的比較笨拙,而且需要一些額外的字節來存儲類的信息,當然Serializable使用起來要更簡單。這些都是它們在理論上的比較,項目中絕大多數場景,二者都可以完全勝任,具體用哪個,見仁見智吧~~