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 旨在将值从您的活动的一个实例持续到下一个实例,例如当活动被销毁并在方向更改时重新创建时。请记住,当您的活动被重新创建时,它是您为扩展活动类而定义的类的全新实例,因此,所有本地字段(变量)都将被重新初始化。
正如您已经发现的那样,SharedPreferences 是一种在 Activity 生命周期之外保持值的好方法,当然还有其他方法。在 onSaveInstance 中保存并在 onCreate 中检索的值旨在让您能够将活动的新实例初始化为与销毁之前相同的状态。
例如,假设您有一个消息传递应用程序,并且您的用户已经输入了几行文本。然后他们不小心翻转了方向(我们都做对了吗?)然后将其翻转回来。看到他们的文字消失了,他们会有多沮丧?!因此,一个好的开发人员会将 TextView 的当前内容保存在 onSaveInstance 中,并在 onCreate 中检索它。如果检索到任何值,则将其传递给 setText() 方法,以便用户可以从原来的位置继续。
看看这里。学习 Activity 的生命周期,如何控制它以及如何在 Activity 之间传递值(2 个不同的 Activity 或同一 Activity 的 2 个实例)是解锁 Android 王国的关键之一。
http://developer.android.com/reference/android/app/Activity.html#ActivityLifecycle
关键是要了解每个回调何时被调用,更重要的是,Android 可能调用或不调用什么。例如,当您的应用程序处于后台时,如果 Android 决定终止您的应用程序,则无法保证您的活动会再次被调用。
祝你好运。