【Android昇格】ActivityとFragmentにおけるonSaveInstanceState()の使用の詳細


各インスタンスを保存するステータスは、activity(またはfragement)が殺される前に呼び出され、onCreate(Bundle)またはonRestoreInstanceState(Bundle)(入力されたBundleパラメータはonSaveInstanceStateによってカプセル化された)でリカバリできることを保証します.この方法はactivityが殺される前に呼び出され、activityが将来のある時点で戻ってくると、その前の状態を回復することができる.たとえば、activity Bが有効になってactivity Aの先頭にある場合、ある時点でactivity Aがシステム回収リソースの問題で殺されると、AはonSaveInstanceStateを介してそのユーザインタフェースの状態を保存する機会があり、将来のユーザがactivity Aに戻ったときにonCreate(Bundle)またはonRestoreInstanceState(Bundle)を介してインタフェースの状態を回復することができる.
この方法をonPause()やonStop()のようなactivityライフサイクルコールバックと混同しないでください.onPause()はactivtiyが背景に置かれたり、自分で破棄されたりしたときに呼び出され、onStop()はactivityが破棄されたときに呼び出されます.onPause()とonStop()が呼び出されますが、onSaveInstanceStateがトリガーされない例は、ユーザーがactivity Bからactivity Aに戻ると、BのonSaveInstanceState(Bundle)を呼び出す必要がなく、このときのBインスタンスが回復しないため、システムは呼び出さないようにします.onPause()を呼び出すがonSaveInstanceStateを呼び出さない例は、activity Bが起動してactivity Aのフロントエンドにある場合です.Bのライフサイクル全体でAのユーザーインタフェース状態が破壊されなければ、activity AのonSaveInstanceState(Bundle)は呼び出されません.
デフォルトのインプリメンテーションは、UIレイヤ上のidを持つviewのonSaveInstanceState()を呼び出し、現在フォーカスされているviewのidを保存します(すべての保存されたステータス情報は、デフォルトのonRestoreInstanceState(Bundle)インプリメンテーションで復元されます.この方法を上書きして、各viewに保存されていない追加の情報を保存する場合は、デフォルトの実装中に各ビューのすべてのステータスを呼び出したり、自分で保存したりしたい場合があります.呼び出されると、このメソッドはonStop()の前にトリガーされますが、onPause()の前または後にトリガーされるかどうかは保証されません.
以上はAPIドキュメントの説明ですが、プロジェクトではonSaveInstanceState()メソッドでデータを保存し、onCreate()またはonRestoreInstanceState(Bundle)でインタフェースをリカバリするのが一般的です.
1つのプロジェクトで使用するシナリオは、onSaveInstanceState()に現在表示されている最初のlistviewのitemのposition情報を記録し、onRestoreInstanceState(Bundle)でlistview呼び出しsetSelection()メソッドを使用して位置を特定し、ユーザー体験をより友好的にすることです.
コードは次のとおりです.
@Override
	public void onSaveInstanceState(Bundle outState) {
		super.onSaveInstanceState(outState);
		// SharedPreference , , , 
		stateSaver.remove(this.toString());
		//  
		int firstVisiblePosition = listview.getFirstVisiblePosition();
		if (mInfoAdapter.getList().size() > 0) {
			// SharedPreference , 
			stateSaver.put(this.toString(), mInfoAdapter.getList());
			// Bundle 
			outState.putInt("firstVisiblePosition", firstVisiblePosition);
		}
	}

onViewStateRestored()メソッドでのデータのリカバリ
@Override
	public void onViewStateRestored(Bundle savedInstanceState) {
		super.onViewStateRestored(savedInstanceState);
		// 
		int firstVisiblePosition = 0;
		// 
		if (savedInstanceState != null) {
			firstVisiblePosition = savedInstanceState.getInt("firstVisiblePosition");
		}
		if (stateSaver.get(this.toString()) != null) {
			List<EngineeringInfo> list = stateSaver.get(this.toString());
			if (list.size() > 0) {
				mInfoAdapter.setList(list);
				// 
				listview.setSelection(firstVisiblePosition);
			}
		}
	}

ご質問がございましたら、メッセージをお願いいたします