Android使用Parcelable传递对象

来源:互联网 发布:淘宝网上预订鲜花 编辑:程序博客网 时间:2024/06/05 20:43

在开发中,我们经常要通过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不支持,这样在传递的时候,就可以有效避免数据的安全了。

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 双户口注销学历怎么办 户口注销了社保怎么办 科一指纹录不上怎么办 右倒库右边太宽怎么办 手机录不了指纹怎么办 6sp指纹不灵敏怎么办 手指纹汗多怎么办? 手指没指纹怎么办身份证 青岛身份证丢了怎么办 新身份证没激活怎么办 坐轻轨没身份证怎么办 办身份证指纹录不上怎么办 指纹固化剂干了怎么办 指纹解锁没反应怎么办 荣耀v8指纹失灵怎么办 指纹多次不匹配怎么办 华为指纹被禁用怎么办 手脱皮没有指纹怎么办 手脱皮手机指纹怎么办 手脱皮录指纹怎么办 科二指纹打不上怎么办 三星手机无法解锁怎么办 iphone7指纹坏了怎么办 苹果8录不上指纹怎么办 手机套总是粘指纹怎么办 华为p9指纹禁用怎么办 华为p10升级失败怎么办 手机指纹锁没反应怎么办 华为手机指纹禁用怎么办 excel输入值非法怎么办 excel表数字乱码怎么办 excel表格打不开了怎么办 表格中数字乱码怎么办 手机颜色变了怎么办 身份证上的字母怎么办 身份证被盗用贷款怎么办 刑拘在逃不归案怎么办 在逃人员抓不到怎么办 卖假烟被网上追逃怎么办? 同事贷款不还怎么办 支付宝怎么办信用卡2