Android -- Intent傳遞對象的三種方法

當我們使用IntentActivity 間傳遞信息時發(fā)現(xiàn)putExtra() 方法并不支持自定義對象的傳輸,下面就來介紹三種解決方式温圆。

Serializable 方式

這是最簡單的一種方法,因為我們要做的就是讓我們自定義的對象實現(xiàn) Serializable 這個空接口香拉。

public class Person implements Serializable{
        private String mName;
        private String mAddress;

        public String getName() {
            return mName;
     }

     public void setName(String name) {
             mName = name;
     }

        public String getAddress() {
             return mAddress;
        }

        public void setAddress(String address) {
             mAddress = address;
        }
}

這個時候进栽,就已經(jīng)可以使用IntentputExtra() 方法傳遞這個自定義對象了,在Activity中這樣使用

            Person person = new Person();
            person.setName("Hwaphon");
            person.setAddress("Anhui");

            Intent intent = new Intent(MainActivity.this,SecondActivity.class);
            intent.putExtra("person",person);
            startActivity(intent);
            finish();

Activity中接收數(shù)據(jù)

Intent intent = getIntent();
Person person = (Person) intent.getSerializableExtra("person");

使用Serializable方法雖然十分簡單不撑,但是效率卻不容樂觀,因為它會把整個對象序列化晤斩,開銷十分大焕檬,為了追求效率,我們不得不使用另一種方法澳泵,也就是Parcelable 方法实愚。

Parcelable 方式

令自定義類實現(xiàn)Parcelable接口,這個時候必須重寫兩個方法

1.describeContents(): 用于描述內容接口兔辅,一般直接 return 0即可

2.writeToParcel() : 用于將想要傳遞的數(shù)據(jù)寫入到Parcel容器中腊敲。

除了這兩個方法以外,我們還需要創(chuàng)建一個 Parcelable.Creator接口的實現(xiàn)幢妄,這個接口中也需要我們實現(xiàn)兩個方法

1.createFromParcel() : 用于將寫入Parcel容器中的數(shù)據(jù)讀出來兔仰,用讀出來的數(shù)據(jù)實例化一個對象茫负,并且返回蕉鸳。

2.newArray() :創(chuàng)建一個長度為 size 的數(shù)組并且返回,一般而言,直接返回return T[size] 即可潮尝。

public class Person implements Parcelable{
        private String mName;
        private String mAddress;

        public String getName() {
            return mName;
     }

        public void setName(String name) {
            mName = name;
     }

        public String getAddress() {
             return mAddress;
        }

        public void setAddress(String address) {
            mAddress = address;
        }

    @Override
    public int describeContents() {
            return 0;
        }

        @Override
    public void writeToParcel(Parcel parcel, int i) {
            parcel.writeString(mName);
            parcel.writeString(mAddress);
        }

    public static final Parcelable.Creator<Person> CREATOR = new Parcelable.Creator<Person>(){
            @Override
             public Person createFromParcel(Parcel parcel) {
                    Person person = new Person();
                    person.mName = parcel.readString();
                    person.mAddess = parcel.readString();
                    return person;
            }

            @Override
            public Person[] newArray(int i) {
                    return new Person[i];
            }
     };
}

這個時候的接收方法與Serializable有點不同榕吼,如下

 Intent intent = getIntent();
 Person person = (Person) intent.getParcelableExtra("person");

writeToParcel()方法中跃惫,我們可以將我們想要的數(shù)據(jù)寫入容器压彭,如果是我們不需要的數(shù)據(jù)悔醋,那么我們可以放棄寫入届榄,這也是Parcelabel 方法比 Serializable方法高效的原因所在曲管。但是获列,這種方法比Serializable 方法多了太多的實現(xiàn)代碼了粱胜,有沒有什么辦法能改變這一現(xiàn)狀呢烛占?可以使用插件一鍵生成這些代碼徒蟆,比如說 Android Parcelable code generator 插件胁出,可以直接在Android Studio Plugins去下載該插件,下載完之后 點擊 Alt+Insert就可以看到Parcelable選項了段审。

JSON 方式

這個時候自定義對象類為

public class Person{
        private String mName;
        private String mAdress;

    public String getName() {
            return mName;
        }

        public void setName(String name) {
            mName = name;
        }

        public String getAdress() {
            return mAdress;
     }

        public void setAdress(String adress) {
            mAdress = adress;
        }
    }

使用方式

 //Send
 Intent intent = new Intent(MainActivity.this,SecondActivity.class);
 
 intent.putExtra("person",new Gson().toJson(person));
    

// Receive
 Intent intent = getIntent();
 String JsonData = intent.getStringExtra("person");
 Person person = new Gson().fromJson(JsonData,Person.class);

在使用時別忘了導入Gson 包全蝶,否則是無法使用的。

附注:

我已將GsonParcelable code generator JAR 包上傳到我的百度云盤寺枉,有需要的可以去下載

Parcelable code generator : http://pan.baidu.com/s/1eRmUgLG

GSON : http://pan.baidu.com/s/1nubQw5b

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末抑淫,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子姥闪,更是在濱河造成了極大的恐慌始苇,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件筐喳,死亡現(xiàn)場離奇詭異埂蕊,居然都是意外死亡,警方通過查閱死者的電腦和手機疏唾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門蓄氧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人槐脏,你說我怎么就攤上這事喉童。” “怎么了顿天?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵堂氯,是天一觀的道長。 經(jīng)常有香客問我牌废,道長咽白,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任鸟缕,我火速辦了婚禮晶框,結果婚禮上排抬,老公的妹妹穿的比我還像新娘。我一直安慰自己授段,他們只是感情好蹲蒲,可當我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著侵贵,像睡著了一般届搁。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上窍育,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天卡睦,我揣著相機與錄音,去河邊找鬼漱抓。 笑死么翰,一個胖子當著我的面吹牛,可吹牛的內容都是我干的辽旋。 我是一名探鬼主播浩嫌,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼补胚!你這毒婦竟也來了码耐?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤溶其,失蹤者是張志新(化名)和其女友劉穎骚腥,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體瓶逃,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡束铭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了厢绝。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片契沫。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖昔汉,靈堂內的尸體忽然破棺而出懈万,到底是詐尸還是另有隱情,我是刑警寧澤靶病,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布会通,位于F島的核電站,受9級特大地震影響娄周,放射性物質發(fā)生泄漏涕侈。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一煤辨、第九天 我趴在偏房一處隱蔽的房頂上張望裳涛。 院中可真熱鬧木张,春花似錦、人聲如沸调违。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽技肩。三九已至,卻和暖如春浮声,著一層夾襖步出監(jiān)牢的瞬間虚婿,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工泳挥, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留然痊,地道東北人。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓屉符,卻偏偏與公主長得像剧浸,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子矗钟,可洞房花燭夜當晚...
    茶點故事閱讀 42,901評論 2 345

推薦閱讀更多精彩內容