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を使ってデータを保存します。
@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メソッドは以下の通りです
@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に表示しています。