Bundle 是用来传递数据的,其以key-value保存数据,可以传递boolean,byte,int,long,float,double,string等基本类型或他们对应的数组,也可以是对象或对象数组,但必须实现Seriallzable或Parcelable接口。
传递基本类型:putXxx()和getXxx()方法,用于基本的读写操作。
写操作:
MainFragment fragment = new MainFragment();
Bundle args = new Bundle();
args.putString("DEMO_PRESET", demoPreset.name());
fragment.setArguments(args);
return fragment;
对应的读取数据:用getXxx()方法,例如String xx=bundle.getString(key),
传递Parcelable接口其典型实现为
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();
}
}
1.describeContents方法。内容接口描述,默认返回0就可以;
2.writeToParcel 方法。该方法将类的数据写入外部提供的Parcel中.即打包需要传递的数据到Parcel容器保存,以便从parcel容器获取数据,该方法声明如下:
writeToParcel(Parcel out, int flags) 具体参数含义见doc文档https://developer.android.com/reference/android/os/Parcelable
3.静态的Parcelable.Creator接口,本接口有两个方法:
createFromParcel(Parcelin) 从Parcel容器中读取传递数据值,封装成Parcelable对象返回逻辑层。
newArray(int size) 创建一个长度为size的数组,仅一句话(return new myParcelable[size])即可。方法是供外部类反序列化本类数组使用。
传递Serializable类型的对象
// MyObjects instance
MyObjects mObjects = new MyObjects("name", "age", "Address array here");
// Passing MyObjects instance via intent
Intent mIntent = new Intent(FromActivity.this, ToActivity.class);
mIntent.putExtra("UniqueKey", mObjects);
startActivity(mIntent);
// Getting MyObjects instance
Intent mIntent = getIntent();
MyObjects workorder = (MyObjects)
mIntent.getSerializableExtra("UniqueKey");
为什么Android提供了2个用于序列化对象的接口?
Parcelable
比Serializable
接口快Parcelable
与Serializable
接口相比,接口需要更多时间来实现Serializable
界面更容易实现Serializable
接口会创建大量临时对象,并导致相当多的垃圾回收Parcelable
数组可以通过Android中的Intent传递