您的位置:首页 > 移动开发 > Android开发

android学习笔记——保存Activity的状态

2016-04-21 18:06 309 查看
一些设备配置在运行过程中可能会发生改变(例如屏幕横向布局、键盘可用性和语言),当这样的变化发生时,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状态保存的处理机制如下图:



当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()方法不会被执行。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: