什么时候调用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); }