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()方法不会被执行。
(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()方法不会被执行。
相关文章推荐
- Android AsyncTask异步处理消息机制
- 如何成为安卓软件开发工程师?
- AndroidStudio 打包及引用aar
- [Android] AS 中 Gradle 配置运行浅析
- Android热补丁动态修复技术(四):自动化生成补丁——解决混淆问题
- android学习笔记——关于Activity的启动模式(更新)
- Android事件传递机制解析
- Gradle for Android 第七篇( Groovy入门 )
- Gradle for Android 第六篇( 测试)
- Android 动画特效集合
- Android TextView加上阴影效果
- Gradle for Android 第四篇( 构建变体 )
- Gradle for Android 第五篇( 多模块构建 )
- Gradle for Android 第三篇( 依赖管理 )
- android跨进程事件注入(程序模拟用户输入)
- Gradle for Android 第一篇( 从 Gradle 和 AS 开始 )
- Android Studio使用新的Gradle构建工具配置NDK环境
- [ROM] 最新版20150522秋大5.1.1谷歌服务包+谷歌帐号无法登录解决方法
- 在android studio下怎么引入android framework来使用隐藏的api
- Android广播(BroadcastReceiver)