You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 11:13:13