持续创造,加速成长!这是我参加「日新计划 10 月更文挑战」的第23天,点击检查活动概况,希望咱们多多支撑,帮忙点个赞,谢谢!
情形与原因
前面的文章说过,我的一个事务要从页面A进入页面B,也就意味着我的使用呈现了在ActivityA的根底上启动了ActivityB的情形,这个时分ActivityA就进入了中止状况,但这个时分假如呈现体系内存不足的情况,就会把ActivityA回收掉,此时用户按下Back键返回A,仍然会正常显示A,但此时的A是执行onCreate()办法加载的,而不是执行onRestart()办法,也便是说咱们的ActivityA页面是被重新创立出来的。
那有什么区别呢,这便是咱们平常网上填表之类的最厌烦的情形会浮现了,比方你好不容易把信息填好,点击下一步,然后发现想修改上个页面信息,哎,这时分你会发现由于体系内存不足回收掉了A,于是你辛辛苦苦填好的信息都没了,这太痛了。这一情形的呈现就说明回收了A再重新创立会导致咱们在A傍边存的一些暂时数据与状况都或许被丢掉。
这便是咱们今天要处理的问题。
处理办法
尽管呈现这个问题是是否影响用户体验的,但处理办法是十分简略的,由于咱们的Activity中还供给了一个onSaveInstanceState()回调办法,它就能够保证在Activity被回收之前必定被调用,而咱们就能够使用这一特性去处理上述问题。
办法介绍
onSaveInstanceState()办法中会携带一个Bundle类型的参数,而Bundle供给了一系列办法用于保存咱们想要的数据,其中如putString()便是用于保存字符串的,而putInt()办法显而易见也是保存整型数据的,而每个保存办法都需求传入两个参数,其中第一个参数咱们称之为键,是用于在Bundle中取值的特定标记,第二个参数是咱们要保存的内容,归于键值对类型,学过数据库的一般都知道。
写法
如下,咱们能够这么去写:
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
val tempData = "your temp data"
outState.putString("data_key", tempData)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
if (savedInstanceState != null) {
val tempData = savedInstanceState.getString("data_key")
}
...
}
在onSaveInstanceState()中保存你想要的数据,在onCreate()中给取出来,这样就不必惧怕再创立的时分数据丢掉了,不过假如是反正屏切换造成数据丢掉仍是按照前文ViewModel的写法更好。
结语
其实根底往往是最容易忽视的,咱们之前光在那说高楼大厦如何建成,但地基并不可靠,所以仍是需求落实到根底上最好。