Android之使用 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 传递对象的功能。