一、引言
我相信一定有人想通過Intent傳送自定義類型的數據,但是苦於無法找到putExtra(String name,Object value)這個方法,最后都會妥協,采用字典或者全局變量來
解決,但是你一定也看到了以下這個方法pubExtra(String name,Parcelable value),我相信那些懶惰的人們,可能會一概而過。卻不曾想你錯失了良機。下面我們將會
全面的介紹如何使用Parcelable(這個是接口,並不是一個類)
二、正文
首先我們看下需要實現這個方法的哪些部分:

其中只有writeToParcel方法是重點,因為這個方法就是將我們這個類的數據寫入到Parcel中以便傳遞。但是這里告訴你一個悲劇的事情,那就是Parcel只有
writeXXXX(XXXX value),readXXXX() 方法,其中XXXX表示的是數據類型。這里要重點注意的是writeXXXX是沒有name參數的,這就以為着你無法區分同一種類型數據
具體是什么。但是Parcel提供一個方法 setDataPosition(int pos) 方法。等同於可以切換當前添加數據的索引,就好比我們用了Parelable數組一樣的效果,填充好
了一個Parelable的數據之后使用setDataPosition切換到下一索引繼續填充數據。
下面是一個示例:

在這里我們這個類只有一個mData變量,並且在方法writeToParcel中將這個變量寫到了Parcel中,但是到這里並沒有結束。你可以簡單的想想,這里我們僅僅將數據存到了Parcel中,
但是怎么恢復數據呢?因為最后Intent是通過Parcel類進行實際的數據傳送,等傳送到目的之后,當然還需要恢復,所以我們還要實現一個接收Parcel類的構造方法:

到這里我們僅僅是入門了,如果你是有心人可以將鼠標點到這個類的名稱部分會看到以下的提示:

顯然我們並沒有好好的完成這個功能,我們還缺少一個CREATOR字段,當然要求創建這個字段並不是毫無意義的,而且對這個字段也
有要求,必須是Parcelable.Creator<T>類型,其中的T就是我們需要從Parcel轉換到的目的類型。
既然我們知道還缺少東西,下面我們就補全:

這里需要講述的是 writeToParcel 和 createFromParcel 這兩個方法,在實際傳遞過程中,當我們把這個自定義類型作為Intent的參數進行傳
遞時writeToParcel會被調用,意思就是告訴你可以將你的數據封裝了,然后到了目的之后再通過調用createFromParcel將封裝的數據再恢復回去。
這樣就可以將數據的轉換全部封裝到數據類中,而無需以后在使用的過程中去轉換。
