Android 活动生命周期方法和保存状态
我开始阅读有关“活动生命周期回调”和“保存状态”的内容,有很多事情我不明白——我正在编写一个android应用程序,但我想问一些更一般的问题,而不是如何专门针对我目前拥有的几个活动等,我想有一个更好的整体观如何工作 我见过两组方法被使用(我见过一两组其他方法,但我不想进一步混淆自己…)Android 活动生命周期方法和保存状态,android,android-lifecycle,Android,Android Lifecycle,我开始阅读有关“活动生命周期回调”和“保存状态”的内容,有很多事情我不明白——我正在编写一个android应用程序,但我想问一些更一般的问题,而不是如何专门针对我目前拥有的几个活动等,我想有一个更好的整体观如何工作 我见过两组方法被使用(我见过一两组其他方法,但我不想进一步混淆自己…) 暂停、恢复等 然后是onSaveInstanceState 它们与我们应该使用它们的环境有什么区别?我看到一些问题,海报使用了一个正常的生命周期回调,并被告知使用onSaveInstanceState,那么我
- 暂停、恢复等
- 然后是onSaveInstanceState李>
我也有点不确定他们所说的状态是什么意思,当我们保存状态时,我们到底要保存什么样的东西,有人能给出一些简单的例子吗(我不是指实际的代码)?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());
}