Android 活动生命周期方法和保存状态

Android 活动生命周期方法和保存状态,android,android-lifecycle,Android,Android Lifecycle,我开始阅读有关“活动生命周期回调”和“保存状态”的内容,有很多事情我不明白——我正在编写一个android应用程序,但我想问一些更一般的问题,而不是如何专门针对我目前拥有的几个活动等,我想有一个更好的整体观如何工作 我见过两组方法被使用(我见过一两组其他方法,但我不想进一步混淆自己…) 暂停、恢复等 然后是onSaveInstanceState 它们与我们应该使用它们的环境有什么区别?我看到一些问题,海报使用了一个正常的生命周期回调,并被告知使用onSaveInstanceState,那么我

我开始阅读有关“活动生命周期回调”和“保存状态”的内容,有很多事情我不明白——我正在编写一个android应用程序,但我想问一些更一般的问题,而不是如何专门针对我目前拥有的几个活动等,我想有一个更好的整体观如何工作

我见过两组方法被使用(我见过一两组其他方法,但我不想进一步混淆自己…)

  • 暂停、恢复等
  • 然后是onSaveInstanceState
它们与我们应该使用它们的环境有什么区别?我看到一些问题,海报使用了一个正常的生命周期回调,并被告知使用onSaveInstanceState,那么我们应该在什么时候实现onPause而不是onSaveInstanceState等等。一些帖子提到了只用于瞬态的方法,有人可以对此进行扩展吗

我见过state被用来表示稍微不同的东西——UI/视图状态和活动状态,两者之间有什么区别?
我也有点不确定他们所说的状态是什么意思,当我们保存状态时,我们到底要保存什么样的东西,有人能给出一些简单的例子吗(我不是指实际的代码)?android开发者指南说android系统会自动处理其中的一些问题,那么我们应该关注什么呢?onCreate和onSaveInstanceState使用的捆绑对象只存储简单的值,那么更复杂的对象和数组呢

谢谢

只要看看它,你就可以把你需要保存的东西放进一个包里。并在onCreate(Bundle)或onRestoreInstanceState(Bundle)中获取它; 文件中的一些重要行:

在终止活动之前调用此方法,以便在 在将来的某个时间返回时,它可以恢复其状态。不要 将此方法与活动生命周期回调混淆,例如 ,在将活动放置到中时始终调用它 背景或正在被破坏的过程中,或是 在毁灭之前被召唤


尝试使用此代码保存状态

@Override
protected void onSaveInstanceState(Bundle outState) {
  State s = new State(yourTextView.getText().toString());
  outState.putSerializable(State.STATE, s);
  super.onSaveInstanceState(outState);
}

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
  super.onRestoreInstanceState(savedInstanceState);
  State s = (State) savedInstanceState.getSerializable(State.STATE);
  yourTextView.setText(s.getYourTextViewText());
}

Android可以在任何给定的时间破坏您的活动,甚至杀死您的进程(但在用户可见时不太可能:-)。当用户导航回活动时,应再次显示他或她离开活动前屏幕上显示的数据/信息

onSaveInstanceState
回调允许您执行此操作

大多数视图已经自动为您执行此操作。例如,EditText中的当前文本、ListView的当前滚动位置等都会自动为您保存

但是,有些东西不会自动为您保存。例如,文本视图中的当前文本,特定视图的(更改的)背景可绘制

例如,在用户操作失败后显示错误消息。然后错误消息显示在
TextField
中,这个
TextField
的背景变成红色(我只是在这里编了一个:-))。当用户在显示此错误时离开活动时(例如,按下“主页”按钮),活动将被销毁,当用户返回活动时,错误消息和红色背景将不再显示

这就是
onSaveInstanceState
拯救的地方。

您可以在其中保存包含错误消息的
字符串。然后,当重新创建活动时,
onCreate
Bundle savedInstanceState
不为空,您可以在其中查询错误消息。如果此消息不为null/空,请调用
TextView
上的
setText
以获取错误消息,并将该
TextView
的背景设置为红色。

在错误消息示例中,它是否不会被保存,因为它不是在onCreate期间添加的初始ui的一部分?因此,由于用户交互(或其他)而对ui所做的任何更改都不会自动保存?是的,没错。由于用户交互而对ui所做的某些更改将自动保存(例如,在EditText中键入文本)。但是在TextView上调用setText不会保存,在视图上调用setBackgroundxxx()也不会保存。在这里,您可以使用保存的实例状态来“修复”此问题。
@Override
protected void onSaveInstanceState(Bundle outState) {
  State s = new State(yourTextView.getText().toString());
  outState.putSerializable(State.STATE, s);
  super.onSaveInstanceState(outState);
}

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
  super.onRestoreInstanceState(savedInstanceState);
  State s = (State) savedInstanceState.getSerializable(State.STATE);
  yourTextView.setText(s.getYourTextViewText());
}