`
huaxin803
  • 浏览: 113311 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Android Activity---保存Activity的状态

 
阅读更多
在介绍管理Activity生命周期一节中简单的提到,Activity被暂停或终止时,它的状态是被保留的。确实,因为Activity被暂停或终止时它依然被保留在内存中---所有的关于它的成员和当前状态的信息依然存活着,这样Activity中的任何用户模式的改变都被保留以便它返回前台时,那些改变依然存在。

但是当系统为了恢复内存而销毁一个Activity时,这个Activity对象就被销毁了,因此系统不能简单的用它的完整的状态来恢复它。相反,如果用户导航返回到这个Activity了,系统就必须重新创建它。然而,对于被系统销毁的Activity的重建,用户是感知不到的,因此,用户可能预期Activity是先前的状态一样的。在这种情况下,你能够通过实现保存Activity状态信息的回调方法(onSaveInstanceState())来确保Activity的重要信息得到保存。

系统在Activity被销毁之前调用onSaveInstanceState()方法。系统给这个方法传递一个Bundle对象,在这个对象中,能够使用putString()和putInt()等名/值对的方法来保存Activity的状态信息。然后,如果系统杀死了你的应用进程,而用户又导航回到了这个Activity,系统会重建这个Activity,并且给onCreate()和onRestoreInstanceState()方法传递这个Bundle对象。使用这些方法,你能够从Bundle对象中提取你保存的状态信息,并且恢复Activity的状态。如果状态信息没有恢复,那么会传递给你一个Null的Bundle的对象(Activity首次被创建时,这个Bundle对象是Null)。


图2

有两种方法把带有完整状态的Activity返回给用户。在Activity被销毁时,你可以使用前面提到的恢复保存状态的方法来重建Activity,在Activity被终止时,可以恢复并保持Activity的状态。

注:在Activity被销毁之前不能保证onSaveInstanceState()方法被调用,因为有些场景中不需要保存状态(如用户使用“回退”键退出Activity时,因为用户明确的要关闭Activity就不需要保存状态了)。如果系统要调用onSaveInstanceState()方法,可以在onStop()方法和onPause()方法之前调用。

但是,即使你什么也没做并且也没有实现onSaveInstanceState()方法,通过Activity类默认的onSaveInstanceState()方法也能恢复Activity的某些状态。特别是布局中的每个View默认的实现都会调用响应的onSaveInstanceState()方法,它允许每个View提供它自己的应该被保存的信息。在Android框架中几乎每个Widget都对这个方法做了适当的实现,如当用户被重建时,UI的任何可见属性的改变都被自动的保存和恢复。例如,EditText控件保存用户输入的任何文本、CheckBox控件保存是否被Check。需要你做的工作只是给每个要保存状态的可视控件提供一个唯一的ID(使用android:id属性)即可。如果可视控件没有唯一ID,那么系统就不保存它们的状态。

尽管onSaveInstanceState()的默认实现保存了界面中有用的信息,但是你仍然可以重写这个方法来保存额外的信息,如,你可能需要保存Activity生存期间被改变的成员值(在UI中相关的值可能被恢复,但默认情况下,拥有这些UI值的成员不会被恢复)。

因为onSaveInstanceState()方法的默认实现是帮助保存UI的状态,如果为保存额外的状态信息而重写这个方法,你应该在做任何工作之前首先调用其父类的onSaveInstanceState()方法实现。同样如果要重写onRestoreInstanceState()方法,你也应该首先调用这个方法的父类实现,以便默认的实现能够恢复View状态。

注:因为onSaveInstanceState()不保证被调用,因此你应该只使用它来记录Activity的状态变换(用户界面的状态),而不要用它来保存持久化数据。相反,在用户离开Activity时,你应该使用onPause()方法来保存持久化数据(如应该保存到数据库中的数据)。

测试应用程序恢复它们状态的一个好方法是简单的旋转设备,让设备的屏幕改变方向。当屏幕的方向改变时,系统为了给新的屏幕配置选择有效的应用资源会销毁Activity并且重建一个新的Activity。仅仅因为这个原因,在Activity被重建时完全恢复它们的状态是至关重要的,因为用户在使用应用程序时会经常旋转屏幕。


注:本人转载系个人觉得翻译的很好,值得收藏,且自己回头看着方便。

如有兴趣请访问作者官方博客http://blog.csdn.net/FireOfStar

分享到:
评论

相关推荐

    重建Activity-Recreating an Activity

    Activity的生命周期是管理Activity状态的一系列方法,确保在不同情况下能正确地保存和恢复用户的进度。在Activity生命周期中,重建(Recreating an Activity)是一个重要的概念,涉及到Activity因不同原因被销毁...

    android activity状态保存

    本示例将讲解如何在Android中实现类似网易贴吧Activity状态的保存和恢复。 首先,理解Activity生命周期中的关键方法: 1. `onSaveInstanceState(Bundle outState)`: 当系统准备销毁Activity时调用此方法,可以在...

    Android基础-2(Activity)

    这个主题“Android基础-2(Activity)”深入讲解了Activity的关键概念,包括其创建、注册、启动、关闭以及生命周期,同时也关注了如何在特定时刻保存Activity的状态。下面将详细阐述这些知识点。 首先,创建一个...

    android FragmentActivity 保存fargment状态

    FragmentActivity在处理多个Fragment的交互、管理以及状态保存方面提供了便利。本篇将深入探讨如何在FragmentActivity中实现Fragment状态的保存,特别是针对ListView滚动位置的保存。 一、Fragment生命周期与状态...

    android API-DEMOS中文解析文档

    深入介绍了如何保存和恢复Activity的状态,这对于处理旋转屏幕等情况非常有用。 #### 2.15 App->Activity->SetWallpaper 解释了如何设置设备壁纸的方法。 #### 2.16 App->Activity->Translucent 探讨了如何创建半...

    Android开发 - Activity生命周期

    此时,Activity不会接收任何用户输入,大部分状态会被保存。 6. **销毁(Destroyed)**:系统可能会因为内存不足或其他原因销毁Activity,调用`onDestroy()`。此外,开发者也可以手动销毁Activity。 Activity的...

    Android Activity生命周期

    在 onPause() 方法中,我们可以保存 Activity 的状态,例如保存游戏的进度。 此外,Activity 生命周期还与其他组件的生命周期相关,例如 Fragment、Service 等。理解 Activity 生命周期是 Android 开发的基础,掌握...

    Bundle--Android-Activity.rar_android_android activity

    5. Bundle与生命周期:当Activity被系统销毁(如屏幕旋转)并重建时,onCreate()方法会被再次调用,但之前传递的Intent和其中的Bundle仍然可用,保存了Activity的状态。因此,Bundle也被用于在配置更改时恢复...

    activity-lifecycle.zip

    此外,Android还提供了`onSaveInstanceState()`方法,用于在Activity被销毁前保存关键状态,以防用户意外离开或系统强制关闭Activity时能恢复之前的状态。 总的来说,`activity-lifecycle.zip`文件可能包含了一系列...

    android-activity_学习资料

    当另一个Activity被打开或设备状态改变时,当前Activity会被暂停(onPause())和停止(onStop()),这时需要保存临时数据。如果系统资源紧张,Activity可能被彻底销毁(onDestroy()),但通常会保存状态,以便将来恢复。 ...

    android Activity 详述 demo

    当Activity被系统销毁(如屏幕旋转)时,可以使用`onSaveInstanceState(Bundle)`保存当前状态,然后在`onCreate(Bundle)`或`onRestoreInstanceState(Bundle)`中恢复。 在"ActivityDemo"项目中,开发者通常会创建一...

    基于AndroidStudio的activity-lifecycle示例,Google网站上外国人写的,真是好!

    Activity的生命周期是Android系统管理Activity状态的关键概念,对于理解和优化应用性能至关重要。本示例是Google网站上的一个教程,由外国人编写,专注于讲解Activity生命周期的各种阶段和如何在Android Studio中...

    暂停和恢复Activity-Pausing and Resuming an Activity

    总的来说,处理好Activity的暂停和恢复状态对于保证Android应用的性能和用户体验至关重要。开发者应该在onPause()和onResume()这两个生命周期回调方法中进行适当的资源管理,确保应用的高效运行和快速响应。

    Android-StatedFragment-保存Fragment的状态

    在Android应用开发中,Fragment是Activity的一个模块化组件,它可以在Activity中添加、移除或替换,以实现更复杂的用户界面。然而,当用户离开一个Activity或者设备发生配置更改(如屏幕旋转)时,Fragment的状态...

    Android的Activity周期测试

    二、Activity状态转换测试 测试Activity生命周期通常通过模拟不同的用户操作和系统行为来观察回调方法的执行情况。例如,启动新Activity、按下Home键、收到来电、设备旋转等场景。通过Logcat记录各个回调方法的执行...

    Android Activity内嵌Fragment,当Activity recreate时Fragment被添加多次,造成界面重叠

    当Activity重建时,这些保存的状态可以帮助我们正确地管理Fragment。 为避免Fragment被多次添加,我们可以采取以下策略: 1. 在`onSaveInstanceState(Bundle outState)`方法中,保存Fragment的重要状态。 2. 在`...

    android各组件详解-activity

    2. **Activity状态**: - **Active**:当Activity位于栈顶且完全可见时,处于此状态。 - **Paused**:当另一个透明Activity或对话框覆盖部分Activity时,处于此状态。 - **Stopped**:当Activity完全被另一个...

    android activity 生命周期详细介绍

    此时系统可能保存Activity的状态信息,以便在必要时恢复Activity。此方法通常用于释放CPU密集型资源。 #### 5. onStop() 当Activity不再可见时调用此方法,即从暂停状态变为停止状态。此时Activity对用户来说是不...

    activity-lifecycle

    9. 保存和恢复状态:为了应对系统因资源不足而强制销毁Activity,开发者应使用`onSaveInstanceState(Bundle outState)`来保存临时数据,并在`onCreate(Bundle savedInstanceState)`或`onRestoreInstanceState(Bundle...

    Android 中从activity1跳转到activity2再回到activity所经历的生命周期

    6. **onSaveInstanceState()**: 如果Activity可能被销毁并重新创建,此方法会被调用,以便保存当前状态。 7. **onDestroy()**: 当Activity被永久销毁时调用。这是一个可以进行资源释放的好时机。在示例代码中,没有...

Global site tag (gtag.js) - Google Analytics