原文地址: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的源碼:
內容描述接口,沒什麼作用
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);
}
還有一個子接口繼承Creator,子接口只提供了一個函數,返回單個繼承類實例
public interface ClassLoaderCreator<T> extends Creator<T>
三、Parcelable的實現使用
Parcelabel 的實現,需要在類中添加一個靜態成員變量 CREATOR,這個變量需要繼承
Parcelable.Creator 接口。
- 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、對象爲什麼需要序列化
1.永久性保存對象,保存對象的字節序列到本地文件。
2.通過序列化對象在網絡中傳遞對象。
3.通過序列化對象在進程間傳遞對象。
2、當對象需要被序列化時如何選擇所使用的接口
1.在使用內存的時候Parcelable比Serializable的性能高。
2.Serializable在序列化的時候會產生大量的臨時變量,從而引起頻繁的GC(內存回收)。
3.Parcelable不能使用在將對象存儲在磁盤上這種情況,因爲在外界的變化下Parcelable不能很好的保證數據的持續性。