Activityが回收された後のデータ処理
Activityが停止状態になると、システムによって回收される可能性があります。
例えば、Activity A から Activity B を起動した場合、Activity A は停止状態になります。このとき、メモリ不足などによりシステムが Activity A を回收し、その後ユーザーが戻るボタンを押して Activity A に戻ったとします。
この場合、Activity A は通常通り表示されますが、onRestart() は呼ばれず、代わりに onCreate() が実行され、Activity A が新しく作成し直されます。
もし Activity A に一時的なデータ(例えばテキストボックスに入力された文字列など)があった場合、回收されるとそのデータはすべて失われてしまいます。
このようなことがアプリで発生すると、ユーザーエクスペリエンスに悪影響を及ぼします。
幸い、Android には onSaveInstanceState() というコールバックメソッドが用意されており、Activity が回收される直前に必ず呼び出されます。
そのため、この仕組みを使えば回收前の一時データを保持することができます。
onSaveInstanceState() メソッドには、Bundle 型のパラメータが渡されます。
Bundle クラスには、データを保存するためのメソッドが用意されています。例えば、文字列を保存する putString() や、整数を保存する putInt() などです。
onSaveInstanceState メソッドのオーバーライド
// 日本語
@Override
protected void onSaveInstanceState(Bundle outState) { // このメソッドは、Activityが回收される前に呼び出される
super.onSaveInstanceState(outState);
outState.putString("user_name", "潘さん");
}Code language: JavaScript (javascript)
// 日本語
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.e(TAG, "onCreate: ");
if (savedInstanceState != null) // onCreate内でBundleにデータが含まれているか確認できる。データがあれば、Activityが回收されて再作成されたことを意味する
{
Log.e(TAG, savedInstanceState.getString("user_name"));
}
}Code language: JavaScript (javascript)
再作成時にBundleデータを取得する
onCreate メソッドでは、システムから Bundle 型のパラメータが渡されます:
// 日本語
protected void onCreate(Bundle savedInstanceState) {Code language: JavaScript (javascript)
Bundleデータの取得
// 日本語
if (savedInstanceState != null) // onCreate内でBundleにデータが含まれているか確認できる。データがあれば、Activityが回收されて再作成されたことを意味する
{
Log.e(TAG, savedInstanceState.getString("user_name"));
}Code language: JavaScript (javascript)
Activityの回收
Previous: アクティビティのライフサイクル
Next: アクティビティの起動モード