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

下图(来自官方文档 )描述了Android活动的众所周知的生命周期

在这里输入图像说明

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

在这里输入图像说明

我知道onSaveInstanceState() 并不总是被调用,当一个活动即将被销毁。 例如,如果由于用户按下了“返回”button而被销毁,则活动状态不被保留。 但是在状态保存和恢复的情况下, onSaveInstanceState() / onRestoreInstanceState()被调用, 什么时候被调用

例如,根据上面的图, onRestoreInstanceState()可以在onStart()之前,或onStart()之后, onResume()之前或onResume()之后onStart() 。 同样, onSaveInstanceState()存在几种可能性。 那他们什么时候准确地打电话?

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

根据文档 :

void onRestoreInstanceState(Bundle savedInstanceState)

这个方法在onStart()onPostCreate(Bundle)之间onStart()

void onSaveInstanceState(Bundle outState)

如果调用,这个方法会在onStop()之前发生。 onPause()之前或之后是否会发生。

它没有被定义为什么时候可以调用onSaveInstanceState() ,唯一的保证就是该范围。

按照doc1和doc2

的onSaveInstanceState

在Honeycomb之前,活动在被暂停之前不会被视为killable,这意味着onSaveInstanceState()在onPause()之前被立即调用。 然而,从Honeycomb开始,活动只有在停止之后才被认为是可利用的,这意味着onSaveInstanceState()现在将在onStop()之前而不是在onPause()之前被调用。

onRestoreInstanceState

这个方法在onStart()和onPostCreate(Bundle)之间被调用,当这个活动正在从之前保存的状态重新初始化

这是onSaveInstanceState(Bundle)的额外信息

从文档

不要将这种方法与活动生命周期callback混淆,比如onPause(),当一个活动被放置在后台或者销毁的途中总是被调用,或者是在销毁之前被调用的onStop()。 当onPause()和onStop()被调用,而不是这个方法的一个例子是当用户从活动B返回到活动A时:不需要在B上调用onSaveInstanceState(Bundle),因为该特定的实例永远不会被恢复,所以系统避免了调用它。 当onPause()被调用而不是onSaveInstanceState(Bundle)时的一个例子是当活动B在活动A前面被启动时:如果活动A在B的生命周期内没有被终止,系统可以避免在活动A上调用onSaveInstanceState(Bundle) A的用户界面状态将保持不变。

所以这是默认的实现..

默认实现通过在具有id的层次结构中的每个视图上调用onSaveInstanceState(),并通过保存当前焦点视图的ID(所有视图都由onRestoreInstanceState(Bundle)的默认实现)。 如果重写此方法以保存未被每个视图捕获的附加信息,则可能需要通过默认实现调用,否则应准备好保存每个视图的所有状态。

 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()保存了以前保存的实例时,才会调用此callback函数。 我们可以在onCreate()中恢复一些状态,而我们可以select在这里恢复其他状态,在onStart()完成后可能可用。 // savedInstanceState Bundle与onCreate()中使用的Bundle相同。

 @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); }