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 方法省略。

 

 

 

 

 


 

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐