使用 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'}
来源: http://www.jianshu.com/p/d6366962890d