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