Android - Parcel & Parcelable
来源:互联网 发布:陈道明无间道 知乎 编辑:程序博客网 时间:2024/04/29 10:04
对于Parcel的理解: 在Android系统中,定位为针对内存受限的设备,因此对性能要求更高,另外系统中采用了新的IPC(进程间通信)机制,必然要求使用性能更出色的对象传输方式。显然,JAVA的Serialize利用外部存储设备被认为是低效的, 可能也无法完美匹配Binder机制。在这样的环境下,Parcel被设计出来,其定位就是轻量级的高效的对象序列化和反序列化机制。
为了便于ipc之间传递的数据的操作,binder引入了parcel的概念。parcel可以想成快递公司的包装箱,需要传递的各种类型的数据都被打包进parcel类,binder负责传递parcel对象,接收端则从parcel解出数据。这样的机制即减少了各种数据类型对传递的复杂性,又可以通过增加打包/解包parcel的数据类型,轻易实现扩展。 parcel已经支持容纳基本数据类型和一些复合数据类型。
下面内容转自 dairyman的专栏:http://blog.csdn.net/dairyman000/article/details/7247619
Parcel 在英文中有两个意思,其一是名词,为包裹,小包的意思; 其二为动词,意为打包,扎包。邮寄快递中的包裹也用的是这个词。
Android采用这个词来表示封装消息数据。这个是通过IBinder通信的消息的载体。需要明确的是Parcel用来存放数据的是内存(RAM),而不是永久性介质(Nand等)。
Parcelable,定义了将数据写入Parcel,和从Parcel中读出的接口。
一个实体(用类来表示),如果需要封装到消息中去,就必须实现这一接口,实现了这一接口,该实体就成为“可打包的”了。
接口的定义如下:
Parcelable.java<span class="line-number" style="margin: 0px; padding: 0px;">1</span><span class="line-number" style="margin: 0px; padding: 0px;">2</span><span class="line-number" style="margin: 0px; padding: 0px;">3</span><span class="line-number" style="margin: 0px; padding: 0px;">4</span><span class="line-number" style="margin: 0px; padding: 0px;">5</span><span class="line-number" style="margin: 0px; padding: 0px;">6</span><span class="line-number" style="margin: 0px; padding: 0px;">7</span><span class="line-number" style="margin: 0px; padding: 0px;">8</span><span class="line-number" style="margin: 0px; padding: 0px;">9</span><span class="line-number" style="margin: 0px; padding: 0px;">10</span><span class="line-number" style="margin: 0px; padding: 0px;">11</span><span class="line-number" style="margin: 0px; padding: 0px;">12</span><span class="line-number" style="margin: 0px; padding: 0px;">13</span>
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的实现中,规定了必须定义一个静态成员, 初始化为嵌入接口的实现类。
12
public static Parcel.Creator<DrievedClassName> CREATOR = new Parcel.Creator<DrievedClassName>();
下面内容转自 Java-Jinguo:http://jinguo.iteye.com/blog/657240
需求:我们经常需要在多个部件(activity或service)之间通过Intent传递一些数据,简单类型(如数字、字符串)的可以直接放入Intent。复杂类型(例如,J2ee中的Bean)的必须实现Parcelable接口。示例如下:
SampleBean.java
class SampleBean implements Parcelable{ private Bundle mBundle=new Bundle(); public String getArriveTime() { return mBundle.getString("arriveTime"); } public String getOlTime() { return mBundle.getString("olTime"); } public void setArriveTime(String arriveTime) { this.mBundle.putString("arriveTime", arriveTime); } public void setOlTime(String olTime) { this.mBundle.putString("olTime", olTime); }public int describeContents() { return 0; }public void writeToParcel(Parcel out, int arg1) { out.writeBundle(this.mBundle); } public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { public TrainInfo createFromParcel(Parcel in) { SampleBean ti=new SampleBean(); ti.mBundle=in.readBundle(); // 从Parcel中读出Bundle return ti; } public SampleBean[] newArray(int size) { return new SampleBean[size]; } };}
这里采用Bundle是因为在Parcel中并没有key的概念存在,而Bundle相当于Map。
下面内容转自 lincode :http://www.blogjava.net/lincode/archive/2011/09/16/358805.html
Serializable 和 Parcelable 区别
android 中自定义的对象序列化的问题有两个选择一个是Parcelable,
另外一个是Serializable。
一 序列化原因:
- 永久性保存对象,保存对象的字节序列到本地文件中;
- 通过序列化对象在网络中传递对象;
- 通过序列化在进程间传递对象。
二 至于选取哪种可参考下面的原则:
- 在使用内存的时候,Parcelable 类比Serializable性能高,所以推荐使用Parcelable类。
- Serializable在序列化的时候会产生大量的临时变量,从而引起频繁的GC。
- Parcelable不能使用在要将数据存储在磁盘上的情况,因为Parcelable不能很好的保证数据的持续性在外界有变化的情况下。
尽管Serializable效率低点, 也不提倡用,但在这种情况下,还是建议你用Serializable 。
- 【引】android Parcelable Parcel
- Android之Parcelable, Parcel
- Android - Parcel & Parcelable
- Android - Parcel & Parcelable
- android系列:Parcel 和 Parcelable
- Android中Parcel 和 Parcelable
- Android 中parcelable 和 parcel
- Android初学之Parcel和Parcelable
- android 数据传递详解(Serialization、Parcelable、Parcel、Intent、Bundle)
- android 数据传递详解(Serialization、Parcelable、Parcel、Intent、Bundle)
- android 数据传递详解(Serialization、Parcelable、Parcel、Intent、Bundle)
- android 数据传递详解(Serialization、Parcelable、Parcel、Intent、Bundle)
- android 数据传递详解(Serialization、Parcelable、Parcel、Intent等)
- android 数据传递详解(Serialization、Parcelable、Parcel、Intent、Bundle)
- Android中的序列化机制——Parcel与Parcelable
- Parcel 和 Parcelable
- Parcel 和 Parcelable
- Parcel 和 Parcelable
- cpptest使用教材
- 可以ping通,但是不能connect
- ruby安装
- linux双显卡安装nvidia驱动 配置cuda
- MySQL性能优化的21个最佳实践 和 mysql使用索引
- Android - Parcel & Parcelable
- GitHub---团队合作
- 简单数学题或者计算几何:Codeforces 659D-Bicycle Race
- 作业
- 无符号数与有符号数比较
- 前端优化
- Android开发中遇到的问题集合(一)
- echo怎样在行末尾,而不是下一行添加数据
- LDD之字符设备驱动