什么时候调用onSaveInstanceState()和onRestoreInstanceState()?

时间:2013-12-30 00:43:52

标签: android android-activity restore android-lifecycle

下图(来自the official doc)描述了Android活动的众所周知的生命周期

enter image description here

另一方面,当系统销毁活动时(例如因为需要回收内存),活动的状态有时会通过方法自动保存和恢复 onSaveInstanceState()onRestoreInstanceState(),如下图所示(也来自the official doc):

enter image description here

我知道当活动即将被销毁时onSaveInstanceState()not always called。例如,如果由于用户按下“后退”按钮而导致销毁,则不会保留活动状态。但是在状态 保存并恢复的情况下,onSaveInstanceState() / onRestoreInstanceState()被调用,什么时候被称为

例如,根据上述数据,onRestoreInstanceState()可能会在onStart()之前,onStart()之后,onResume()之前,onResume()之后调用onSaveInstanceState()。同样,{{1}}存在几种可能性。那他们什么时候打电话呢?

理想情况下,我希望看到一个组合图,显示活动生命周期状态和保存/恢复方法(如果存在)。

5 个答案:

答案 0 :(得分:85)

根据documentation

  

void onRestoreInstanceState(Bundle savedInstanceState)

     

此方法在onStart()onPostCreate(Bundle)之间调用。

     

void onSaveInstanceState(Bundle outState)

     

如果被调用,此方法将在onStop()之后针对以Build.VERSION_CODES.P开头的平台的应用程序发生。对于针对早期平台版本的应用程序,此方法将在onStop()之前发生,并且无法保证它是在onPause()之前还是之后发生。

答案 1 :(得分:14)

根据doc1doc2

  

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)的额外信息

from docs

  

不要将此方法与活动生命周期回调混淆,例如   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);
}