一些设备配置在运行过程中可能会发生改变(例如屏幕横向布局、键盘可用性和语言),当这样的变化发生时,Android会重新启动这个正在运行的Activity(onDestory()方法会被调用,然后调用onCreate()方法)。这个重启的动作是为了通过自动往应用程序中载入可替代资源,从而使应用适应新的配置。


     (1)重建Activity


     如果因为系统资源紧张而导致Activity被销毁,用户在返回这个Activity时,系统会使用那些保存的记录数据来重新创建一个新的Activity实例。那些被系统用来恢复之前状态而保存的数据叫做“Instance State”,它是一些存放在Bundle对象中的键值对。


     默认情况下,系统使用Bundle实例来保存每一个视图对象中的信息。因此,如果Activity被销毁并被重建,那么布局的状态信息会自动恢复到之前的状态。然而,Activity可能存在更多需要恢复的状态信息,如记录用户进程的成员变量。为了可以保存额外更多的数据到Instance State ,在Activity的生命周期里需要一个回调方法onSaveInstanceState()。当用户离开Activity时,系统会调用它来传递Bundle对象,从而可以增加额外的信息到Bundle中,并保存于系统中。如果系统在Activity被销毁之后想重新创建这个Activity实例,之前那个Bundle对象会被传递到Activity的onRestoreInstanceState()方法与onCreate()方法中。




     (2)保存Activity状态


     为了获得Activity被销毁之前的状态,可以执行Activity的onSaveInstanceState()方法。该方法的原型是:

protected  void onSaveInstanceState (Bundle outState)


     Android在Activity有可能被销毁之前调用此方法。它会将一个记录Activity动态状态的Bundle对象传递给该方法。当Activity再次启动时,这个Bundle会传递给onCreate()方法以及在onStart()方法之后调用的onRestoreInstanceState()方法。Activity状态保存的处理机制如下图:




Android 保存当前的状态 安卓navigation 状态保存_Android





     当Activity显示在当前栈的最上层时,其onSaveInstanceState()方法通常在如下几种情况下被执行:


  • 当用户按下Home键时
  • 长按Home键,选择运行其他程序时
  • 按下电源按键(关闭屏幕显示)时
  • 从当前Activity中启动一个新的Activity时
  • 屏幕方向切换时

     因为onSaveInstanceState()方法不总是被调用(如按下返回键而导致的销毁则不会调用),应该仅使用onSaveInstanceState()来记录Activity的临时状态,而不是持久的数据(一般使用onPause()来存储持久数据)


 总之,onSaveInstanceState()的调用遵循一个重要的原则,即当系统“未经许可”时销毁了Activity,则onSaveInstanceState()会被系统调用,这是系统的责任,因为它必须要提供一个机会来保存数据。




     (3)恢复Activity状态


     当Activity在被销毁后进行重建是,可以从系统传递给Activity的Bundle中恢复保存的状态。onCreate()与onRestoreInstanceState()回调方法都接收了同样的Bundle,里面包含了同样的实例状态信息。




     注意,onSaveInstanceState()方法和onRestoreInstanceState()方法不一定是成对地被调用,onRestoreInstanceState()方法被调用的前提是Activity确实被系统销毁了,而如果仅仅是停留在有这种可能性的情况下,则该方法不会被调用。例如,当正在显示Activity时,用户按下Home键返回主屏幕,然后用户紧接着又返回到该Activity,这种情况下Activity一般不会因为内存的原因被系统销毁,故Activity的onRestoreInstanceState()方法不会被执行。