首页 > 解决方案 > savedInstanceState 是 null 并且 onSaveInstanceState 没有被调用

问题描述

我已经完成了我的尽职调查,并检查了所有关于 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
    }
}

所以不确定我在这里缺少什么来保存和恢复状态。

我如何测试?我按下后退按钮到主屏幕以将应用程序推到后台,然后将其带到前台。

标签: androidkotlinandroid-activityfragmentstate

解决方案


在 Android 中,onSaveInstanceState()会被系统调用来保存 Activity 的当前状态,以确保当用户恢复应用程序时,他们会看到之前离开时的 Activity(通过调用onRestoreInstanceState()来恢复 Activity 的状态)。它将在以下情况下调用:

  • 用户从一个活动移动到另一个活动

  • 用户按下 Home 键将应用程序置于后台

  • 配置更改时,例如用户旋转手机或更改语言等。

在你的情况下,因为你按下了返回键,所以系统知道你想离开活动,所以不需要保存那个活动的状态,这就是为什么你永远不会看到onSaveInstanceState()onRestoreInstanceState()被调用的原因。


推荐阅读