​​

简要介绍

很多介绍安卓生命周期的文章,都没有介绍到onSaveInstanceState和onRestoreInstanceState这两个函数,本文专门来介绍一下。

onSaveInstanceState

onSaveInstanceState按照官方解释,是当activity被临时销毁时才执行的。

原文:invoked when the activity may be temporarily destroyed, save the instance state here

但是实际onSaveInstanceState什么时候执行呢?

根据我验证的情况,只要onStop执行,它就会执行。场景包括:应用退到后台、跳转到其他activity。如果实际有出入,可以拍砖哦。

onRestoreInstanceState

onRestoreInstanceState用于恢复之前临时保存的activity状态。而这个又什么时候执行呢?网上介绍这个比较少。

触发时机:

  1. activity被回收
    要模拟资源缺少时系统自动回收是比较困难的,不过可以在开发者选项里打开“不保留活动(Don’t keep activities)”。当activity被切换到后台或者启动新的activity后,原有activity就会被销毁,再次回来时,就会执行onRestoreInstanceState了。
    安卓onSaveInstanceState和onRestoreInstanceState触发时机_bundle
  2. 屏幕旋转、改变系统语言、字体大小变化
    附赠一点知识,如果要防止这些系统变化导致activity重建,可以在manifest增加activity是,设置android:configChanges属性,属性可选值参考 关于android:configChanges的属性 ,样例如下:
<activity
android:name="com.cxyzy.demo.FirstActivity"
android:configChanges="keyboardHidden|orientation"/>

使用场景

因为在上面列的场景下,activity会被销毁重建,有时需要保留界面上的数据,重建时恢复上去。那如何做呢?

  1. onSaveInstanceState中往Bundle里添加数据,下面样例是放了一个字符串jerry,并且指定了key为name。
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
outState.putString("name","jerry")
}

  1. 在onCreate方法中取出来(注意要判空)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
log(tag,savedInstanceState?.getString("key").toString())
}

有意思的是,这个玩法中好像没onRestoreInstanceState啥事,它只是充当了二传手,把onSaveInstanceState保存的数据传递给了onCreate。自己压根不必露面(大老板也都这样,哈哈)。