为什么用户输入无法通过 Android 10 上的 onRestoreInstanceState 恢复?



我有以下代码:

public class MainActivity extends AppCompatActivity {
EditText edtInput;
private static final String STATE_RESULT = "state_result";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
edtInput = (EditText) findViewById(R.id.edtInput);
}
@Override
protected void onSaveInstanceState(@NonNull Bundle outState) {
outState.putString(STATE_RESULT, edtInput.getText().toString());
super.onSaveInstanceState(outState);
}
@Override
protected void onRestoreInstanceState(@NonNull Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
if (savedInstanceState != null){
edtInput.setText(savedInstanceState.get(STATE_RESULT).toString());
}
}
}

在Pixel 3(运行Android 12(上:在EditText中键入一些内容,然后进行屏幕旋转组合,打开/关闭屏幕,按回主页并再次打开应用程序。用户输入仍然在EditText 上

在小米Pophone F1(运行Android 10(上,有一种稍微不同的行为:如果你按下并再次打开应用程序,EditText将被清除。但只要你只打开/关闭或旋转屏幕就没问题。

不确定我是否误解了Android的活动生命周期,或者这是操作系统上的一个错误。感谢您的帮助。

在开始弄清楚为什么会发生这种情况之前,您需要弄清楚到底发生了什么。

您应该添加一些日志来查看它到底在哪里失败。也许在F1上,应用程序在调用onSaveInstanceState()之前就被杀死了。或者onRestoreInstanceState()savedInstanceState == null:

@Override
protected void onSaveInstanceState(@NonNull Bundle outState) {
outState.putString(STATE_RESULT, edtInput.getText().toString());
super.onSaveInstanceState(outState);
Log.d("***", "Saved")
}
@Override
protected void onRestoreInstanceState(@NonNull Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
Log.d("***", "Restoring: " + (savedInstanceState == null))
if (savedInstanceState != null){
edtInput.setText(savedInstanceState.get(STATE_RESULT).toString());
}
}

然后查看日志,看看当你使用后退箭头退出应用程序,然后重新启动它时,F1上会发生什么。

编辑:由于F1上似乎没有调用onRestoreInstanceState(),您可能应该尝试自己保存应用程序状态,而不是依赖savedInstanceState。例如,您只需在每个editText字段中添加一个onTextChanged()侦听器,然后将文本保存到SharedPreferences中。当用户提交文本时,您可以删除该首选项。然后可以在onCreate()中恢复它们。这样,您就完全独立于的生命周期

最新更新