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;
}