http://my.oschina.net/zhoulc/blog/172163

parcel定义介绍:

android提供了一种新的类型:parcel(英文解释:包裹,小包),本类用来封装数据的容器,封装后的数据可以通过Intent或IPC传递,除了基本类型外,只有实现了Parcelable接口的类才能放入parcel中。

parcel一般都用在Binder通信,通过read和write方法进行客户端与服务端的数据传递(通信)。
比如:frameworks层服务端与hardware客户端的Binder通信
reply->writeInt32(getCardReaderSize());
int mid = data.readInt32();
用来存放parcel数据的是内存(RAM),而不是永远介质(Nand等)。

parcelable定义了把数据写入parcel和从parcel读出数据的接口,一个类的实例,如果需要封装到消息中去,就必须实现这一接口,如果实现了这个接口,该类的实例就是可以“被打包”。

Parcelable的定义:

下面我们看下parcelable的源码:

内容描述接口,没什么作用
publicintdescribeContents();
写入接口函数,用来打包
publicvoidwriteToParcel(Parceldest,intflags);
读取接口,目的是从parcel中构造一个实现了parcelable的类的实例对象,因为实现类这里是不可知的,所以需要用到模板的方法,继承类通过模板参数传入。
为了能够实现模板参数的传入,定义了creator嵌入接口,内涵两个接入函数分别是单个和多个继承类实例。
public interface Creator<T> {
public T createFromParcel(Parcel source);
public T[] newArray(int size);
}
还有一个子接口继承Creator,子接口只提供了一个函数,返回单个继承类实例
public interface ClassLoaderCreator<T> extends Creator<T>

Parcelable的实现使用:

Parcelabel 的实现,需要在类中添加一个静态成员变量 CREATOR,这个变量需要继承 Parcelable.Creator 接口。

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 package com.zlc.provider; import android.os.Parcel; import android.os.Parcelable; public class Students implements Parcelable{ private int stu_id; private String stu_name; public Students(Parcel source){ stu_id = source.readInt(); stu_name = source.readString(); } public int getStu_id() { return stu_id; } public void setStu_id( int stu_id) { this .stu_id = stu_id; } public String getStu_name() { return stu_name; } public void setStu_name(String stu_name) { this .stu_name = stu_name; } @Override public int describeContents() { // TODO Auto-generated method stub return 0 ; } @Override public void writeToParcel(Parcel dest, int flags) { // TODO Auto-generated method stub dest.writeInt(stu_id); dest.writeString(stu_name); } //Interface that must be implemented and provided as a public CREATOR field that generates instances of your Parcelable class from a Parcel. public final static Parcelable.Creator<Students> CREATOR = new Parcelable.Creator<Students>() { @Override public Students createFromParcel(Parcel source) { // TODO Auto-generated method stub return new Students(source); } @Override public Students[] newArray( int size) { // TODO Auto-generated method stub return new Students[size]; } }; }


Parcelable和Serializable的区别:

android自定义对象可序列化有两个选择一个是Serializable和Parcelable

一、对象为什么需要序列化
1.永久性保存对象,保存对象的字节序列到本地文件。
2.通过序列化对象在网络中传递对象。
3.通过序列化对象在进程间传递对象。

二、当对象需要被序列化时如何选择所使用的接口
1.在使用内存的时候Parcelable比Serializable的性能高。
2.Serializable在序列化的时候会产生大量的临时变量,从而引起频繁的GC(内存回收)。
3.Parcelable不能使用在将对象存储在磁盘上这种情况,因为在外界的变化下Parcelable不能很好的保证数据的持续性。

更多相关文章

  1. SpringBoot 2.0 中 HikariCP 数据库连接池原理解析
  2. 一句话锁定MySQL数据占用元凶
  3. listview与adapter用法
  4. android AutoCompleteTextView+ SQLite
  5. Android中传递对象列表的几种方式
  6. 请求网络数据后更新视图
  7. Androiid
  8. Android观察者模式实例分析
  9. Java四种引用对比

随机推荐

  1. android:scaleType
  2. Android 异步消息处理机制
  3. 【翻译】(14)Stable APIs
  4. 日常get知识记录【9】Android studio 错
  5. android网址推荐(转)
  6. Android大图片裁剪终极解决方案
  7. 基于android的俯卧撑计数器
  8. Android基本功:使用Matrix控制变换
  9. Android Resource介绍和使用(二)
  10. [Android]安装使用SDK Manager更新时出现