Android中Parcelable接口用法

from:

http://www.cnblogs.com/renqingping/archive/2012/10/25/Parcelable.html

Interface for classes whose instances can be written to and restored from a Parcel。 Classes implementing the Parcelable interface must also have a static field called CREATOR, which is an object implementing the Parcelable.Creator interface。

 1 public interface Parcelable {
 2     public static final int PARCELABLE_WRITE_RETURN_VALUE = 0x0001;
 3     public static final int CONTENTS_FILE_DESCRIPTOR = 0x0001;
 4     public int describeContents();//返回0即可    //一个是把本对象(实现了Parcelable的对象)的数据写入Parcel中
 5     public void writeToParcel(Parcel dest, int flags);
 6       /**
 7              * Interface that must be implemented and provided as a public CREATOR
 8              * field that generates instances of your Parcelable class from a Parcel.
 9              */
10         public interface Creator<T> {//提供一个内部类,供反序列化的时候把Parcel对象转化为对象,即本对象
11         /**
12          * Create a new instance of the Parcelable class, instantiating it
13          * from the given Parcel whose data had previously been written by
14          * {@link Parcelable#writeToParcel Parcelable.writeToParcel()}.
15          *
16          * @param source The Parcel to read the object‘s data from.
17          * @return Returns a new instance of the Parcelable class.
18          */
19             public T createFromParcel(Parcel source);//读出source中的数据给T(即本对象)
20
21         /**
22          * Create a new array of the Parcelable class.
23          *
24          * @param size Size of the array.
25          * @return Returns an array of the Parcelable class, with every entry
26          * initialized to null.
27          */
28             public T[] newArray(int size);
29         }
30       public interface ClassLoaderCreator<T> extends Creator<T> {
31           public T createFromParcel(Parcel source, ClassLoader loader);
32         }
33 }

2.序列化的原因

1)永久性保存对象,保存对象的字节序列到本地文件中;

2)通过序列化对象在网络中传递对象;

3)通过序列化在进程间传递对象。

3.Parcelable与Serializable的对比

  • Parcelable

  1.android特有;

  2.实现复杂;

  3.比Serializable高效

  4.可以用于进程间通信(IPC),也可用于intent通讯;

  5.不能使用在要将数据存储在磁盘上的情况,因为Parcelable不能很好的保证数据的持续性在外界有变化的情况下。

  6.复杂类型必须实现Parcelable接口。

  • Serializable

  1.java SE实现;

  2.在序列化的时候会产生大量的临时变量,从而引起频繁的GC。

  3.实现简单

Parcel是公共的内存空间,所以可以存、取数据。由于是内存操作,所以要比Serialize利用外部存储设备来存、取数据要快!

如果要发送对象最简单的方法是: 把要发的数据直接当做对象发送,接收也不用Bundle(这是可以的),因为已经默认创建。

4.public static final一个都不能少,内部对象CREATOR的名称也不能改变,必须全部大写。

简而言之:通过writeToParcel将你的对象映射成Parcel对象,再通过createFromParcel将Parcel对象映射成你的对象。

5.简单例子

 1 public class Person implements Parcelable {
 2     private String name;
 3     private int age;
 4     private static final String TAG = "Person";
 5
 6     public String getName() {
 7         return name;
 8     }
 9
10     public void setName(final String name) {
11         this.name = name;
12     }
13
14     public int getAge() {
15         return age;
16     }
17
18     public void setAge(final int age) {
19         this.age = age;
20     }
21
22     public static final Parcelable.Creator<Person> CREATOR = new Creator<Person>() {
23         @Override
24         public Person createFromParcel(final Parcel source) {
25             Log.d(TAG, "createFromParcel");
26             Person mPerson = new Person();
27             mPerson.name = source.readString();
28             mPerson.age = source.readInt();
29             return mPerson;
30         }
31
32         @Override
33         public Person[] newArray(final int size) {
34             // TODO Auto-generated method stub
35             return new Person[size];
36         }
37     };
38
39     @Override
40     public int describeContents() {
41         // TODO Auto-generated method stub
42         Log.d(TAG, "describeContents");
43         return 0;
44     }
45
46     @Override
47     public void writeToParcel(final Parcel dest, final int flags) {
48         // TODO Auto-generated method stub
49         Log.d(TAG, "writeToParcel");
50         dest.writeString(name);
51         dest.writeInt(age);
52     }
53 }

6.writeToParcel()写和createFromParcel()读对象的数据们的顺序必须一致;



时间: 2024-10-23 14:58:24

Android中Parcelable接口用法的相关文章

Android中Parcelable接口用法(转自Harvey Ren)

1. Parcelable接口 Interface for classes whose instances can be written to and restored from a Parcel. Classes implementing the Parcelable interface must also have a static field called CREATOR, which is an object implementing the Parcelable.Creator int

android中Parcelable接口的使用

android中Parcelable接口的使用 一.理解 Parcelable是一个接口.用来实现序列化.与此类似的还有一个接口Serializable,这是JavaSE本身支持的,而Parcelable是android特有的.二者比较: 1.Parcelable使用起来稍复杂点,而后者使用起来非常简单.下面例子中会看到. 2.Parcelable效率比Serializable高,支持Intent数据传递,也支持进程间通信(IPC). 3.Parcelable使用时要用到一个Parcel,可以简

Android中Parcelable接口使用方法

1. Parcelable接口 Interface for classes whose instances can be written to and restored from a Parcel. Classes implementing the Parcelable interface must also have a static field called CREATOR. which is an object implementing the Parcelable.Creator int

Android中Parcelable与Serializable接口用法

转自: Android中Parcelable接口用法 1. Parcelable接口 Interface for classes whose instances can be written to and restored from a Parcel. Classes implementing the Parcelable interface must also have a static field called CREATOR, which is an object implementing

谈谈-Android中的接口回调技术

Android中的接口回调技术有很多应用的场景,最常见的:Activity(人机交互的端口)的UI界面中定义了Button,点击该Button时,执行某个逻辑. 下面参见上述执行的模型,讲述James对Android接口回调技术的理解(结合前人的知识和自己的实践). 使用一个比喻很形象地说明:客户端有个疑问打电话请教服务端,但服务端无法现场给出解答,相互之间约定:服务端一旦有答案,使用电话的方式反馈给客户端. 以上有三个主体:客户端.服务端和接口(方式). 接口回调的原理框图说明: Demo界面

Android中this的用法

关于Android中this的用法解释 问题由来 由于很多同学在学习Android时候没有对Java有很深的了解,很多人都会对代码中各种各样的this产生疑惑. 以<第一行代码Android>P37页,P43页代码为例: protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.first_layout); Button but

关于Android 中 raw的用法以及与assets 的的区别和共同点

一.raw与assets的区别及共同点 (1) res/raw和assets的相同点 两个目录下的文件在打包后会原封不动的保存在apk包中,不会被编译成二进制. (2) res/raw和assets的不同点: 1.res/raw中的文件会被映射到R.java文件中,访问的时候直接使用资源ID即R.raw.filename: assets文件夹下的文件不会被映射到R.java中,访问的时候需要AssetManager类. 2.res/raw不可以有目录结构,而assets则可以有目录结构,也就是a

Android中的ContentValues用法

ContentValues 和HashTable类似都是一种存储的机制 但是两者最大的区别就在于,contenvalues只能存储基本类型的数据,像string,int之类的,不能存储对象这种东西,而HashTable却可以存储对象.ContentValues存储对象的时候,以(key,value)的形式来存储数据. 在忘数据库中插入数据的时候,首先应该有一个ContentValues的对象所以: ContentValues initial = new ContentValues(); init

Android中的接口回调技术

Android中的接口回调技术有很多应用的场景,最常见的:Activity(人机交互的端口)的UI界面中定义了Button,点击该Button时,执行某个逻辑. 下面参见上述执行的模型,讲述James对Android接口回调技术的理解(结合前人的知识和自己的实践). 使用一个比喻很形象地说明:客户端有个疑问打电话请教服务端,但服务端无法现场给出解答,相互之间约定:服务端一旦有答案,使用电话的方式反馈给客户端. 以上有三个主体:客户端.服务端和接口(方式). 接口回调的原理框图说明: Demo界面