android提供了一种新的类型:Parcel。本类被用作封装数据的容器,封装后的数据可以通过Intent或IPC传递。
除了基本类型以外,只有实现了Parcelable接口的类才能被放入Parcel中。
Parcelable实现要点:需要实现三个东西
1)writeToParcel 方法。该方法将类的数据写入外部提供的Parcel中.声明如下:
writeToParcel (Parcel dest, int flags) 具体参数含义见文档。
2)describeContents方法。没搞懂有什么用,反正直接返回0也可以
3)静态的Parcelable.Creator接口,本接口有两个方法:
createFromParcel(Parcel in) 实现从in中创建出类的实例的功能
newArray(int size) 创建一个类型为T,长度为size的数组,仅一句话(return new T[size])即可。估计本方法是供外部类反序列化本类数组使用。
如果某个类实现了这个接口,那么它的对象实例可以写入到
Parcel
中,并且能够从中恢复,并且这个类必须要有一个
static
的
field
,并且名称要为
CREATOR
,这个
field
是某个实现了
Parcelable.Creator
接口的类的对象实例。
public interface Parcelable
如果某个类实现了这个接口,那么它的对象实例可以写入到
Parcel
中,并且能够从中恢复,并且这个类必须要有一个
static
的
field
,并且名称要为
CREATOR
,这个
field
是某个实现了
Parcelable.Creator
接口的类的对象实例。
public class MyParcelable implements Parcelable {
private int mData ;
public int describeContents () {
return 0 ;
}
public void writeToParcel ( Parcel out , int flags ) {
out . writeInt ( mData );
}
public static final Parcelable . Creator < MyParcelable > CREATOR
= new Parcelable . Creator < MyParcelable >() {
public MyParcelable createFromParcel ( Parcel in ) {
return new MyParcelable ( in );
}
public MyParcelable [] newArray ( int size ) {
return new MyParcelable [ size ];
}
};
private MyParcelable ( Parcel in ) {
mData = in . readInt ();
}
}
public static interface Parcelable.Creator<T>
Interface that must be implemented and provided as a public CREATOR field that generates instances of your Parcelable class from a Parcel。
其有两个成员函数: createFromParcel 和 newArray 。
createFromParcel 函数创建实现 Parcelable 接口的某个类的一个新的对象实例,并且用从给定的 Parcel 中获取的数据进行实例化, Parcel 中的数据是在之前通过 Parcelable.writeToParcel 方式写入的数据。
newArray 函数创建实现 Parcelable 接口的某个类的一个新的对象数组,数组中的每个项都被初始化为 null 。
下面给出一个具体的实例:
Product 类有三个属性,id ,name, price. 我们如果要是通过Intent或者在IPC之间传递该对象,就要实现Parcelable接口。
pulic class implements Parcelable {
private int id ,
private Sting name;
private float price;
public static final Parcelable. Creator<Product> CREATOR = new Parcelable.Creator<product>()
{
public Product createFromParcel( Parcel in ) {
return new product(in); //CREATOR 接口提供了方法来实例化我们的类对象。 该方法调用类对象的有参构造方法。
}
public Prouct[] newArray(int Size){
return new Product[size];
}
}
public Product(){
}
public Product( parcel in ){
readFromParcel(in); //有参构造方法调用readFromParcel(in); 该方法从给定的Parcel
对象中读取数据对Product进行实例化。
通过wrireToParcel()方法将序列化的值写入parcel对象。
}
@Override
public int describeContents() {
return 0;
}
public void readFromPacel( Parcel in ){
id = in.readInt();
name = in.readString();
price = in.readFloat();
}
@Override
public void wrireToParcel ( Parcel dest, int flags){ 通过wrireToParcel()方法将序列化的值写入parcel对象。
dest.writeInt(id);
dest.writeString(name);
dest.writeFloat(price);
}
getter 和setter 方法省略。