最近有一個需求是從ActivityA往ActivityB傳遞一些用戶數據,內容較多,使用Parcelable對象實現序列化,基本數據類型中除了boolean之外,其他的幾個用String代表了。重點看一下 boolean,String,Class,List,Enum 類型的傳遞。上代碼。
首先這個是enum類型的類:
public enum MyType implements Parcelable{
Man,Woman,Unknown;
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(ordinal());
}
public static final Creator<MyType> CREATOR = new Creator<MyType>() {
@Override
public MyType createFromParcel(final Parcel source) {
return MyType.values()[source.readInt()];
}
@Override
public MyType[] newArray(final int size) {
return new MyType[size];
}
};
}
要傳遞的就是這個類:
public class AccountInfo implements Parcelable {
private boolean isNewUser;//boolean類型
private String name;//String類型
private UserCardInfo userCard;//對象類型
private List<BankCard> bankInfos;//List類型
private MyType myType;//enum類型
protected AccountInfo(Parcel in) {
isNewUser = in.readByte() != 0;
name = in.readString();
userCard = in.readParcelable(getClass().getClassLoader());
Parcelable[] proPars = in.readParcelableArray(getClass().getClassLoader());
bankInfos = Arrays.asList(Arrays.asList(proPars).toArray(new BankCard[proPars.length]));
//enum無法直接傳遞,只能做一下轉換。
String myTypeString = in.readString();
if (myTypeString != null) {
this.myType = MyType.valueOf(myTypeString);
}
}
public static final Creator<AccountInfo> CREATOR = new Creator<AccountInfo>() {
@Override
public AccountInfo createFromParcel(Parcel in) {
return new AccountInfo(in);
}
@Override
public AccountInfo[] newArray(int size) {
return new AccountInfo[size];
}
};
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeByte((byte) (isNewUser ? 1 : 0));
dest.writeString(name);
dest.writeParcelable(userCard, flags);
dest.writeParcelableArray(bankInfos.toArray(new BankCard[bankInfos.size()]), flags);
dest.writeString(myType == null ? null : myType.name());
}
/**..setter & getter..**/
}
傳遞時代碼:
Intent intent = new Intent(activity, AccountActivity.class);
Bundle bundle = new Bundle();
bundle.putParcelable(Manager.KEY_ACCOUNTINFO, dMAccountInfo);
intent.putExtra(OpenActivity.KEY_OPEN,bundle);
activity.startActivity(intent);
需要注意的是在接收List數據時,需要使用如下代碼來獲取:
dm = bundle.getParcelable(KEY_ACCOUNTINFO);
ArrayList<BankCard> data = new ArrayList<>(dm.getBankInfos());
否則會報java.lang.ClassCastException: java.util.Arrays$ArrayList cannot be cast to java.util.ArrayList
。