天天看點

Android 用Intent 傳遞對象之 Parcel

Android 為對象序列化開發了 Parcelable 接口,這個接口要比之前說的 Serializable 更為高效。使用會稍微複雜些。

其主要思想就是把 對象需要儲存的資料 放在 parcel 對象中,然後再從 parcel 中恢複這個對象。可見實作 Parcelable這個接口的類,至少會實作兩個方法一個用來 将資料儲存進 parcel 對象,一個 方法用來從 parcel 中恢複對象。

示例結構:

Android 用Intent 傳遞對象之 Parcel

 先寫一個實作了 Parcelable 接口的類 Person,可見 writeToParcel 用來向Parcel 對象寫入要儲存的對象,

CREATOR 用來恢複對象。存入的資料要和讀取的資料順序對應。

package com.serializabletest;

import android.os.Parcel;
import android.os.Parcelable;
import android.util.Log;

class Person implements Parcelable {

  private static final String TAG = "Person";
  int ID;
  String Name;
  int age;

  public Person(int ID, String Name, int age) {
    this.ID = ID;
    this.Name = Name;
    this.age = age;
  }

  public void printPerson() {
    Log.d(TAG, "ID:" + ID);
    Log.d(TAG, "Name:" + Name);
    Log.d(TAG, "age:" + age);
  }

  // -------------------------------------------------
  public Person(Parcel in) {
    this.ID = in.readInt();
    this.Name = in.readString();
    this.age = in.readInt();
  }

  // 從 Parcel 對象 中恢複 Person 對象
  <span style="color:#ff0000;"><strong>public static final Parcelable.Creator<Person> CREATOR</strong> </span>= new Parcelable.Creator<Person>() {

    @Override
    public Person createFromParcel(Parcel arg0) {
      // TODO Auto-generated method stub
      return new Person(arg0);
    }

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

  /**
   * Describe the kinds of special objects contained in this Parcelable's
   * marshalled(排列) representation(表現).
   * 
   * 用來描述序列化對象中特殊對象的分布狀況。
   * 
   * Returns a bitmask indicating the set of special object types marshalled
   * by the Parcelable.
   * 
   * @see android.os.Parcelable#describeContents()
   */

  @Override
  public int describeContents() {
    // TODO Auto-generated method stub
    return 0;
  }

  /**
   * 用來将對象轉換成 parcel 對象
   * 
   * 決定了把什麼資料寫入 parcel
   * 
   * @see android.os.Parcelable#writeToParcel(android.os.Parcel, int)
   */
  // 把 Person 對象轉化為 Parcel 對象存儲起來
  @Override
  public void <strong><span style="color:#ff0000;">writeToParcel</span></strong>(Parcel arg0, int arg1) {
    // TODO Auto-generated method stub

    arg0.writeInt(ID);
    arg0.writeString(Name);
    arg0.writeInt(age);
  }
}      

MainActivity.java

package com.serializabletest;

import java.io.IOException;
import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.View;

public class MainActivity extends Activity {

  public static final String TAG = "MainActivity";
  /** 序列化測試
   * @see android.app.Activity#onCreate(android.os.Bundle)
   */
  private final String objName = "/mnt/sdcard/object.txt";

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setTitle("Intent 傳遞對象");
    setContentView(R.layout.activity_main);

  }

  public void onBtnClick(View view) throws IOException {
    Person person = new Person(1, "張三", 26);

    Bundle bundle = new Bundle();
    bundle.putParcelable("person", person);
    Intent intent = new Intent(MainActivity.this, SecondActivity.class);
    intent.putExtras(bundle);
    startActivity(intent);
  }
}      

SecondActivity.java

package com.serializabletest;

import java.io.IOException;
import java.io.StreamCorruptedException;

import android.os.Bundle;
import android.view.View;
import android.app.Activity;
import android.content.Intent;

public class SecondActivity extends Activity {

  public static final String TAG = "MainActivity";
  /** 序列化測試
   * @see android.app.Activity#onCreate(android.os.Bundle)
   */
  private final String objName = "/mnt/sdcard/object.txt";

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setTitle("Intent 傳遞對象");
    setContentView(R.layout.activity_second);

    Intent intent = getIntent();
    Bundle bundle = intent.getExtras();
    Person person = bundle.getParcelable("person");
    person.printPerson();
  }

  public void onBtnClick(View view) throws StreamCorruptedException,
      IOException, ClassNotFoundException {
    this.finish();
  }

}