Android的四大组件之三--Activity(2)----->onSaveInstanceState的运用

当横竖屏切换,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状态你在控件时候保存的状态。如果没有信息被保存,传递给onCreate()的Bundle是null。

  一般情况,系统会自动保存个控件的状态。惟一要求你做得工作是提供一个惟一的ID(通过android:id属性)给每一个希望保存状态的控件。如果一个widget没有ID,那么 它不保存它的状态。

  注意:不保证onSaveInstanceState()将会被调用在你的activity被摧毁前因为有不需要存储的情况存在(例如当用户离开你的activity,用户显示的结束)。

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

 

onSaveInstanceState()如果被调用,这个方法会在onStop()前被触发,但系统并不保证是否在onPause()之前或者之后触发

调用了onPause(),未必会调用onSaveInstanceState(),这个一定注意,所以安全起见,做好在onPause()的时候保存数据。。。


总结:onSaveInstanceState()被调用的情形:

 1、当用户按下HOME键时。 这是显而易见的,系统不知道你按下HOME后要运行多少其他的程序,自然也不知道activity A是否会被销毁,故系统会调用onSaveInstanceState,让用户有机会保存某些非永久性的数据;

2、长按HOME键,选择运行其他的程序时; 

3、按下电源按键(关闭屏幕显示)时; 

4、从activity A中启动一个新的activity时;

5、屏幕方向切换时,例如从竖屏切换到横屏时。 在屏幕切换之前,系统会销毁activity A,在屏幕切换之后系统又会自动地创建activity A;


onSaveInstanceState的调用遵循一个重要原则:即当系统“未经你许可”时销毁了你的activity,则onSaveInstanceState会被系统调用,这是系统的责任,因为它必须要提供一个机会让你保存你的数据。


有问题请留言或发邮件。。。。。谢谢


邮箱地址:ligexiao@gmial.com


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值