savedInstanceState 是 null 并且 onSaveInstanceState 没有被调用
Posted
技术标签:
【中文标题】savedInstanceState 是 null 并且 onSaveInstanceState 没有被调用【英文标题】:savedInstanceState is null and onSaveInstanceState is not getting called 【发布时间】:2021-03-17 19:49:04 【问题描述】:我已经完成了我的尽职调查并检查了关于 SO 的所有答案,纳入了建议,但由于某种原因,没有调用保存和恢复的方法。
一个答案建议我应该在活动级别保存以便调用片段保存状态,所以这是我的活动
class MyActivity: AppCompatActivity()
override fun onCreate(savedInstanceState: Bundle?)
super.onCreate(savedInstanceState)
setContentView(R.layout.my_layout)
supportActionBar?.title = "My App"
// not called
override fun onSaveInstanceState(outState: Bundle, outPersistentState: PersistableBundle)
super.onSaveInstanceState(outState, outPersistentState)
// not called
override fun onSaveInstanceState(outState: Bundle)
super.onSaveInstanceState(outState)
// not called
override fun onRestoreInstanceState(savedInstanceState: Bundle)
super.onRestoreInstanceState(savedInstanceState)
我的片段如下。
class MyFragment: Fragment()
// savedInstanceState is null
override fun onCreate(savedInstanceState: Bundle?)
super.onCreate(savedInstanceState)
// savedInstanceState is null
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View
// not getting called.
override fun onSaveInstanceState(bundle: Bundle)
super.onSaveInstanceState(bundle)
bundle.putSerializable("users", arrayListOf()) // user array
所以不确定我在这里缺少什么来保存和恢复状态。
我如何测试?我按返回按钮返回主屏幕,将应用程序推到后台,然后将其带到前台。
【问题讨论】:
【参考方案1】:在android中,onSaveInstanceState()
会被系统调用来保存activity的当前状态,以确保当用户恢复应用时他们会看到之前离开时的activity(通过调用onRestoreInstanceState()
来恢复状态活动)。它会在以下情况下被调用:
用户从一个活动转移到另一个活动
用户按下 Home 键将应用程序置于后台
当配置改变时,比如用户旋转手机或改变语言等。
在你的情况下,因为你按下了返回键,所以系统知道你想离开活动,所以不需要保存那个活动的状态,这就是为什么你永远看不到 onSaveInstanceState()
和 onRestoreInstanceState()
得到调用。
【讨论】:
一点改进,按下主页按钮(而不是返回)片段的onSaveInstance
被调用,但我在哪里再次读取/恢复片段中的值?
在片段中,您可以从 onCreate(Bundle)
、onCreateView(Inflater, ViewGroup, Bundle)
或 onViewCreated(View, Bundle)
中的 bundle 中提取数据。
如果没有要恢复的状态,即Activity
开始“新鲜”,onCreate
中的Bundle
也将为空。这基本上发生在用户有意离开活动时,包括点击后退按钮(退出它)或在任务切换器中滑动应用程序(显式关闭它)
@AppDeveloper 可以通过 go 开发者选项-> 开启不保留活动来模拟系统保存和恢复活动的情况。然后打开应用程序 -> 按 Home 将应用程序带到后台 -> 从后台打开应用程序。
转到System -> Advanced -> Developer options
以上是关于savedInstanceState 是 null 并且 onSaveInstanceState 没有被调用的主要内容,如果未能解决你的问题,请参考以下文章
重新创建我的活动时,为啥我的 savedInstanceState 为 Null?
Android savedInstanceState 总是返回 null
android savedinstancestate null啥原因
Android 生命周期,解决savedInstanceState一直为null的问题