使用Intent傳遞數據對象時通常有兩種實現方式,Serializable和Pacerlable。
Serializable
Serializable是序列化的意思,表示將一個對象轉換成可存儲或可傳輸的狀態。序列化後的對象可以在網絡上進行傳輸,也可以保存在本地。序列化的方式也很簡單,只需要需要序列化的類去實現Serializable接口就行了。
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;
}
}
傳遞的時候只需要調用intent.putExtra(key,value)就可以了,接受同樣,getIntent.getSerializableExtra(key)然後強制轉換成Person類型就可以了。
Pacerlable
不同於Serializable方式將對象進行序列化,Pacerlable方式是將一個完整的對象進行分解,分解後的每一部分都是Intent所支持的數據類型,這樣就實現傳遞對象的功能了,不過實現起來比Serializable稍微複雜一點。
public class Star implements Parcelable{
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;
}
@Override
public String toString() {
return "Star [name=" + name + ", age=" + age + "]";
}
@Override
public int describeContents() {
// TODO Auto-generated method stub
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(name);
dest.writeInt(age);
}
public static final Parcelable.Creator<Star> CREATOR=new Parcelable.Creator<Star>() {
@Override
public Star createFromParcel(Parcel source) {
Star star=new Star();
star.name=source.readString();
star.age=source.readInt();
return star;
}
@Override
public Star[] newArray(int size) {
return new Star[size];
}
};
}
首先實現Pacerlable接口,然後需要重寫兩個方法,describeContents和writeToPacerl兩個方法,其中describeContents方法返回0就可以,而writeToPacerl則需要調用Parcel的writeXXX方法將Star的字段一一寫入。
除此之外還需要定義一個CREATOR常量,這裏創建了Pacerlable.CREATOR接口的一個實現,並將泛型指定爲Star,然後需要重寫兩個方法,createFromPacerl和newArray方法,createFromPacerl需要創建一個對象進行返回,並且讀取剛纔讀進去的字段,注意讀取的順序和寫入的順序一定完全相同。newArray方法則十分簡單,只需要new一個Star數組並使用方法中的size作爲數組大小們進行返回就行。
使用相同的代碼傳遞Pacerlable對象,然後讀寫時使用
getIntent.getPacerlableExtra方法獲取對象。
比較
Pacerlable方法效率很高,推薦使用。