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的问题

Android 生命周期,解决savedInstanceState一直为null的问题

在运行时构建的 Fragment 上始终为 null savedInstanceState(导航视图)