package utils;
import android.os.Parcel;
import android.os.Parcelable;
public class PersonParcelable implements Parcelable {
private String name;
private int age;
public PersonParcelable() {
super();
}
@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 Creator<PersonParcelable> CREATOR = new Creator<PersonParcelable>() {
@Override
public PersonParcelable createFromParcel(Parcel source) {
PersonParcelable person = new PersonParcelable();
person.name = source.readString();//读取name
person.age = source.readInt();//读取age
return person;
}
@Override
public PersonParcelable[] newArray(int size) {
return new PersonParcelable[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作为数组大小 就可以了。
接下来在 主Activity 中我们仍然可以使用相同的代码来传递 Person 对象,只不过在 另外一个Activity中获
取对象的时候需要稍加改动,如下所示:
Person person = (Person) getIntent().getParcelableExtra("person_data");
注意这里不再是调用 getSerializableExtra()方法,而是调用 getParcelableExtra()方法来获 取传递过来的对
象了,其他的地方都完全相同。