说说如何使用 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'}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值