使用 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'}
网友评论