アプリの状態を、アプリの起動/終了を越えて維持したいということはあると思います。この前作った電卓では、計算状態はアプリを終了(メインの画面で戻るボタンを押す)しても次に起動したときに復元されるようにしてあります。

アクティビティのライフサイクルメソッドには onCreate(Bundle), onSaveInstanceState(Bundle), onRestoreInstanceState(Bundle) といったものがあり、一見これを使えば良さそうに思ええますが、目的が違います。これはアクティビティのインスタンスごとの状態を、デバイス本体の設定変更や画面の回転を越えて維持するためのものです。メインアクティビティクラスでは起きませんが、1つのアクティビティクラスから複数のアクティビティのインスタンスを作ることもあるので、インスタンスごとの状態はこれを使って保持します。アプリを終了(アプリのメインアクティビティを終了)してまた起動した場合、アクティビティのインスタンスは別のものとして扱われるので、Bundle には null が渡ってきます。だから今回の目的には使えません。

じゃあどうするのかというと、SharedPreferences というものを使います。getPreferences(int) で現在のアクティビティクラスに対応するプレファレンスのストアを取得し、それを操作します。こんな感じ。

@Override
protected void onCreate(Bundle savedInstanceState) {
	super.onCreate(savedInstanceState);

	(snip)

	try {
		SharedPreferences pref = getPreferences(MODE_PRIVATE);

		state = State.valueOf(pref.getString("state", State.SHOW_RESULT.toString()));
	} catch (Exception e) {
		state = State.SHOW_RESULT;
	}
}

@Override
protected void onPause() {
	super.onPause();

	SharedPreferences.Editor editor = getPreferences(MODE_PRIVATE).edit();
	
	editor
		.clear()
		.putString("state", state.toString())
		.commit();
}

SharedPreferences へのアクセスを try-catch で囲んでいるのは、保存していた状態が不正(アプリのバージョンが変わって保存の仕方が変わった場合なども含む)で復元時に例外が発生した時に、丸ごとデフォルトの状態にするためのものです。

Trackback

no comment untill now

Add your comment now