onSaveInstanceState & onRestoreInstanceState

Android 已经为activity的恢复做了大部分能做的,主要是ui部分,有id的,那如果想恢复自己的一些东西就需要自行操作了,但是不要忘记调用super的save,否则你需要保存所有ui的状态

1.onSaveInstanceState(onCreate/onRestoreInstanceState中的Bundle就是它传进去的)

调用时机 : Activity 容易被销毁的时候调用, 注意是容易被销毁, 也可能没有销毁就调用了;

按下Home键 : Activity 进入了后台, 此时会调用该方法;
按下电源键 : 屏幕关闭, Activity 进入后台;
启动其它 Activity : Activity 被压入了任务栈的栈底;
横竖屏切换 : 会销毁当前 Activity 并重新创建;

onSaveInstanceState方法调用注意事项 :
 用户主动销毁不会调用 : 当用户点击回退键 或者 调用了 finish() 方法, 不会调用该方法;
调用时机不固定 : 该方法一定是在 onStop() 方法之前调用, 但是不确定是在 onPause() 方法之前 还是 之后调用;
布局中组件状态存储 : 每个组件都 实现了 onSaveInstance() 方法, 在调用函数的时候, 会自动保存组件的状态, 注意, 只有有 id 的组件才会保存;
关于默认的 super.onSaveInstanceState(outState) : 该默认的方法是实现 组件状态保存的;

为什么这样的?当然也是源码决定的,有finish动作的就不保存,为什么这么设计?人性角度,主动finish的为何还要保留呢

2. onRestoreInstanceState

onCreate的Bundle可能是空,如果在这里恢复数据,一定要判空处理(第一次起肯定是空呀)

onRestoreInstanceState中的Bundle一定不是空的,因为它一定是activity销毁以后再重建才会被调用的

还有一点区别,onCreate必须调用super

3.调用时机

onSaveInstanceState一定是在onStop前,但是不是onPause后?可能不是  源码为证

onRestoreInstanceState是在onStart之后调用的(一定是重建才调用)

啥时activity销毁呢?

一是自行销毁,按back键,或者code调用finish

二是被动的,比如系统内存不足,回收长期处于stop状态的activity

三屏幕旋转等

4.既然onPause只能保存不耗时的一些数据操作(因为onPause时去显示另外的activity,否则导致卡顿),耗时数据保存放在哪里呢?onPause只适合做一些轻量级的操作,更多的耗时耗资源的操作还是要放在onStop里面,比如说对数据保存,需要用到的数据库操作

那接着又出来问题了,onStop可能不会被调用啊,比如内存回收和透明。透明不需要考虑,如果是内存回收呢?同样onSvaeInstanceState也是不一定调用的,所以onPause还是最好的持久化数据保存地,如果非要纠结耗时数据保存onStop,3.0以后貌似onStop之前应用不会被杀死,但是onStop是可以被杀死的,可能没保存数据就被杀,最好还是onSaveInstanceState吧

参考https://blog.csdn.net/u011068702/article/details/70217576/

猜你喜欢

转载自blog.csdn.net/jianpan_zouni/article/details/84545441
今日推荐