天天看点

parcel和parcelable

parcel 在英文中有两个意思,其一是名词,为包裹,小包的意思; 其二为动词,意为打包,扎包。邮寄快递中的包裹也用的是这个词。android采用这个词来表示封装消息数据。这个是通过ibinder通信的消息的载体。需要明确的是parcel用来存放数据的是内存(ram),而不是永久性介质(nand等)。

parcelable,定义了将数据写入parcel,和从parcel中读出的接口。一个实体(用类来表示),如果需要封装到消息中去,就必须实现这一接口,实现了这一接口,该实体就成为“可打包的”了。

接口的定义如下:

public interface parcelable {  

    //内容描述接口,基本不用管  

    public int describecontents();  

    //写入接口函数,打包  

    public void writetoparcel(parcel dest, int flags);  

     //读取接口,目的是要从parcel中构造一个实现了parcelable的类的实例处理。因为实现类在这里还是不可知的,所以需要用到模板的方式,继承类名通过模板参数传入。  

    //为了能够实现模板参数的传入,这里定义creator嵌入接口,内含两个接口函数分别返回单个和多个继承类实例。  

    public interface creator<t> {  

           public t createfromparcel(parcel source);  

           public t[] newarray(int size);  

       }  

在实现parcelable的实现中,规定了必须定义一个静态成员, 初始化为嵌入接口的实现类。

public static parcel.creator<drievedclassname>  creator =  

    new parcel.creator<drievedclassname>();   

下面定义了一个简单类mymessage, 他需要把自身的数据mdata,打入包中。 同时在消息的接收方需要通过mymessage实现的parcelable接口,将mymessage重新构造出来。

import android.os.parcel;  

import android.os.parcelable;  

public class mymessage 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<mymessage> creator  

           = new  parcelable.creator<mymessage>(){  

        public mymessage createfromparcel(parcel in) {  

            return new mymessage(in);  

        }  

        public mymessage[] newarray(int size) {  

            return new mymessage[size];  

    };  

    private mymessage(parcel in) {  

        mdata = in.readint();  

    public mymessage(int data) {  

    // todo auto-generated constructor stub  

    mdata = data;  

}  

继续阅读