說說如何使用 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’}