Android學(xué)習(xí)--Bundle(二)Parcelable

參考資料:http://www.reibang.com/p/32a2ec8f35ae
https://www.cnblogs.com/tangZH/p/10998065.html

1.Parcelable的簡(jiǎn)單介紹

介紹Parcelable不得不先提一下Serializable接口,Serializable是Java為我們提供的一個(gè)標(biāo)準(zhǔn)化的序列化接口,那什么是序列化呢? ---- 簡(jiǎn)單來(lái)說(shuō)就是將對(duì)象轉(zhuǎn)換為可以傳輸?shù)亩M(jìn)制流(二進(jìn)制序列)的過(guò)程,這樣我們就可以通過(guò)序列化,轉(zhuǎn)化為可以在網(wǎng)絡(luò)傳輸或者保存到本地的流(序列),從而進(jìn)行傳輸數(shù)據(jù) ,那反序列化就是從二進(jìn)制流(序列)轉(zhuǎn)化為對(duì)象的過(guò)程.

那我們看一下Android源碼中的Parcelable

    /**
     * Interface for classes whose instances can be written to
   * and restored from a {@link Parcel}.  Classes implementing the Parcelable
 * interface must also have a non-null static field called <code>CREATOR</code>
 * of a type that implements the {@link Parcelable.Creator} interface.
 * 
 * <p>A typical implementation of Parcelable is:</p>
 * 
 * <pre>
 * public class MyParcelable implements Parcelable {
 *     private int mData;
 *
 *       public int describeContents() {
 *         return 0;
 *     }
 *
 *     public void writeToParcel(Parcel out, int flags) {
 *         out.writeInt(mData);
 *     }
 *
 *     public static final Parcelable.Creator<MyParcelable> CREATOR
 *             = new Parcelable.Creator<MyParcelable>() {
 *         public MyParcelable createFromParcel(Parcel in) {
 *             return new MyParcelable(in);
 *         }
 *
 *         public MyParcelable[] newArray(int size) {
 *             return new MyParcelable[size];
 *         }
 *     };
 *     
 *     private MyParcelable(Parcel in) {
 *         mData = in.readInt();
 *     }
 * }</pre>
 */

通過(guò)源碼中的介紹 可以知道,Parcelable接口的實(shí)現(xiàn)類是可以通過(guò)Parcel寫入和恢復(fù)數(shù)據(jù)的,并且必須要有一個(gè)非空的靜態(tài)變量 CREATOR, 而且還給了一個(gè)例子,這樣我們寫起來(lái)就比較簡(jiǎn)單了,但是簡(jiǎn)單的使用并不是我們的最終目的

通過(guò)查看Android源碼中Parcelable可以看出,Parcelable實(shí)現(xiàn)過(guò)程主要分為序列化,反序列化,描述三個(gè)過(guò)程,下面分別介紹下這三個(gè)過(guò)程

2 Parcel的簡(jiǎn)介

在介紹之前我們需要先了解Parcel是什么?Parcel翻譯過(guò)來(lái)是打包的意思,其實(shí)就是包裝了我們需要傳輸?shù)臄?shù)據(jù),然后在Binder中傳輸,也就是用于跨進(jìn)程傳輸數(shù)據(jù)

簡(jiǎn)單來(lái)說(shuō)器一,Parcel提供了一套機(jī)制很泊,可以將序列化之后的數(shù)據(jù)寫入到一個(gè)共享內(nèi)存中,其他進(jìn)程通過(guò)Parcel可以從這塊共享內(nèi)存中讀出字節(jié)流鹃愤,并反序列化成對(duì)象,下圖是這個(gè)過(guò)程的模型映挂。

image

Parcel可以包含原始數(shù)據(jù)類型(用各種對(duì)應(yīng)的方法寫入浮驳,比如writeInt(),writeFloat()等)物延,可以包含Parcelable對(duì)象,它還包含了一個(gè)活動(dòng)的IBinder對(duì)象的引用费尽,這個(gè)引用導(dǎo)致另一端接收到一個(gè)指向這個(gè)IBinder的代理IBinder赠群。

<meta charset="utf-8">

3 Parcelable中的三大過(guò)程介紹(序列化,反序列化,描述)

到這里,基本上關(guān)系都理清了,也明白簡(jiǎn)單的介紹和原理了,接下來(lái)在實(shí)現(xiàn)Parcelable之前,介紹下實(shí)現(xiàn)Parcelable的三大流程
首先寫一個(gè)類實(shí)現(xiàn)Parcelable接口,會(huì)讓我們實(shí)現(xiàn)兩個(gè)方法

image

1.3.1 描述

其中describeContents就是負(fù)責(zé)文件描述,首先看一下源碼的解讀

image

通過(guò)上面的描述可以看出,只針對(duì)一些特殊的需要描述信息的對(duì)象,需要返回1,其他情況返回0就可以

1.3.2 序列化

我們通過(guò)writeToParcel方法實(shí)現(xiàn)序列化,writeToParcel返回了Parcel,所以我們可以直接調(diào)用Parcel中的write方法,基本的write方法都有,對(duì)象和集合比較特殊下面單獨(dú)講,基本的數(shù)據(jù)類型除了boolean其他都有,Boolean可以使用int或byte存儲(chǔ)

舉個(gè)例子:我們將上面的User對(duì)象實(shí)現(xiàn)序列化,User對(duì)象包含三個(gè)字段 age,name,isMale

 /**
 * 該方法負(fù)責(zé)序列化
 * @param dest
 * @param flags
 */
@Override
public void writeToParcel(Parcel dest, int flags) {
    dest.writeInt(age);
    dest.writeString(name);
    // boolean 可以使用int或byte方式進(jìn)行存儲(chǔ),怎么存就怎么取
    dest.writeInt(isMale ? 1 : 0);
}

1.3.3 反序列化

反序列化需要定義一個(gè)CREATOR的變量,上面也說(shuō)了具體的做法,這里可以直接復(fù)制Android給的例子中的,也可以自己定義一個(gè)(名字千萬(wàn)不能改),通過(guò)匿名內(nèi)部類實(shí)現(xiàn)Parcelable中的Creator的接口

/**
 * 負(fù)責(zé)反序列化
 */
public static final Creator<User> CREATOR = new Creator<User>() {
    /**
     * 從序列化后的對(duì)象中創(chuàng)建原始對(duì)象
     */
    @Override
    public User createFromParcel(Parcel source) {
        return new User(source);
    }

    /**
     * 創(chuàng)建指定長(zhǎng)度的原始對(duì)象數(shù)組
     */
    @Override
    public User[] newArray(int size) {
        return new User[size];
    }
};

public User(Parcel parcel) {
    age = parcel.readInt();
    name = parcel.readString();
    isMale = parcel.readInt() == 1;
}

作者:MrQ_Android
鏈接:http://www.reibang.com/p/32a2ec8f35ae
來(lái)源:簡(jiǎn)書
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán)旱幼,非商業(yè)轉(zhuǎn)載請(qǐng)注明出處查描。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市速警,隨后出現(xiàn)的幾起案子叹誉,更是在濱河造成了極大的恐慌,老刑警劉巖闷旧,帶你破解...
    沈念sama閱讀 218,122評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件长豁,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡忙灼,警方通過(guò)查閱死者的電腦和手機(jī)匠襟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)该园,“玉大人酸舍,你說(shuō)我怎么就攤上這事±锍酰” “怎么了啃勉?”我有些...
    開(kāi)封第一講書人閱讀 164,491評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)双妨。 經(jīng)常有香客問(wèn)我淮阐,道長(zhǎng)叮阅,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 58,636評(píng)論 1 293
  • 正文 為了忘掉前任泣特,我火速辦了婚禮浩姥,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘状您。我一直安慰自己勒叠,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布膏孟。 她就那樣靜靜地躺著眯分,像睡著了一般。 火紅的嫁衣襯著肌膚如雪骆莹。 梳的紋絲不亂的頭發(fā)上颗搂,一...
    開(kāi)封第一講書人閱讀 51,541評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音幕垦,去河邊找鬼。 笑死傅联,一個(gè)胖子當(dāng)著我的面吹牛先改,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蒸走,決...
    沈念sama閱讀 40,292評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼仇奶,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了比驻?” 一聲冷哼從身側(cè)響起该溯,我...
    開(kāi)封第一講書人閱讀 39,211評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎别惦,沒(méi)想到半個(gè)月后狈茉,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,655評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡掸掸,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評(píng)論 3 336
  • 正文 我和宋清朗相戀三年氯庆,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片扰付。...
    茶點(diǎn)故事閱讀 39,965評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡堤撵,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出羽莺,到底是詐尸還是另有隱情实昨,我是刑警寧澤,帶...
    沈念sama閱讀 35,684評(píng)論 5 347
  • 正文 年R本政府宣布盐固,位于F島的核電站荒给,受9級(jí)特大地震影響丈挟,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜锐墙,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評(píng)論 3 329
  • 文/蒙蒙 一礁哄、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧溪北,春花似錦桐绒、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,894評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至蚀乔,卻和暖如春烁竭,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背吉挣。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,012評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工派撕, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人睬魂。 一個(gè)月前我還...
    沈念sama閱讀 48,126評(píng)論 3 370
  • 正文 我出身青樓终吼,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親氯哮。 傳聞我的和親對(duì)象是個(gè)殘疾皇子际跪,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容