Android开发中Parcelable接口的使用方法

 在网上看到很多Android初入门的童鞋都在问Parcelable接口的使用方法,小编参考了相关Android教程,看到里面介绍的序列化方法主要有两种分别是实现Serializable接口和实现Parcelable接口,通过具体试验,和大家分享一下Parcelable接口的用法,希望对大家有帮助。

 

Serializable接口与Parcelable接口的区别

在将Parcelable接口的使用前,我们先来看看Serializable接口和Parcelable接口有什么区别:

1、Serializable是JDK提供的接口,而Parcelable是Android SDK提供的。

 

2、Serializable序列化是基于磁盘的,而Parcelable是基于内存的。在内存中读写的效率要高于磁盘,所以Android中跨进程传递对象都是使用Parcelable。

 

Parcelable接口定义

 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);

       }

从parcelable接口定义中,我们可以看出,实现parcelable接口,我们需要实现下面几个方法:

1.describeContents方法。内容接口描述,默认返回0就可以;

2.writeToParcel 方法。该方法将类的数据写入外部提供的Parcel中。即打包需要传递的数据到Parcel容器保存,以便从parcel容器获取数据,该方法声明如下:

writeToParcel (Parcel dest, int flags) 具体参数含义见javadoc

3、静态的Parcelable.Creator接口,本接口有两个方法:

createFromParcel(Parcel in)  从Parcel容器中读取传递数据值,封装成Parcelable对象返回逻辑层。

newArray(int size) 创建一个类型为T,长度为size的数组,仅一句话(return new T[size])即可。方法是供外部类反序列化本类数组使用。

 

Parcelable接口的使用

  public class AppContent implements Serializable, Parcelable {

     //应用名字

      private String name;

      //应用下载链接

      private String url;

      private int downloadPercent = 0;

     private Status status = Status.PENDING;

     public AppContent(String name, String url) {

         this.name = name;

         this.url = url;

     }

      public String getName() {

        return name;

     }

     public void setName(String name) {

         this.name = name;

     }

 

     public String getUrl() {

         return url;

    }

 

     public void setUrl(String url) {

         this.url = url;

     }

     public int getDownloadPercent() {

        return downloadPercent;

     }

    public void setDownloadPercent(int downloadPercent) {

        this.downloadPercent = downloadPercent;

     }

     public Status getStatus() {

         return status;

     }

     public void setStatus(Status status) {

         this.status = status;

    }

     @Override

     public String toString() {

         return name;

     }

     @Override

     public int describeContents() {

         return 0;

     }

     //实现Parcel接口必须覆盖实现的方法

    @Override

     public void writeToParcel(Parcel dest, int flags) {

         /*将AppContent的成员写入Parcel,

          * 注:Parcel中的数据是按顺序写入和读取的,即先被写入的就会先被读取出来

          */

         dest.writeString(name);

         dest.writeString(url);

         dest.writeInt(downloadPercent);

       dest.writeValue(status);

    }

    //该静态域是必须要有的,而且名字必须是CREATOR,否则会出错

    public static final Parcelable.Creator<AppContent> CREATOR =

             new Parcelable.Creator<AppContent>() {

                @Override

                 public AppContent createFromParcel(Parcel source) {

                     //从Parcel读取通过writeToParcel方法写入的AppContent的相关成员信息

                     String name = source.readString();

                    String url = source.readString();

                     int downloadPercent = source.readInt();

                     Status status = (Status)source.readValue(new ClassLoader(){});

                     AppContent appContent = new AppContent(name, url);

                    appContent.setDownloadPercent(downloadPercent);

                     appContent.setStatus(status);

                     //更加读取到的信息,创建返回Person对象

                     return appContent;

               }

 

                 @Override

                 public AppContent[] newArray(int size)

                 {

                    // TODO Auto-generated method stub

                     //返回AppContent对象数组

                     return new AppContent[size];

                 }

             };

}

通过Intent进行传递:

 

1    Intent intent = new Intent(Constants.DOWNLOAD_MSG);

2    Bundle bundle = new Bundle();

3    bundle.putParcelable("appContent", appContent);

4    intent.putExtras(bundle);

 

以上就是Android开发中,序列化常用的Parcelable接口方法,遇到有类似问题的亲可尝试使用上述的方法进行解决。

 

posted on 2015-10-15 14:12  高逼格  阅读(577)  评论(0编辑  收藏  举报

导航