? 前言:Activity就是Android世界的controller褪子,它們構(gòu)成了Android App里面的每一個頁面,當然我們還會使用Fragment來將頁面進一步劃分轻抱,通過Fragment可以對特定業(yè)務(wù)模塊的View+邏輯封裝飞涂,讓其與Activity解耦,同時還可以有自己的生命周期祈搜,讓我們控制布局繪制和進行資源回收较店,這些都是Fragment的好處,以后有機會再談容燕,今天梁呈,我們想討論的是Activity頁面之間跳轉(zhuǎn)時,互相傳值的方法選擇蘸秘。
? 我們知道官卡,像int,long秘血,double等基本類型和String都可以直接使用Intent類提供的putExtra方法直接打包傳遞味抖,但很多時候,我們要傳遞的可能是一個實體類的對象灰粮,要傳遞一個實體類對象仔涩,有二種辦法,標記類實現(xiàn)Serializable接口 或者 添加代碼實現(xiàn)Parcelable接口粘舟,注意的是Serializable接口沒有任何實際方法需要實現(xiàn)熔脂,它只是一個標記,標記可以進行序列化柑肴。Serialiable是Java提供的序列化接口霞揉,它將對象按規(guī)則轉(zhuǎn)化為字節(jié)隊列,字節(jié)隊列可以進行網(wǎng)絡(luò)傳輸晰骑,這樣可以讓java的對象跨環(huán)境的進行傳輸适秩,序列化只能序列化成員變量,而靜態(tài)變量和方法不會被序列化,transient關(guān)鍵字修飾的變量也不會被序列化秽荞。Java中反序列化時通過SerialVersionUID來判斷是否能夠反序列化骤公,所以需要序列化的類最好都能給出一個固定的SerialVersionUID值,如下
而Parcelable是Android提供的接口扬跋,它主要是通過writeToParcel()阶捆,將需要持久化的字段保存到一個Parcel對象里面,然后通過CREATOR
從Parcel對象中钦听,取出相應(yīng)的字段洒试,完成對象的恢復(fù),很明顯這里Parcelable有它的優(yōu)勢朴上,需要保存哪些字段我們可以自由控制垒棋,因為寫接口暴露給我們了,需要恢復(fù)哪些字段余指,我們同樣可以控制捕犬,所以相對于Serializable跷坝,存儲的代價小很多酵镜,因為Serializable需要保存很多額外的字段來保證反序列化能夠成功。
? ? 現(xiàn)在我們還是通過一個具體的實例來介紹這二種Activity傳值的基本使用方法柴钻。假設(shè)淮韭,我們現(xiàn)在有一個商品Good的列表,Good類是這樣的
第一個需求是點擊列表的一個cell贴届,跳轉(zhuǎn)到Good的詳情頁靠粪,即我們需要將點擊對應(yīng)的Good對象傳遞到詳情Activity。第二個需求是點擊任何一個cell毫蚓,將全部的Good信息傳遞到詳情Activity占键,即傳遞一個Good數(shù)組。
我們先來看第一個需求元潘,先用Serializable的方法畔乙,發(fā)送很簡單
接收對象也很簡單
我們再來使用Parcelable接口來傳遞,先定義一個類ParcelableGood
發(fā)送數(shù)據(jù)也很簡單
接收也同樣類似
第一個需求很簡單就搞定了翩概,我們再來搞定第二個需求牲距,傳Good的數(shù)組給詳情Activity,如果使用Serializable的話钥庇,Intent沒有提供putExtra直接傳遞Good數(shù)組的重載方法牍鞠,所以我們需要做一個包裝類,我新建一個WrapGood類如圖
這樣就可以直接傳遞一個WrapGood评姨,間接達到傳遞Good數(shù)組的目的难述,
接收數(shù)據(jù)
因為Intent提供了putExtra方法直接傳遞Parcelable數(shù)組的重載,所以可以直接使用,
從Intent中取出Parcelable數(shù)組更簡單
? 現(xiàn)在為止Good里面的屬性都是基本類型或者String胁后,當然它的屬性也可以是另外一個實體類硫眯,假設(shè)是GoodExtra類,這個時候如果要用Serializable序列化择同,GoodExtra也必須要標記Serializable接口两入。如果要使用Parcelable,GoodExtra同樣要實現(xiàn)我們上面介紹的writeToParcel 和 CREATOR敲才。
? 最后我們來做一個總結(jié)裹纳,上面已經(jīng)介紹了在Android開發(fā)中Serializable和Parcelable的用法,我們推薦使用Parcelable紧武,理由大致有3個:1.Parcelable是Android 框架提供給我使用的剃氧,Google提供了比較好的接口和文檔支持,例如上面的putExtra阻星,就有對Parcelable數(shù)組的重載方法朋鞍。2. Parcelable效率更高,Parcelable底層實現(xiàn)是內(nèi)存的copy妥箕,速度很快滥酥,Serializable是IO操作,而且會用到反射畦幢,相對比較慢坎吻,國外有人測試過,Parcelable比Serializable從序列化到傳輸?shù)椒葱蛄谢畲校骄?0倍左右瘦真。3.最后一個原因也是最重要的原因,Parcelable要序列化哪些字段黍瞧,我們完全可以控制诸尽,而且還可以在其中加入各種轉(zhuǎn)換,修飾印颤,因為寫接口暴露給我們了您机,我們可以自由定制,而Serializable就顯的比較笨拙膀哲,而且需要一些額外的字節(jié)來存儲類的信息往产,當然Serializable使用起來要更簡單。這些都是它們在理論上的比較某宪,項目中絕大多數(shù)場景仿村,二者都可以完全勝任,具體用哪個兴喂,見仁見智吧~~