private static final String KEY = "qaz";
private String aString;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = (TextView) findViewById(R.id.txt);
final String saved;
if (savedInstanceState != null) {
saved = savedInstanceState.getString(KEY);
report("[" + saved + "]");
} else {
saved = null;
report("[NULL]");
}
if (aString==null && saved!=null) {
aString = saved;
report("A");
}
}
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
report("s");
savedInstanceState.putString(KEY, aString);
super.onSaveInstanceState(savedInstanceState);
}
@Override
protected void onPause() {
report("p");
super.onPause();
}
@Override
public void onBackPressed() {
report("b");
super.onBackPressed();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
private void report(String s) {
aString += " " + s;
Log.v("report", aString);
textView.setText(aString);
}
1 に答える
onSaveInstanceは、アクティビティの1つのインスタンスから次のインスタンスに値を保持することを目的としています。たとえば、方向の変更時にアクティビティが破棄されて再作成された場合などです。アクティビティが再作成されると、Activityクラスを拡張するために定義したクラスのまったく新しいインスタンスであるため、すべてのローカルフィールド(変数)が再初期化されることに注意してください。
すでに発見したように、SharedPreferencesは、アクティビティのライフサイクルを超えて値を維持するための優れた方法です。もちろん、他にもあります。onSaveInstanceに保存され、onCreateで取得された値は、アクティビティの新しいインスタンスを、破棄される前と同じ状態に初期化できるようにすることを目的としています。
たとえば、メッセージングアプリケーションがあり、ユーザーがすでに数行のテキストを入力しているとします。次に、誤って向きを反転し(すべて正しく実行しましたか?)、それを元に戻します。彼らのテキストが消えたのを見るのはどれほどイライラするでしょうか?!したがって、優れた開発者は、TextViewの現在のコンテンツをonSaveInstanceに保存し、onCreateで取得します。値が取得されると、その値はsetText()メソッドに渡され、ユーザーは元の場所から続行できます。
こちらをご覧ください。アクティビティのライフサイクル、それを制御する方法、アクティビティ間で値を渡す方法(2つの異なるアクティビティまたは同じアクティビティの2つのインスタンス)を学ぶことは、Androidの王国を解き放つための鍵の1つです。
http://developer.android.com/reference/android/app/Activity.html#ActivityLifecycle
重要なポイントは、各コールバックがいつ呼び出されるか、さらに重要なことに、Androidによって呼び出される場合と呼び出されない場合があることを理解することです。たとえば、アプリがバックグラウンドにある場合、Androidがアプリを強制終了することを決定した場合に、アクティビティが再度呼び出されるという保証はありません。
幸運を。