savedInstanceState 为 null 且未调用 onSaveInstanceState

savedInstanceState is null and onSaveInstanceState is not getting called

我已经尽职调查并检查了关于 SO 的所有答案,并纳入了建议,但出于某种原因 none 保存和恢复方法被调用。

一个答案建议我应该在 activity 级别保存以便调用片段保存状态,所以这是我的 activity

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)
    }
}

我的Fragment如下

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
    }
}

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

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

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

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

  • 用户按下 Home 键将应用程序带到后台

  • 配置更改时,如用户旋转 phone 或更改语言等

在你的例子中,因为你按下了返回键,所以系统知道你要离开activity,所以不需要保存那个activity的状态,所以你从未见过 onSaveInstanceState()onRestoreInstanceState() 被调用。