Activity数据保存探索

在开发中发现一个问题:当一个我通过Intent开启一个前面已经打开的activty的界面时, 新打开的activity的状态会丢失。当时,当我直接按home减将acitvity置于后台,然后重新打开这个activity的时候,发现此时的activity的状态是退出之前的状态。但是,我现在我想达到的目的是,不管是以什么方式打开这个活动,我都想要他恢复到之前的acitvity状态,而不是新开一个新的a
摘要由CSDN通过智能技术生成

在开发中发现一个问题:当一个我通过Intent开启一个前面已经打开的activty的界面时,
新打开的activity的状态会丢失。当时,当我直接按home减将acitvity置于后台,然后重新打开这个activity的时候,发现此时的activity的状态是退出之前的状态。但是,我现在我想达到的目的是,不管是以什么方式打开这个活动,我都想要他恢复到之前的acitvity状态,而不是新开一个新的activity。于是针对这现象,我寻求解决方案。

利用onSaveInstanceState和onRestoreInstanceState

在发现这个问题之后,我的第一感觉就是利用activity中的onRestoreInstanceState方法在打开新的activity时将保存的数据读取并写入到新的activity中,实现的原理就是我之前说的按下home键重新打开activity能恢复到原来的activity状态的原理。在这里我将展开讲解activity中数据的保存机制。

activity的生命周期

要想完全理解activity中的储存机制,就必须对activity的生命周期非常熟悉,在这里我就简单介绍一下acttivity的生命周期。这里直接给出一张官方的activity生命周期图:
官方描述
这里写图片描述

如果对activity的生命周期还是不太了解,可以参考我后面代码里面对每个activity周期的方法的注释。这里就不做过多的解释。

### acitvity中的数据储存机制

当一个activity被paused或者stopped时,activity的状态可以被保存。 的确如此,因为 Activity 对象在paused或者stopped时仍然被保留在内存之中——它所有的成员信息和当前状态都仍然存活。 这样用户在activity里所作的改动全都还保存着,所以当activity返回到前台时(当它“resume“),那些改动仍然有效。
不过,如果系统是为了回收内存而销毁activity,则这个 Activity 对象就会被销毁,这样系统就无法简单地resume一下就能还原完整状态的activity。 如果用户要返回到这个activity的话,系统必须重新创建这个Activity 对象。可是用户并不知道系统是先销毁activity再重新创建了它的,所以,他很可能希望activity完全保持原样。 这种情况下,你可以保证activity状态的相关重要信息都由另一个回调方法保存下来了,此方法让你能保存activity状态的相关信息: onSaveInstanceState()。
在activity变得很容易被销毁之前,系统会调用 onSaveInstanceState()方法。 调用时系统会传入一个Bundle对象, 你可以利用 putString() 之类的方法,以键值对的方式来把activity状态信息保存到该Bundle对象中。 然后,如果系统杀掉了你的application进程并且用户又返回到你的activity,系统就会重建activity并将这个 Bundle 传入onCreate() 和onRestoreInstanceState() 中,你就可以从 Bundle 中解析出已保存信息并恢复activity状态。如果没有储存状态信息,那么传入的 Bundle 将为null(当activity第一次被创建时就是如此)

这里在给出官方的图片来说明activity状态的存储官方图片这里写图片描述
或许这个能更加直观的表现 onSaveInstanceState()和onRestoreInstanceState()的调用调用顺序

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值