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に表示しています。