Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android 序列化對象接口Parcelable使用方法

Android 序列化對象接口Parcelable使用方法

編輯:關於Android編程

什麼是Parcelable ?

Parcelable,定義了將數據寫入Parcel,和從Parcel中讀出的接口。一個實體(用類來表示),如果需要封裝到消息中去,就必須實現這一接口,實現了這一接口,該實體就成為“可打包的”了。

Parcelable 傳遞對象

Android序列化對象主要有兩種方法:

1.實現Serializable接口,實現Serializable接口是JavaSE本身就支持的;

2.實現Parcelable接口,Parcelable是Android特有的功能,效率比實現Serializable接口高,像用於Intent數據傳遞也都支持,而且還可以用在進程間通信(IPC),

除了基本類型外,只有實現了Parcelable接口的類才能被放入Parcel中。

Parcelable接口定義

public interface Parcelable {
    //內容描述接口,基本不用管
    public int describeContents();
    //寫入接口函數,打包
    public void writeToParcel(Parcel dest, int flags);
     //讀取接口,目的是要從Parcel中構造一個實現了Parcelable的類的實例處理。因為實現類在這裡還是不可知的,所以需要用到模板的方式,繼承類名通過模板參數傳入。
    //為了能夠實現模板參數的傳入,這裡定義Creator嵌入接口,內含兩個接口函數分別返回單個和多個繼承類實例。
    public interface Creator {
           public T createFromParcel(Parcel source);
           public T[] newArray(int size);
       }

實現Parcelable接口?

從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])即可。方法是供外部類反序列化本類數組使用。

代碼實現

1.封裝數據,把實現parcelable接口的Person對象傳遞到TwoActivity裡;

public class DemoActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        // 封裝數據
        Person p = new Person();
        p.setId(1);
        p.setName("xiaoming");
        // 用Intent傳遞Person對象
        Intent i = new Intent(this, TwoActivity.class);
        i.putExtra("Person", p);
        startActivity(i);
    }
}
2.TwoActivity獲取數據,從DemoActivity傳遞的Person對象給解析,並打印;
public class TwoActivity extends Activity {


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        
        Person p = (Person)getIntent().getParcelableExtra("Person");
        
        System.out.println("p_id"+p.getId());
        System.out.println("p_name"+p.getName());
    }
}

3.parcelable接口的實現

public class Person implements Parcelable{
    
    // 成員變量
    private int id;
    private String name;
    
    // 1.必須實現Parcelable.Creator接口,否則在獲取Person數據的時候,會報錯,如下:
    // android.os.BadParcelableException:
    // Parcelable protocol requires a Parcelable.Creator object called  CREATOR on class com.um.demo.Person
    // 2.這個接口實現了從Percel容器讀取Person數據,並返回Person對象給邏輯層使用
    // 3.實現Parcelable.Creator接口對象名必須為CREATOR,不如同樣會報錯上面所提到的錯;
    // 4.在讀取Parcel容器裡的數據事,必須按成員變量聲明的順序讀取數據,不然會出現獲取數據出錯
    // 5.反序列化對象
    public static final Parcelable.Creator CREATOR = new Creator(){

        @Override
        public Person createFromParcel(Parcel source) {
            // TODO Auto-generated method stub
            // 必須按成員變量聲明的順序讀取數據,不然會出現獲取數據出錯
            Person p = new Person();
            p.setId(source.readInt());
            p.setName(source.readString());
            return p;
        }

        @Override
        public Person[] newArray(int size) {
            // TODO Auto-generated method stub
            return new Person[size];
        }
    };
    
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = 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
        // 1.必須按成員變量聲明的順序封裝數據,不然會出現獲取數據出錯
        // 2.序列化對象
        dest.writeInt(id);
        dest.writeString(name);
    }
}


  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved