AndroidのParcelable

Androidでオブジェクトを保存したいなと思い探していたところこれに行き当たった。
しかし、これは一時的な保存であり永続化をするものではないようだ。
目的とは違うが一応調べたのでまとめておく。
Parcelableが使われる場面はIntent間での自作オブジェクトの受け渡しや画面の向きが変わった時の状態の保持などのようである。


Token.java


public class Token implements Serializable{

/**
*
*/
private static final long serialVersionUID = -3712153948245714426L;
private AccessToken token;

public Token() {
// TODO 自動生成されたコンストラクター・スタブ
}

public AccessToken getAccessToken(){
return token;
}
}

Login.java


public class Login implements Parcelable{

private Token token;
private int num;

public static final Parcelable.Creator CREATOR=new Parcelable.Creator() {
public Login createFromParcel(Parcel in){
return new Login(in);
}

public Login[] newArray(int size){
return new Login[size];
}
};


private Login(Parcel in) {
// TODO 自動生成されたコンストラクター・スタブ
token=(Token) in.readSerializable();
num=i.readInt();
}

public int describeContents() {
// TODO 自動生成されたメソッド・スタブ
return 0;
}

public void writeToParcel(Parcel dest, int flags) {
// TODO 自動生成されたメソッド・スタブ
dest.writeSerializable(token);
dest.writeInt(num);
}

public AccessToken getAccessToken(){
return token.getAccessToken();
}

}

in.read〜やdest.write〜といったところで処理を行っている模様。
ここではSerializableを実装したクラスを書き出しているが通常はParcelableを実装したクラスを書き出す。
尚、オブジェクトでなくプリミティブ型であればインターフェースを実装する必要はない。
書き出した順番と読み込む順番は同じにしないといけないようだ。
ここまで実装できたら


@Override
protected void onSaveInstanceState(Bundle outState){
super.onSaveInstanceState(outState);
outState.putParcelable("token",login);
}

/** Called after onCreate. */
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState){
super.onRestoreInstanceState(savedInstanceState);
login=savedInstanceState.getParcelable("token");
}

このようなタイミングで呼び出すのが一般的なようだ。このメソッドはActivityを継承したクラスにある。