Android使用Parcelable傳遞boolean、String、Class、List、Enum類型數據

最近有一個需求是從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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章