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")
}
...
}