android Parcelable实现序列化

来源:互联网 发布:山东大学网络教育首页 编辑:程序博客网 时间:2024/04/29 01:44

android Parcelable接口使用

  java中提供了Serializable序列化方法,android提供了Parcelable接口。


Parcelable接口定义:

public interface Parcelable {    public int describeContents();    public void writeToParcel(Parcel dest, int flags);    public interface Creator<T> {        public T createFromParcel(Parcel source);        public T[] newArray(int size);    }    public interface ClassLoaderCreator<T> extends       Creator<T> {        public T createFromParcel(Parcel source, ClassLoader loader);    }}

  describeContents()方法主要是对储存的一些特殊对象的描述,如果包含文件,就要返回 CONTENTS_FILE_DESCRIPTOR,一般返回 0 即可。
  writeToParcel(Parcel dest, int flags)方法,将当前对象的数据存到Parcel对象内,该对象实现了一系列的存储基本数据。
  Creator接口,内部有2个方法,第一个方法返回一个读取后的对象,第二个方法返回一组对象。实现Parcelable时,必须创建一个静态Creator的常量,重写2个方法。 Parcel内部读取数据时会用到该接口提供的2个方法。这个我能力有限,不能解释清楚
  ClassLoaderCreator是一个专门用来接收ClassLoader的接口,继承Creator。


  Parcelable接口的一般使用代码:

public class Book implements Parcelable {    public int bookId;    public String bookName;    public Book(int bookId, String bookName) {        this.bookId = bookId;        this.bookName = bookName;    }    @Override    public int describeContents() {        return 0;    }    @Override    public void writeToParcel(Parcel out, int flags) {        out.writeInt(bookId);        out.writeString(bookName);    }    public static final Parcelable.Creator<Book> CREATOR = new Parcelable.Creator<Book>() {        @Override        public Book createFromParcel(Parcel source) {            return new Book(source);        }        @Override        public Book[] newArray(int size) {            return new Book[size];        }    };    private Book(Parcel in) {        bookId = in.readInt();        bookName = in.readString();    }}

  这里要注意一点:public static final Parcelable.Creator< Book > CREATOR = new Parcelable.Creator< Book >() {}这一段代码必须存在,并且除了泛型不一样,2个内部实现可能不一样外,其它都必须这么写。因为Parcel会使用该接口。(我试着看了下Parcel代码,只能看懂一点~~)

  在Activity通过Intent传递实现Parcelable接口的对象:

Intent i = new Intent(MainActivity.this,                 SecondActivity.class);i.putExtra("Book", mBook);startActivity(i);

  获取Intent中的Book对象:

Intent i = getIntent();mBook = (Book) i.getParcelableExtra("Book");

  当然也可以通过Bundle:

Intent i = new Intent(MainActivity.this,                        SecondActivity.class);Bundle bundle = new Bundle();bundle.putParcelable("Book", mBook);i.putExtras(bundle);startActivity(i);

  从Bundle从获取对象:

Bundle bundle = getIntent().getExtras();mBook = (Book) bundle.getParcelable("Book");

  Parcelable实现比Serializable麻烦,但是效率比较高,内存消耗比较小。适合跨进程通信。

0 0
原创粉丝点击