视图组件中的文本由操作系统自动保存,即使在软终止(用户更改手机方向)之后,但不是在硬终止之后,用户在父活动处于焦点时点击后退按钮。所以,除非你做一些非标准的事情,比如调用 onSaveInstanceState 而不调用 super.onSaveInstanceState,否则视图状态中的数据应该是持久的。
一种解决方案是在启动子活动之前将视图组件中的文本保存为非视图实例属性,并在 onActivityResult 方法中焦点返回到父活动时读取此值。
日航
编辑:Android Docs Activity 页面已被广泛更新。如果小部件没有 ID,则不会保存视图状态。
编辑:我的意思是视图状态应该由操作系统持久化。您不需要手动保存视图状态。在硬杀时,如果这是活动的预期行为,您将需要保存活动的状态。所以这里有一些保存活动状态的代码。给定一个实例变量:
String password;
这里我们保存软杀的状态:
protected void onSaveInstanceState(Bundle outState){
password= editTextPassword.getText().toString();
outState.putString("password", password);
super.onSaveInstanceState(outState); // save view state
}
这里我们在硬杀时保存状态
@Override
protected void onStop(){
super.onStop();
SharedPreferences prefs = getPreferences(MODE_PRIVATE);
SharedPreferences.Editor editor = prefs.edit();
editor.putString("password",password);
editor.commit();
这里我们在 onCreate(Bundle savedInstanceState) 中恢复状态:
if( savedInstanceState!= null){ // get saved state from soft kill after first pass
try {
password= savedInstanceState.getString("password");
Log.d(TAG,"RestoredState!");
}
catch(Exception e){
Log.d(TAG,"FailedToRestoreState",e);
}
}
else { // get saved state from preferences on first pass
SharedPreferences prefs = getPreferences(MODE_PRIVATE); // singleton
if (prefs != null){
this.password= prefs.getString("password","");
Log.d(TAG,"gettingPrefs");
}
}
Log.d(TAG,"onCreate");
另外考虑到如果 onSaveInstanceState 被调用,它将在 onStop 之前被调用,如果您将 onResume 中的标志重置为:
protected void onResume() {
super.onResume();
Log.d(TAG,"onResume");
isSavedInstanceState= false;
isSavedPrefs= false;
}
在 onCreate 中设置标志不会产生预期的结果。