1. 程式人生 > >說說如何使用 Android 中的 Intent 來傳遞類物件

說說如何使用 Android 中的 Intent 來傳遞類物件

使用 Intent 來傳遞物件有兩種方式:Serializable 和 Parcelable。

1 Serializable 方式

假設有一個 POJO 的 Account 類,該類實現了 Serializable 介面:

public class Account implements Serializable {

    //姓名
    private String name;

    //密碼
    private String pwd;


    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPwd() {
        return pwd;
    }

    public void setPwd(String pwd) {
        this.pwd = pwd;
    }

    @Override
    public String toString() {
        return "Account{" +
                "name='" + name + '\'' +
                ", pwd='" + pwd + '\'' +
                '}';
    }
}

Serializable 表示將一個物件轉化為可儲存或可傳輸的狀態。序列化的物件即可在網路上傳輸也可儲存到本地。希望將一個類序列化,我們只需要實現 Serializable 介面(標記介面)就好咯O(∩_∩)O~

在 MainActivity 中設定 Account 物件:

Account account = new Account();
account.setName("deniro");
account.setPwd("ew23408");
Intent intent = new Intent(MainActivity.this, NextActivity.class);
intent.putExtra("account", account);
startActivity(intent);

這裡我們把 account 直接傳入 Intent 的 putExtra() 方法。

在 NextActivity 中獲取 Account 物件:

Account account=(Account)getIntent().getSerializableExtra("account");
Log.d(TAG, "account: "+account);

輸出結果:

D/NextActivity: account: Account{name=‘deniro’, pwd=‘ew23408’}

2 Parcelable 方式

Parcelable 方式會對物件進行分解,這樣分解後的每一部分都是 Intent 所支援的資料型別,通過這種方式就可以實現傳遞物件的功能咯O(∩_∩)O~

public class Account2 implements Parcelable {

    //姓名
    private String name;

    //密碼
    private String pwd;

    public Account2() {
    }

    public static final Creator<Account2> CREATOR = new Creator<Account2>() {
        @Override
        public Account2 createFromParcel(Parcel in) {
            Account2 entity = new Account2();
            entity.name = in.readString();
            entity.pwd = in.readString();
            return entity;
        }

        @Override
        public Account2[] newArray(int size) {
            return new Account2[size];
        }
    };


    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(name);
        dest.writeString(pwd);
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPwd() {
        return pwd;
    }

    public void setPwd(String pwd) {
        this.pwd = pwd;
    }


    @Override
    public String toString() {
        return "Account{" +
                "name='" + name + '\'' +
                ", pwd='" + pwd + '\'' +
                '}';
    }
}

必須實現 Parcelable 中的 describeContents 與 writeToParcel 方法,describeContents 方法較少用到,使用預設實現即可;writeToParcel 方法用於寫資料到 Parcel。

還需要定義好一個 CREATOR 常量,泛型是我們需要傳遞的類。裡面的 createFromParcel 方法用於從 Parcel 中讀取資料。**注意:**這裡的讀取順序必須與之前在 writeToParcel 方法中定義的寫入順序一致!

傳遞的引數的程式碼與 Serializable 方式相同:

Account2 entity = new Account2();
entity.setName("deniro");
entity.setPwd("wdour23");
intent.putExtra("account2",entity);

讀取引數的程式碼如下:

Account2 account2= getIntent().getParcelableExtra("account2");
Log.d(TAG, "account2: "+account2);

輸出結果:

D/NextActivity: account2: Account{name=‘deniro’, pwd=‘wdour23’}