zoukankan      html  css  js  c++  java
  • Parcel和Parcelable

    参考:http://blog.csdn.net/dairyman000/article/details/7247619

    arcel 在英文中有两个意思,其一是名词,为包裹,小包的意思; 其二为动词,意为打包,扎包。邮寄快递中的包裹也用的是这个词。Android采用这个词来表示封装消息数据。这个是通过IBinder通信的消息的载 体。需要明确的是Parcel用来存放数据的是内存(RAM),而不是永久性介质(Nand等)。

    Parcelable,定义了将数据写入Parcel,和从Parcel中读出的接口。一个实体(用类来表示),如果需要封装到消息中去,就必须实现这一接口,实现了这一接口,该实体就成为“可打包的”了。

    接口的定义如下:

    public interface Parcelable {
        //内容描述接口,基本不用管
        public int describeContents();
        //写入接口函数,打包
        public void writeToParcel(Parcel dest, int flags);
         //读取接口,目的是要从Parcel中构造一个实现了Parcelable的类的实例处理。因为实现类在这里还是不可知的,所以需要用到模板的方式,继承类名通过模板参数传入。
        //为了能够实现模板参数的传入,这里定义Creator嵌入接口,内含两个接口函数分别返回单个和多个继承类实例。
        public interface Creator<T> {
               public T createFromParcel(Parcel source);
               public T[] newArray(int size);
        }
    }

    下面定义了一个简单类People, 他需要把自身的数据,打入包中。 同时在消息的接收方需要通过People实现的Parcelable接口,将People重新构造出来。

    People.java
    public
    class People implements Parcelable { private String name = null; private int age = 0; private int sex = 0;// 0代表男、1代表女 public People() { super(); } public People(String name, int age, int sex) { super(); this.name = name; this.age = age; this.sex = sex; } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeString(name); dest.writeInt(age); dest.writeInt(sex); } public static final Parcelable.Creator<People> CREATOR = new Creator<People>() { @Override public People[] newArray(int size) { return new People[size]; } @Override public People createFromParcel(Parcel source) { return new People(source.readString(), source.readInt(), source.readInt()); } }; }

    传递People

    //发送 MainActivity.java
    People people = new People(); people.setName("张三"); people.setSex(Integer.parseInt(0)); people.setAge(Integer.parseInt(25)); Intent intent = new Intent(MainActivity.this, ShowActivity.class); Bundle b = new Bundle(); b.putParcelable("people", people); intent.putExtras(b); MainActivity.this.startActivity(intent);

    //接受 ShowActivity.java
    if(getIntent().getExtras().containsKey("people")){
      People people = getIntent().getExtras().getParcelable("people");
    }
  • 相关阅读:
    XML基础
    vue项目使用WebViewJavascriptBridge
    vue cli3 打包部署 Failed to load resource: net::ERR_FILE_NOT_FO 找不到路径问题
    js 将一个数组插入到另一个数组的方法
    div随意拖动小例子
    带转义符的json解释
    银行卡四位数空隔
    收录-获取时间、日期
    封装的一些例子
    easyui-validatebox 验证
  • 原文地址:https://www.cnblogs.com/xingfuzzhd/p/3454227.html
Copyright © 2011-2022 走看看