Activity间数据传递之Parcelable

Activity间常用的传值方式一般有两种:

1.创建Intent意图对象中,通过intent的一系列putExtra方法,将一些基本数据类型或者对应的类型数组数据添加到意图中;

2.创建Bundle对象,将基本数据类型或者对应的数组类型存放到Bundle对象中,在传入intent意图中;

而上述两种方式不支持直接携带非基本数据类型的数据,如果需要携带其他对象,则需要通过实现Parcelable接口,intent跟bundle都提供了携带Parcelable对象的方法;且Parcelable不仅支持程序内组件间的数据传输,还支持程序间的数据传输。

Parcelable需要实现writeToParcel、describeContents函数以及静态的CREATOR变量,实际上就是将自己来定义打包和解包的工作,而序列化的这些操作完全由底层实现。

public class ParcelableMap implements Parcelable {

private String name = "zhangsan";

private int age = 0;

public ParcelableMap(){

}

protected ParcelableMap(Parcel in) {

}

public static final Creator CREATOR=new Creator() {

@Override

public ParcelableMap createFromParcel(Parcel in) {

ParcelableMap map =new ParcelableMap();

map.setName(in.readString());

map.setAge(in.readInt());

return map;

}

@Override

public ParcelableMap[] newArray(int size) {

return new ParcelableMap[size];

}

};

@Override

public int describeContents() {

return 0; //默认返回0即可

}

@Override

public void writeToParcel(Parcel dest,intflags) {

dest.writeString(name);

dest.writeInt(age);

}

public String getName() {

return name;

}

public void setRid(String name) {

this.name = name;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

}

上面的ParcelableMap类在Activity间的数据传输:

ParcelableMap parcelableMap =new ParcelableMap();

parcelableMap.setName("Lazy");

parcelableMap.setAge(26);

Intent intent = new Intent(this, ImagePlayActivity.class);

intent.putExtra("user",parcelableMap);

this.startActivity(intent);

注:如果没有在writeToParcel函数以及静态的CREATOR变量中的createFromParcel函数做打包跟解包处理的话,传递的对象中的数据可能会不一致。

使用Parcelable的好处:Parcelable的性能比Serializable好,在内存开销方面较小,所以在内存间数据传输时推荐使用Parcelable,如activity间传输数据,而Serializable可将数据持久化方便保存,所以在需要保存或网络传输数据时选择Serializable,因为android不同版本Parcelable可能不同,所以不推荐使用Parcelable进行数据持久化

你可能感兴趣的:(Activity间数据传递之Parcelable)