Android的四大组件之三--Activity(2)-----关于保存activity状态(onSaveInstanceState()和onRestoreInstanceState()的运用)

当横竖屏切换,activity切换到后台,系统内存不足,关闭了activity的时候,我们想保留一些数据,这时候怎么办呢 ???

下面就围绕这个问题,如何解决这个问题展开讨论。。。。。。。。。。


在上面的生命周期中简单的提到了一个activity被paused和stopped,而activity的状态仍维持。这是因为当它被paused或stopped时,activity对象仍然在内存中--所有的信息关于它的成员变量和当前状态都存在。如此,任何用户的变化在activity中都维持在内存里,所以当activity返回到前景的时候(resume),这些变化仍然存在。

  可是,当系统摧毁一个activity,为了恢复内存,activity对象被摧毁了,所以系统不能简单的以完整状态resume它。代替的是,当用户重新返回到这个activity时,系统重新创建Activity对象。也就是,用户不知道系统摧毁了activity并且再创建了它,如此,可以希望activity是刚才的那个,即所有信息都咩有丢失。在这种情况下,你可以确定重要的信息关于activity的状态被保留通过实现一个额外的回调函数,允许你保存信息关于你的activity,然后恢复它当系统重新创建它的时候。

  这个你可以保存当前状态信息的回调函数是onSaveInstanceState()。系统调这个函数在摧毁activity这前,并且传递一个Bundle对象。Bundle就是你可存在状态信息的地方,采用name-value对,使用方法如putString()。然后,如果系统杀死你的activity进程并且用户浏览回到你的activity,系统传递Bundle给onCreate,这样你就可以恢复activity状态你在onSaveInnstanceState()时候保存的状态。如果没有信息被保存,传递给onCreate()的Bundle是null。

  注意:不保证onSaveInstanceState()将会被调用在你的activity被摧毁前因为有不需要存储的情况存在(例如当用户离开你的activity,用户显示的结束)。如果这个方法被调用,它总是在onStop()前,概率性在onPause()前。


  可是,即使你不做什么事,也不实现 onSaveInstanceState(),一些activity的状态被activity类的默认onSaveInstanceState实现恢复。特别的,默认的View的onSaveInstance()在布局方面,允许每一个视图提供它自己的信息来被保存。几乎所有 的Android框架中的widget实现这个方法合适的,这样任何可见的变化对UI都自己保存并且恢复当你的activity被创建的时候。例如,EditText widget保存任何文本被用户输入的,并且CheckBox widget保存是否选中还是没选中。惟一的工作要求你的是提供一个惟一的ID(通过android:id属性)给每一个希望保存状态的widget。如果一个widget没有ID,那么 它不保存它的状态。

  虽然onSaveInstanceState()的默认实现保存非常有用的信息关于你的activity UI你仍然会需要覆盖它来保存额外的信息。例如,你或许需要保存成员变量在activity生命期间变化的(和保存在UI中的数据有关,但保存这些UI值的变量却不会被默认保存)。

  因为默认的onSaveInstanceState()帮你 你保存UI状态,如果你覆盖这些方法为了保存额外的信息,你应该每次调用父类的实现关于onSaveinstanState()在做工作之前。

  注意:因为onSaveInstanceState()不保证被调用,你应该用它仅用它记录临时状态关于你的activity--应该永远不用它来存储永久性数据。而应该用onPause()来存储永远性数据(例如保存在数据库中的数据)当用户离开activity。

  



横竖屏切换的处理

一些设备配置在运行时改变屏幕的方向(例如屏幕方向,键盘是否可用和语言)。当这样的变化发生时,Android重新开启运行中的Activity(onDestroy()被调用,然后onCreate()被调用)。重启行为被设计来帮助应用程序适应新的配置通过自动加载你的应用程序通过可选的资源,你提供的。如果你设置你的activity合适的操作这个事件,它将更有弹性对生命周期中无法预料的事件。
  最好的方法操作配置变化,例如屏幕方向变,就是简单的预定义你应用程序的状态使用onSaveInstanceState()和onRestoreInstanceState()(或onCreate()),就像前面讨论的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值