Android使用Parcelable传递对象

在开发中,我们经常要通过Bundle来传递对象,而Bundle则提供了两个方法供我们调用,两个如下:

putParcelable(String key, Parcelable value);
putSerializable(String key, Serializable value);

通过名字我们就可以知道,第一个方法使用Parcelable来传递数据,第二个方法则是通过Serializable来传递数据,对于第二种方法呢,没有什么可以讲的,只需要实现该接口即可,示例代码如下:

public class Person implements Serializable {
    private static final long serialVersionUID = -7060210544600464481L;
    private String name;
    private int age;

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

}

而对已第一种情况呢,稍稍复杂些,但是相比第二种,他更加的灵活,安全,可以决定那些数据不需要传,那些数据需要传,说了这么多,还是感觉不懂啊,没关系,下面一个示例就让您明明白白。
第一步:实现Parcelable接口

public class User implements Parcelable {
    public String name;
    public String nickname;
    public int age;
    public byte isMemoy;
    ...
}

第二步:重写里面的writeToParcel方法,很简单

//该方法一般我们不去理会他,直接返回0即可,按照文档描述:应该是描述的在Parcelable里面特殊对象的位掩码之类的。
@Override
    public int describeContents() {
        return 0;
    }
    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(name);
        dest.writeString(nickname);
//      dest.writeInt(age); //不在这里指定,则在传数据的时候不传该数据
        dest.writeByte(isMemoy);
    }

第三步:定义变量Parcelable.Creator<>,如下

public static final Parcelable.Creator<User> CREATOR  = new Creator<User>() {
        @Override
        public User[] newArray(int size) {
            return new User[size];
        }
        //一定要注意:写入parcel和反序列化parcel时顺序一定要相同,不然数据会出错。
        @Override
        public User createFromParcel(Parcel source) {
            User user = new User();
            user.name = source.readString();
            user.nickname = source.readString();
//          user.age = source.readInt();
            user.isMemoy = source.readByte();
            return user;
        }
    };

经过这三步,那么这个对象就支持使用使用Bundle来传递对象了,不过要注意:写入parcel和反序列化parcel时顺序一定要相同,不然数据会出错。

最后附上完整的实现:

import android.os.Parcel;
import android.os.Parcelable;

public class User implements Parcelable {

    public String name;
    public String nickname;
    public int age;
    public byte isMemoy;


    public static final Parcelable.Creator<User> CREATOR  = new Creator<User>() {
        @Override
        public User[] newArray(int size) {
            return new User[size];
        }
        //一定要注意:写入parcel和反序列化parcel时顺序一定要相同,不然数据会出错。
        @Override
        public User createFromParcel(Parcel source) {
            User user = new User();
            user.name = source.readString();
            user.nickname = source.readString();
//          user.age = source.readInt();
            user.isMemoy = source.readByte();
            return user;
        }
    };

    @Override
    public int describeContents() {
        return 0;
    }
    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(name);
        dest.writeString(nickname);
//      dest.writeInt(age);
        dest.writeByte(isMemoy);
    }
}

经过这么一定义,就可以了,但是另外要注意,传递此对象时,只支持name,nickname,isMemoy这三个字段,age不支持,这样在传递的时候,就可以有效避免数据的安全了。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值