android.osパッケージのParcelableは、
(Parcelクラスから)インスタンスを読み書きするためのインターフェースです。
例えば、アクティビティ(Activity)間で、データを渡したい場合、
Intent.putExtra()などで、ほとんどのデータ型を格納することができますが、
Parcelableインタフェースを実装しているクラスであれば、そのインスタンスも、
putExtra(String name, Parcelable value)を呼び出すことで、インスタンスごと渡すことができます。
※「Parcel」は日本語に直訳すると「小包」。なんとなくイメージできますね。
では、Parcelableインタフェースを実装するには、どうすればよいかというと、
下記のような実装を追加するだけでよいです。
※ソースコードは、公式のヘルプ(http://code.google.com/intl/ja/android/reference/android/os/Parcelable.html)を引用したものです。
public class MyParcelable implements Parcelable {
private int mData;
public void writeToParcel(Parcel out, int flags) {
out.writeInt(mData);
}
public static final Parcelable.Creator CREATOR
= new Parcelable.Creator() {
public MyParcelable createFromParcel(Parcel in) {
return new MyParcelable(in);
}
public MyParcelable[] newArray(int size) {
return new MyParcelable[size];
}
}
private MyParcelable(Parcel in) {
mData = in.readInt();
}
}
具体的には、
コンストラクタ(Parcel in)では、データの読み込み(復元)処理を追加します。
例えば、この例では、int型のメンバ変数を読み込みたいので、in.readInt()を呼び出します。
※ArrayList<XXX>の場合には、Parcel.createTypedArrayList(XXX.CREATOR)を呼び出す。
※メンバ変数が、独自のクラスの場合にも、同クラスでParcelalbeを実装し、
読み込みたいところで、Parcel.readParcelable(ClassLoader loader)を呼び出す。
ClassLoader loaderは、XXX.class.getClassLoader()で取得できます。
次に必要となるのが、書き込みですが、こちらはwriteToParcel()に処理を追加します。
追加する内容は、読み込みとペアで、readをwriteに書き換えていきます。
※ArrayList<XXX>の場合には、Parcel.writeTypedList()を呼び出す。
※Parcelalbeを実装したクラスを書きだすには、Parcel.writeParcelable(Parcel dest, int flags)を呼び出す。
※余談:感のよい方であれば、直列化/シリアライズ(Serialization)を想像されたと思いますが、
Parcelクラスは、あくまでもデータの永続化が(General)目的ではなく、
IPC(プロセス間通信)でハイパフォーマンスを得るためにデザインされたものだそうです。
