Android Activity---保存Activity的状态

来源:互联网 发布:js设置超链接不可点击 编辑:程序博客网 时间:2024/04/29 20:23
在介绍管理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

原创粉丝点击