onSaveInstanceState(Bundle)与onRestoreInstanceState(Bundle)的触发场景有哪些?
关于
onSaveInstanceState(Bundle)和onRestoreInstanceState(Bundle)的触发场景 嘿,除了你观察到的屏幕旋转,这两个方法在Android组件生命周期的不少场景下都会被调用,我给你详细梳理下:
一、onSaveInstanceState(Bundle)的触发场景
- 系统后台回收内存时:当你的App处于后台状态,系统因为内存紧张需要清理进程时,会先调用这个方法让你保存页面的临时状态。比如你开了一堆App,你的App被挤到后台,系统可能会杀掉它的进程,这时候就会触发该方法,方便后续用户返回时恢复状态。
- Activity被全屏遮挡时:比如弹出系统权限请求弹窗、或者打开一个Theme为Dialog的Activity,原Activity会进入暂停状态,系统会调用
onSaveInstanceState来保存当前状态。 - 多种设备配置变更场景:不止屏幕旋转,像设备语言切换、系统字体大小调整、折叠屏展开/收起、插入外接显示器这类配置变化,只要你没在Manifest里给Activity指定
android:configChanges拦截这些变化,系统都会销毁并重建Activity,这时候就会触发onSaveInstanceState。 - 切换到多窗口模式:把App切换成分屏或自由窗口模式时,Activity尺寸发生大幅变化,系统会重建Activity,触发该方法。
- 用户按下Home键返回桌面:此时Activity进入后台,系统会调用
onSaveInstanceState保存当前状态,防止后续被回收后无法恢复。
二、onRestoreInstanceState(Bundle)的触发场景
这个方法的触发时机是当Activity被系统销毁后重新创建时,对应上面onSaveInstanceState触发的所有场景——只要系统销毁了Activity又重新创建它,就会调用这个方法来恢复之前保存的状态。这里有两个细节要注意:
- 它的调用时机在
onStart()之后、onResume()之前;和onCreate(Bundle)读取状态的区别是,onCreate里的Bundle可能为null(比如Activity第一次创建),而onRestoreInstanceState只有在确实有状态需要恢复时才会被调用。 - 如果用户主动销毁Activity(比如按下返回键),系统不会调用
onSaveInstanceState,自然也不会触发onRestoreInstanceState——毕竟用户明确要关闭页面,没必要保存状态。
最后补个小提醒:onSaveInstanceState主要用来保存临时非持久化状态,比如输入框文本、RecyclerView滚动位置这类;持久化数据(比如用户设置、已保存的内容)应该用数据库或SharedPreferences存储,别依赖这个方法,因为系统不保证在所有崩溃场景下都能来得及调用它。
内容的提问来源于stack exchange,提问作者kevin godfrey
相关产品推荐
相关产品推荐

