参考:http://blog.csdn.net/dairyman000/article/details/7247619
arcel 在英文中有两个意思,其一是名词,为包裹,小包的意思; 其二为动词,意为打包,扎包。邮寄快递中的包裹也用的是这个词。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); }
}
下面定义了一个简单类People, 他需要把自身的数据,打入包中。 同时在消息的接收方需要通过People实现的Parcelable接口,将People重新构造出来。
People.java
public class People implements Parcelable { private String name = null; private int age = 0; private int sex = 0;// 0代表男、1代表女 public People() { super(); } public People(String name, int age, int sex) { super(); this.name = name; this.age = age; this.sex = sex; } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeString(name); dest.writeInt(age); dest.writeInt(sex); } public static final Parcelable.Creator<People> CREATOR = new Creator<People>() { @Override public People[] newArray(int size) { return new People[size]; } @Override public People createFromParcel(Parcel source) { return new People(source.readString(), source.readInt(), source.readInt()); } }; }
传递People
//发送 MainActivity.java
People people = new People(); people.setName("张三"); people.setSex(Integer.parseInt(0)); people.setAge(Integer.parseInt(25)); Intent intent = new Intent(MainActivity.this, ShowActivity.class); Bundle b = new Bundle(); b.putParcelable("people", people); intent.putExtras(b); MainActivity.this.startActivity(intent);
//接受 ShowActivity.java
if(getIntent().getExtras().containsKey("people")){
People people = getIntent().getExtras().getParcelable("people");
}