【问题标题】:savedInstanceState is null and onSaveInstanceState is not getting calledsavedInstanceState 是 null 并且 onSaveInstanceState 没有被调用
【发布时间】: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
    }
}

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

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

【问题讨论】:

    标签: android kotlin android-activity fragment state


    【解决方案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
    猜你喜欢
    • 2023-03-15
    • 2015-03-28
    • 2013-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-24
    • 1970-01-01
    相关资源
    最近更新 更多