旋转屏幕时保留Activity状态报错,无需配置Manifest可行吗?
无需Manifest配置实现Android旋转屏幕状态保存的可行方案
完全可行,
onSaveInstanceState结合onCreate或onRestoreInstanceState是Google官方推荐的、无需修改Manifest的状态保存方案,你出现报错大概率是用法存在问题,常见错误点包括:- 未调用
super.onSaveInstanceState(outState):跳过系统默认的状态保存逻辑,可能导致基础控件状态丢失或触发异常 - 保存了不支持的数据类型:
Bundle仅支持可序列化(Serializable)或可Parcelable(Parcelable)的对象,自定义对象未实现这两个接口会直接报错 - 恢复状态时未判空:直接读取
null的savedInstanceState会引发空指针异常
- 未调用
正确用法示例(以Kotlin为例):
- 保存状态:
override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) // 保存基础数据类型 outState.putString("current_input", editText.text.toString()) // 保存自定义对象(需实现Parcelable接口) outState.putParcelable("user_info", currentUser) } - 恢复状态:
方式一:在onCreate中处理
方式二:重写override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) // 先判断savedInstanceState是否不为空 savedInstanceState?.run { val savedInput = getString("current_input") val savedUser = getParcelable<UserInfo>("user_info") // 恢复UI状态或数据 editText.setText(savedInput) } }onRestoreInstanceStateoverride fun onRestoreInstanceState(savedInstanceState: Bundle) { super.onRestoreInstanceState(savedInstanceState) val savedInput = savedInstanceState.getString("current_input") val savedUser = savedInstanceState.getParcelable<UserInfo>("user_info") editText.setText(savedInput) }
- 保存状态:
进阶方案:如果是复杂页面状态,推荐使用
ViewModel组件,它会自动在屏幕旋转时保留数据,无需手动操作Bundle,同样不需要修改Manifest配置。
内容的提问来源于stack exchange,提问作者Cristian Braga
相关产品推荐
相关产品推荐

