onSaveInstanceStateでインスタンスを保存する


onSaveInstanceStateメソッドを使ってActivityのインスタンスを保存/復帰させる方法を紹介します。onSaveInstanceState/onRestoreInstanceStateメソッドは永続的なデータ保存には利用できませんが、一時的にインスタンスを保存するケースでは威力を発揮します。

アプリケーションを起動する際、現在表示されているアプリケーションはbackgroundにまわり、新しいアプリが起動します。backgroundに回ったアプリケーションはAndroidのアプリケーション履歴の”backstack”モデルに従い、履歴としてスタックします。

Android端末のメモリが豊富に残っていれば、backgroundのActivityのインスタンスは維持されますが、メモリが少なくなった際は破棄されます。onSaveInstanceState/onRestoreInstanceStateメソッドが役立つのは”システムによりインスタンスが破棄されるケース(次に表示されるまでにしばらく間があったとき)”です。
エミュレータ上では自分以外のアプリケーションが存在することが少ないため、注意が必要です。

インスタンスの保存/復帰

onSaveInstanceStateメソッドは全てのシチュエーションで呼ばれるわけではありません。
必ず保存する必要があるデータなどはライフサイクルモデルに従い、onPauseメソッドを利用してください。

onSaveInstanceState/onRestoreInstanceState

メソッド 説明
onSaveInstanceState(Bundle outState) Bundleにデータ保存する
onRestoreInstanceState(Bundle savedInstanceState) Bundleより復帰する

サンプルコード

続きをどうぞ

onSaveInstanceStateメソッドではBundleを使ってデータを保存します。

1
2
3
4
5
6
7
8
9
10
11
@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    Log.d("Lifecycle","onSaveInstanceState()");
 
    //インスタンスの保存
    EditText et = (EditText)findViewById(R.id.editText1);
    Editable editable = et.getText();
 
    outState.putString("EDITTEXT_KEY", editable.toString() );
}

今回は、10行目のようにBundle#putStringを例として利用しています。
Bundleを使って保存できる形式は http://developer.android.com/reference/android/os/Bundle.html に詳しく記載されています。

onRestoreInstanceStateメソッドは以下の通りです

1
2
3
4
5
6
7
8
9
10
11
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);
    Log.d("Lifecycle","onRestoreInstanceState()");
 
    //インスタンスの復帰
    String str = savedInstanceState.getString("EDITTEXT_KEY");
    TextView tv = (TextView)findViewById(R.id.textView1);
 
    tv.setText("onRestoreInstanceState:" + str);
}

onRestoreInstanceStateメソッドではonSaveInstanceStateメソッドで利用したBundleを受け取り、インスタンスを復帰させることができます。サンプルでは、7行目で保存した文字列を取得して、10行目でTextViewに表示しています。