Android中Activity由于内存不足被回收,临时数据和状态如何保存

Activity被回收了怎么办?

场景:应用中有一个Activity A,用户在Activity A的基础上启动了Activity B,Activity A就进入了 停止状态,这个时候由于系统内存不足,将Activity A回收掉了然后用户按下Back键返回 Activity A,会出现什么情况呢?其实还是会正常显示Activity A的,只不过这时并不会执行 onRestart()方法,而是会执行Activity A的onCreate()方法,因为Activity A在这种情况 下会被重新创建一次。

问题:Activity A中是可能存在临时数据和状态的。打个比方,MainActivity中如果有一个文本输入框,现在你输入了一段文字,然后启动 NormalActivity,这时MainActivity由于系统内存不足被回收掉,过了一会你又点击了Back键 回到MainActivity,你会发现刚刚输入的文字都没了,因为MainActivity被重新创建了。

解决放案

第一步:Activity中提供了一个onSaveInstanceState()回调方法,这个方法可以保证在 Activity被回收之前一定会被调用,因此我们可以通过这个方法来解决问题。onSaveInstanceState()方法会携带一个Bundle类型的参数,Bundle提供了一系列的方法 用于保存数据,比如可以使用putString()方法保存字符串,使用putInt()方法保存整型数 据,以此类推。每个保存方法需要传入两个参数,第一个参数是键,用于后面从Bundle中取 值,第二个参数是真正要保存的内容。

override fun onSaveInstanceState(outState: Bundle) {
 super.onSaveInstanceState(outState)
 val tempData = "Something you just typed"
 outState.putString("data_key", tempData)
}

第二步:在**onCreate()**方法其实也有一个Bundle类型的参数。这个参数在一般情况下都是 null,但是如果在Activity被系统回收之前,通过onSaveInstanceState()方法保存数据,这个参数就会带有之前保存的全部数据,我们只需要再通过相应的取值方法将数据取出即可。

override fun onCreate(savedInstanceState: Bundle?) {
     super.onCreate(savedInstanceState)
     Log.d(tag, "onCreate")
     setContentView(R.layout.activity_main)
     if (savedInstanceState != null) {
     val tempData = savedInstanceState.getString("data_key")
     Log.d(tag, "tempData is $tempData")
     }
     ...
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
当后台的Activity由于系统回收而被销毁时,我们可以通过保存状态的方法来在Activity被重新创建时恢复之状态。以下是一些保存和恢复Activity状态的常用方法: 1. onSaveInstanceState() 和 onRestoreInstanceState() 方法: - 在Activity被销毁之,系统会调用 onSaveInstanceState() 方法。我们可以在该方法保存需要恢复的数据到 Bundle 对象。 - 在Activity重新创建后,系统会调用 onRestoreInstanceState() 方法,并将之保存的 Bundle 对象作为参数传递给该方法。我们可以从 Bundle 恢复之保存数据,并进行相应的处理。 2. 使用 SharedPreferences: - 在 Activity 的 onDestroy() 方法,将需要保存状态数据存储到 SharedPreferences 。 - 在 Activity 的 onCreate() 方法,从 SharedPreferences 读取数据,并进行恢复。 3. 使用数据库或文件存储: - 在 Activity 的 onDestroy() 方法,将需要保存状态数据存储到数据库或文件。 - 在 Activity 的 onCreate() 方法,从数据库或文件读取数据,并进行恢复。 需要注意的是,以上方法并不能保证在所有情况下都能完全恢复 Activity状态。在某些极端情况下,如系统内存严重不足或用户主动关闭应用等情况下,Activity 可能无法被恢复到之状态。因此,除了保存和恢复 Activity 状态外,还应该设计合理的应用程序结构和逻辑,以确保用户体验的连贯性。 另外,为了最大程度地减少 Activity 被系统回收的可能性,可以考虑使用一些优化措施,如避免在后台长时间占用内存的操作、使用合理的资源释放策略等。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值