2010年3月19日金曜日

Android Bundle で状態を保存

自分のアプリから Intent で別のアプリに飛ぶと onPause() が呼ばれて別のアプリが foreground に来ます。ここから自分のアプリに戻る場合、background にいる時間が短かったり他のアプリがメモリを要求しなければ onResume() が呼ばれて、Intent が呼ばれる前の画面の状態に戻れます。

しかし、Activity が長時間表示されなかったり、別のアプリがメモリを要求したりすると、自分のアプリに戻ったときに、前の画面の状態にはなりません。この場合に前の画面の状態にするには、その状態を意識的に保存する必要があります。

では、どうやって保存するのか、

1.タイミング

onSaveInstanceState(Bundle) で保存し、
onRestoreInstanceState(Bundle) で読み出します。

こんな感じ


@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
/* ここで状態を保存 */
}

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
/* ここで保存した状態を読み出して設定 */
}



2.保存する

onSaveInstanceState の引数である
Bundle にパラメータの値を保存します。

Method は
http://developer.android.com/intl/ja/reference/android/os/Bundle.html
に載ってますが、主なものをあげると

void putBoolean(String key, boolean value)
void putByte(String key, byte value)
void putChar(String key, char value)
void putCharSequence(String key, CharSequence value)
void putDouble(String key, double value)
void putFloat(String key, float value)
void putInt(String key, int value)
void putLong(String key, long value)
void putParcelable(String key, Parcelable value)
void putShort(String key, short value)
void putString(String key, String value)

などがあります。


3.読み出す

では、保存した値を読み出すにはどうするのか。ここでも onRestoreInstanceState の引数の Bundle から読み出します。

主なものをあげると

Object get(String key)
boolean getBoolean(String key)
boolean getBoolean(String key, boolean defaultValue)
Byte getByte(String key, byte defaultValue)
byte getByte(String key)
char getChar(String key, char defaultValue)
char getChar(String key)
CharSequence getCharSequence(String key)
double getDouble(String key, double defaultValue)
double getDouble(String key)
float getFloat(String key, float defaultValue)
float getFloat(String key)
int getInt(String key)
int getInt(String key, int defaultValue)
long getLong(String key, long defaultValue)
long getLong(String key)
<T extends Parcelable> T getParcelable(String key)
short getShort(String key)
short getShort(String key, short defaultValue)
String getString(String key)

などがあります。


4.例

ということで、こんな感じになります。


private String name;
private int age;
private String address;


@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString("nameKey", name);
outState.putInt("ageKey", age);
outState.putString("addressKey", address);
}

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
name = savedInstanceState.getString("nameKey");
age = savedInstanceState.getInt("ageKey", -1);
address = savedInstanceState.getString("addressKey");
}



 

0 件のコメント:

コメントを投稿