下图(来自the official doc)描述了Android活动的众所周知的生命周期:
另一方面,当系统销毁活动时(例如因为需要回收内存),活动的状态有时会通过方法自动保存和恢复 onSaveInstanceState()
和onRestoreInstanceState()
,如下图所示(也来自the official doc):
我知道当活动即将被销毁时onSaveInstanceState()
为not always called。例如,如果由于用户按下“后退”按钮而导致销毁,则不会保留活动状态。但是在状态 保存并恢复的情况下,onSaveInstanceState()
/ onRestoreInstanceState()
被调用,什么时候被称为?
例如,根据上述数据,onRestoreInstanceState()
可能会在onStart()
之前,onStart()
之后,onResume()
之前,onResume()
之后调用onSaveInstanceState()
。同样,{{1}}存在几种可能性。那他们什么时候打电话呢?
理想情况下,我希望看到一个组合图,显示活动生命周期状态和保存/恢复方法(如果存在)。
答案 0 :(得分:85)
void onRestoreInstanceState(Bundle savedInstanceState)
此方法在
onStart()
和onPostCreate(Bundle)
之间调用。void onSaveInstanceState(Bundle outState)
如果被调用,此方法将在onStop()之后针对以Build.VERSION_CODES.P开头的平台的应用程序发生。对于针对早期平台版本的应用程序,此方法将在onStop()之前发生,并且无法保证它是在onPause()之前还是之后发生。
答案 1 :(得分:14)
onSaveInstanceState
在Honeycomb之前,活动直到他们之后才被认为是可以杀戮的 暂停了,这意味着 在onPause()之前立即调用了onSaveInstanceState()。 然而,从Honeycomb开始,活动被认为是 只有在他们被阻止之后才能停止,这意味着 onSaveInstanceState()现在将在onStop()之前调用,而不是 紧接在onPause()之前。
<强> onRestoreInstanceState 强>
此方法在onStart()和onPostCreate(Bundle)之间调用 该活动正在从之前保存的州重新初始化
答案 2 :(得分:11)
除了已发布的答案外,Android P还引入了一个微妙的变化,即:
void onSaveInstanceState(Bundle outState)
如果被调用,对于以 P 开头的平台的应用程序,此方法将发生 AFTER
onStop()
。对于定位早期平台版本的应用程序,此方法将在onStop()
之前发生,并且无法保证它是在onPause()
之前还是之后发生。
来源:docs
至于为什么要引入这种改变,这就是答案:
...因此,应用程序可以安全地在
onStop()
中执行片段事务,并且以后可以保存持久状态。
来源:docs
答案 3 :(得分:5)
这是 onSaveInstanceState(Bundle)的额外信息
不要将此方法与活动生命周期回调混淆,例如 onPause(),在放置活动时始终调用 背景或正在破坏的路上,或onStop() 在破坏之前召集。 onPause()和onStop()的一个例子 被调用,而不是这个方法是用户导航回来的时候 活动B到活动A:没有必要打电话 B上的onSaveInstanceState(Bundle)因为那个特定的实例会 永远不会被恢复,所以系统避免调用它。一个例子 调用onPause()而不是onSaveInstanceState(Bundle)是什么时候 活动B在活动A前面启动:系统可以避免 在活动A上调用onSaveInstanceState(Bundle),如果它没有被杀死 在B的生命周期中,因为A的用户界面的状态 将保持不变。
这是..
的默认实现默认实现负责处理每个实例的大部分UI 通过在每个视图上调用onSaveInstanceState()来为你状态 具有id的层次结构,并通过保存当前的id 聚焦视图(所有这些都由默认实现恢复 onRestoreInstanceState(Bundle))。如果您重写此方法 您可以保存每个视图未捕获的其他信息 可能想调用默认实现, 否则准备好自己保存每个视图的所有状态。
答案 4 :(得分:0)
String activityState;
@Override
public void onCreate(Bundle savedInstanceState) {
// call the super class onCreate to complete the creation of activity like
// the view hierarchy
super.onCreate(savedInstanceState);
// recovering the instance state
if (savedInstanceState != null) {
activityState = savedInstanceState.getString(STATE_KEY);
}
setContentView(R.layout.main_activity);
mTextView = (TextView) findViewById(R.id.text_view);
}
//只有先前存在已保存的实例时才会调用此回调 保存使用 的onSaveInstanceState //()。我们可以在onCreate()中恢复一些状态 可选择恢复 //此处的其他状态,可能在onStart()完成后可用。 // savedInstanceState Bundle与onCreate()中使用的相同。
@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
mTextView.setText(savedInstanceState.getString(STATE_KEY));
}
// invoked when the activity may be temporarily destroyed, save the instance
//state here
//this method will be called before onstop
@Override
public void onSaveInstanceState(Bundle outState) {
outState.putString(STATE_KEY, activityState);
// call superclass to save any view hierarchy
super.onSaveInstanceState(outState);
}