2012年2月12日日曜日

インスタンスの保存

androidのSDKには多くのサンプルが用意されています。
これはとても良い教材であり、アプリを作成する際のヒントとして、とても重宝しています。

今回から数回にわたり、サンプルの「Snake」を題材として、アプリ作成の基本をまとめてみます。


第一回目は「インスタンスの保存」です。

インスタンスの保存は何故必要なのでしょうか?

端末の向きが変わって画面が回転した場合は、いったんActivityは破棄されて、onCreate()メソッドで再作成されます。
また、長い時間背面に移動していたActivityが前面に戻る様な時も、いったんActivityは破棄されて、onCreate()メソッドで再作成されます。
Activityが破棄されるということは、インスタンスが保持していたデータも消失してしまうことを意味します。

そこでインスタンスの保存が必要になるのです。


「Snake」の例でいうと、背面に移動していたActivityが前面に戻ってきたとき、ゲームの続きからプレイできるように、ヘビとリンゴの位置情報やスコアなどを保存しておく必要があります。

以下のように保存しています。

【Snake.java】

@Override
public void onSaveInstanceState(Bundle outState) {
//Store the game state
outState.putBundle(ICICLE_KEY, mSnakeView.saveState());
}

【SnakeView.java】

public Bundle saveState() {
Bundle map = new Bundle();
map.putIntArray("mAppleList", coordArrayListToArray(mAppleList));
map.putInt("mDirection", Integer.valueOf(mDirection));
map.putInt("mNextDirection", Integer.valueOf(mNextDirection));
map.putLong("mMoveDelay", Long.valueOf(mMoveDelay));
map.putLong("mScore", Long.valueOf(mScore));
map.putIntArray("mSnakeTrail", coordArrayListToArray(mSnakeTrail));
return map;
}

Activityが背面に移動する際に呼び出されるonSaveInstanceState()メソッドをオーバーライドして、その中で必要なデータを保存しています。
引数のBundleオブジェクトにヘビやリンゴの状態、スコアなどを保存しているのがわかります。


保存したデータは、以下のように読み出しています。

【Snake.java】

@Override
public void onCreate(Bundle savedInstanceState) {

--------------

// We are being restored
Bundle map = savedInstanceState.getBundle(ICICLE_KEY);
if (map != null) {
mSnakeView.restoreState(map);
}

--------------

}


【SnakeView.java】

public void restoreState(Bundle icicle) {
setMode(PAUSE);
mAppleList = coordArrayToArrayList(icicle.getIntArray("mAppleList"));
mDirection = icicle.getInt("mDirection");
mNextDirection = icicle.getInt("mNextDirection");
mMoveDelay = icicle.getLong("mMoveDelay");
mScore = icicle.getLong("mScore");
mSnakeTrail = coordArrayToArrayList(icicle.getIntArray("mSnakeTrail"));
}


onCreate()メソッドの引数であるBundleオブジェクトから、ヘビやリンゴの状態、スコアなどを読み出しているのがわかります。

0 件のコメント:

コメントを投稿