android#使用Intent傳遞對象

來源:互聯網
上載者:User

標籤:

參考自《第一行代碼》——郭霖

Intent的用法相信你已經比較熟悉了,我們可以藉助它來啟動活動、發送廣播、啟動服務等。在進行上述操作的時候,我們還可以在Intent中添加一些附加資料,以達到傳值的效果,比如在FirstActivity中添加如下代碼:

Intent intent = new Intent(FirstActivity.this, SecondActivity.class);intent.putExtra("string_data", "hello");intent.putExtra("int_data", 100);startActivity(intent);

這裡調用了Intent的putExtra()方法來添加要傳遞的資料,之後在SecondActivity中就可以得到這些值了,代碼如下所示:

getIntent().getStringExtra("string_data");getIntent().getIntExtra("int_data", 0);

但是不知道你有沒有發現,putExtra()方法中所支援的資料類型是有限的,雖然常用的一些資料類型它都會支援,但是當你想去傳遞一些自訂對象的時候就會發現無從下手。不用擔心,下面我們就學習一下使用Intent來傳遞對象的技巧。

 

一、Serializable方式

使用Intent來傳遞對象通常有兩種實現方式,Serializable和Parcelable,本小節中我們先來學習一下第一種的實現方式。
Serializable是序列化的意思,表示將一個對象轉換成可儲存或可傳輸的狀態。序列化後的對象可以在網路上進行傳輸,也可以儲存到本地。至於序列化的方法也很簡單,只需要讓一個類去實現Serializable這個介面就可以了。
比如說有一個Person類,其中包含了name和age這兩個欄位,想要將它序列化就可以這樣寫:

public class Person implements Serializable {    private String name;    private int age;    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public int getAge() {        return age;    }    public void setAge(int age) {        this.age = age;    }}

其中get、set方法都是用於賦值和讀取欄位資料的,最重要的部分是在第一行。這裡讓Person類去實現了Serializable介面,這樣所有的Person對象就都是可序列化的了。
接下來在FirstActivity中的寫法非常簡單:

Person person = new Person();person.setName("Tom");person.setAge(20);Intent intent = new Intent(FirstActivity.this, SecondActivity.class);intent.putExtra("person_data", person);startActivity(intent);

可以看到,這裡我們建立了一個Person的執行個體,然後就直接將它傳入到putExtra()方法中了。由於Person類實現了Serializable介面,所以才可以這樣寫。
接下來在SecondActivity中擷取這個對象也很簡單,寫法如下:

Person person = (Person) getIntent().getSerializableExtra("person_data");

這裡調用了getSerializableExtra()方法來擷取通過參數傳遞過來的序列化對象,接著再將它向下轉型成Person對象,這樣我們就成功實現了使用Intent來傳遞對象的功能了。

 

二、Parcelable方式

除了Serializable之外,使用Parcelable也可以實現相同的效果,不過不同於將對象進行序列化,Parcelable方式的實現原理是將一個完整的對象進行分解,而分解後的每一部分都是Intent所支援的資料類型,這樣也就實現傳遞對象的功能了。
下面我們來看一下Parcelable的實現方式,修改Person中的代碼,如下所示:

public class Person implements Parcelable {    private String name;    private int age;    @Override    public int describeContents() {        return 0;    }    @Override    public void writeToParcel(Parcel dest, int flags) {        dest.writeString(name); // 寫出name        dest.writeInt(age); // 寫出age    }    public static final Parcelable.Creator<Person> CREATOR = new Parcelable.Creator<Person>() {        @Override        public Person createFromParcel(Parcel source) {            Person person = new Person();            person.name = source.readString(); // 讀取name            person.age = source.readInt(); // 讀取age            return person;        }        @Override        public Person[] newArray(int size) {            return new Person[size];        }    };}

Parcelable的實現方式要稍微複雜一些。可以看到,首先我們讓Person類去實現了Parcelable介面,這樣就必須重寫describeContents()和writeToParcel()這兩個方法。其中describeContents()方法直接返回0就可以了,而writeToParcel()方法中我們需要調用Parcel的writeXxx()方法將Person類中的欄位一一寫出。注意字串型資料就調用writeString()方法,整型資料就調用writeInt()方法,以此類推。
除此之外,我們還必須在Person類中提供一個名為CREATOR的常量,這裡建立了Parcelable.Creator介面的一個實現,並將泛型指定為Person。接著需要重寫createFromParcel()和newArray()這兩個方法,在createFromParcel()方法中我們要去讀取剛才寫出的name和age欄位,並建立一個Person對象進行返回,其中name和age都是調用Parcel的readXxx()方法讀取到的,注意這裡讀取的順序一定要和剛才寫出的順序完全相同。而newArray()方法中的實現就簡單多了,只需要new出一個Person數組,並使用方法中傳入的size作為數組大小就可以了。
接下來在FirstActivity中我們仍然可以使用相同的代碼來傳遞Person對象,只不過在SecondActivity中擷取對象的時候需要稍加改動,如下所示:

Person person = (Person) getIntent().getParcelableExtra("person_data");

注意這裡不再是調用getSerializableExtra()方法,而是調用getParcelableExtra()方法來擷取傳遞過來的對象了,其他的地方都完全相同。
這樣我們就把使用Intent來傳遞對象的兩種實現方式都學習完了,對比一下,Serializable的方式較為簡單,但由於會把整個對象進行序列化,因此效率方面會比Parcelable方式低一些,所以在通常情況下還是更加推薦使用Parcelable的方式來實現Intent傳遞對象的功能。

android#使用Intent傳遞對象

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.