使用Intent傳遞一般類型的數據比較簡單,只要通過intent.putExtra(key, value)就可以實現,但是怎麼傳遞自定義類型的數據,就需要使用一些技巧了。
1、Serializable方式
Serializable 是序列化的意思,表示將一個對象轉換成可存儲或可傳輸的狀態。序列化後的對象可以在網絡上進行傳輸,也可以存儲到本地。至於序列化的方法也很簡單,只需要讓一個類去實現Serializable 這個接口就可以了。
下面我們創建Student類,繼承Serializable。
public class Student implements Serializable{
private String name;
private String number;
public void setName(String name) {
this.name = name;
}
public void setNumber(String number) {
this.number = number;
}
public String getName() {
return name;
}
public String getNumber() {
return number;
}
}
然後就可以用Intent.putExtra來插入Student對象了:
mBSecondActivity.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
Student student = new Student();
student.setName("Curry");
student.setNumber("30");
intent.putExtra("student_data", student);
startActivity(intent);
}
});
然後在SecondActivity中獲取這個Student對象:
Student student = (Student) getIntent().getSerializableExtra("student_data");
2、Parcelable方式
和Serializable方式不同在於,Parcelable 方式的實現原理是將一個完整的對象進行分解,而分解後的每一部分都是Intent 所支持的數據類型,這樣也就實現傳遞對象的功能了。但是它的實現過程比較複雜,下面先創建Person類,並繼承Parcelable接口。
public class Person implements Parcelable{
private String name;
private int age;
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public static final Creator<Person> CREATOR = new Creator<Person>() {
@Override
public Person createFromParcel(Parcel in) {
Person person = new Person();
person.setName(in.readString());
person.setAge(in.readInt());
return person;
}
@Override
public Person[] newArray(int size) {
return new Person[size];
}
};
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(name);
dest.writeInt(age);
}
}
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 作爲數組大小就可以了。
在SecondActivity中獲取對象的方式差不多,如下:
Person person = (Person) getIntent().getParcelableExtra("person_data");
總結:雖然序列化的方式比較簡單,但是由於會將整個對象序列化,所以效率方面會比Parcelable方法低一些。所以在通常情況下還是更加推薦使用Parcelable 的方式來實現Intent 傳遞對象的功能。