Activity学习小结

来源:互联网 发布:淘宝 大麦网 编辑:程序博客网 时间:2024/05/01 00:47

保存Activity状态-Saving activity state

在管理Activity生命周期中提到当Activity暂停或者停止的时候,会保留Activity状态,这是成立的,因为当他暂停或者停止的时候,内存中仍然有Activity 对象,并且包含成员信息和当前的状态,因此,在用户模式下的任何对Activity的操作,在Activity返回到前台的时候将被还原("恢复状态")。


然而,系统为了回收资源而销毁 Activity,这时系统不能简单地恢复到之前的完整状态。相反,如果用户返回到Activity,系统必须重新创建Activity 对象 ​​。此时,用户并不关系系统销毁Activity,并重新创建它。用户此时更关系Activity是否能恢复到所期望的状态。在这种情况下,要保证有关Activity状态的重要信息是通过实现一个叫做 onSaveInstanceState() 辅助回调函数来完成的,它允许你保存Activity的状态信息。


在Activity变得不太稳定的前,系统调用 onSaveInstanceState() 。该系统传递给其一个 Bundle,您可以在其中以名称-值对的形式保存为有关Activity的状态信息,如使用方法 putString() 和 putInt() 。然后,如果系统kill你的应用进程,当用户返回Activity,系统重建Activity时,系统会同时传给 onCreate() 和 onRestoreInstanceState() Bundle 。使用这两种方法,你可以从 Bundle 提取到保存的状态信息来恢复Activity。如果没有恢复的状态信息, Bundle传递的是空(首次创建Activity的情况)。

restore_instance.png

图2。按照状态的完整性,Activity有两种方式返回到用户的焦点:要么Activity被销毁,然后重新创建Activity,必须要恢复以前保存的状态。或停止Activity,然后恢复,这时Activity保持状态的完整。

注:Activity被销毁之前不保证 onSaveInstanceState() 会调用,因为有情况下,它不需要保存状态(例如,当用户使用“后退“ 按钮离开Activity的时候,因为用户已明确关闭的Activity)。如果是系统调用 onSaveInstanceState() ,那么他会在 onStop()前也可能在 onPause()前调用 。

然而,即使你什么也不做,也不实现 onSaveInstanceState() ,某些Activity状态恢复会使用 Activity类的默认onSaveInstanceState() 实现 。具体来说,默认实现对于布局中的每个 视图 - View 调用相应的onSaveInstanceState() 方法,它允许每个视图提供保存自身的相应信息。几乎在Android框架每一个部件都会适当的实现此方法,这样,当重新创建Activity时候任何UI的变化将自动保存和恢复 。例如, EditText 控件保存由用户输入和任何文字, CheckBox控件保存它是否检查。对于你要保存其状态每一个部件, 你所需要做的唯一的工作是提供一个唯一的ID(使用 layout-resource.html#idvalue android:id 属性)。一个组件,如果没有一个ID,系统无法保存其状态。

您还可以显式阻止布局视图保存其状态,通过设置android:saveEnabled 属性为“false”或调用 setSaveEnabled() 方法。通常情况下,你不应该禁他,但如果您想使你的Activity恢复状态时有不同UI效果就启用它。


虽然默认onSaveInstanceState() 实现保存有关Activity UI的有用信息,你仍可能需要重写它,以保存更多的信息。例如,在Activity中你可能需要在成员变量值发生改变时保存他们。 (可能在UI恢复时需要关联这些值,但默认情况下,拥有UI值的的成员都不会被还原)。

由于onSaveInstanceState() 的默认实施能保存UI的状态,如果要为保存额外的状态信息而重写此方法,那么在做任何工作之前,你一定要在实现onSaveInstanceState()之前调用其超类方法。同样,如果你重写它,你也应该调用onRestoreInstanceState()实现的超类方法,以此默认实现恢复视图状态。

注:因为 onSaveInstanceState() 不能保证被调用,所以当用户离开Activity,你应该只使用它记录Activity的瞬时状态(UI的状态),你不应该用它来​​存储持久数据。相反,你应该使用 onPause() 存储持久数据(如保存到数据库中的数据)。

测试您的应用程序恢复其状态的能力的一个好方法是简单地旋转装置,使屏幕的方向变化。当屏幕方向的变化,系统的销毁并重新创建Activity,对于新的屏幕配置替换资源。因此,当被重建时,您的Activity完全恢复其状态时就非常重要了,因为用户经常在使用应用程序时旋转屏幕。


生命周期很好的定义了回调顺序,特别是在同一进程中两个Activity中,一个启动另外一个的时候。如下是当Activity A 启动Acivity B是产生的操作顺序:


1.ActivityA执行 onPause()()方法。

2.ActivityB 按照 onCreate() , OnStart() , onResume()的顺序执行方法。(ActivityB现在取得用户的焦点。)

3.然后,如果ActivityA 已不再是显示在屏幕上,它执行方法 onStop()


这个可预测的生命周期回调顺序,可让您管理的从一个Activity到另一个Activity的转换信息。例如,如果第一个Activity停止时你必须写数据库 , 让之后的Activity 读取数据库,那么你应该在 onPause()期间写数据库而不是 onStop()


0 0