Android sharedPreferences未使用commit / apply / clear保存

时间:2018-03-21 16:41:36

标签: java android serialization kotlin sharedpreferences

我正在尝试在我的应用关闭时保存TextView的文字内容,因此我尝试在onDestroy方法中保存该信息,然后将其设置在onCreate中方法。

我编写了以下两个函数来摆脱在共享首字母中获取和放置值的样板:

fun MainActivity.putStringInPrefs(prefsFile: String, key: String, value: Any) =
    getSharedPreferences(prefsFile, Context.MODE_PRIVATE)
            .edit()
            .putString(key, value.toString())
            .apply()

fun MainActivity.getStringFromPrefs(prefsFile: String, key: String, default: Any = "") : String =
    getSharedPreferences(prefsFile, Context.MODE_PRIVATE).getString(key, default.toString())

当应用程序关闭时,这就是所谓的:

override fun onDestroy() { 
        super.onDestroy()
        log("OnDestroy!")
        putStringInPrefs(mainPrefsFile, "lastSelectedItemDescription", textViewItemDetailsTextView.text) }

log只是Log.d("", "string")

的包装

onCreate中,这被称为:

 override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState) ; log("OnCreate!")
            setContentView(R.layout.activity_main)

            // Set up the item details text view
            textViewItemDetailsTextView.text = getStringFromPrefs(mainPrefsFile, "lastSelectedItemDescription", detailsText)

问题在于,无论我做什么,都不保存首选项,并且始终在onCreate中返回默认值。我已经尝试了申请和提交,有和没有明确。没有结果。我做错了什么。

2 个答案:

答案 0 :(得分:1)

super.onDestroy()应该是覆盖方法onDestroy()中的最后一行。在执行“破坏性”代码后执行的任何代码上,您可能会遇到意外行为

答案 1 :(得分:1)

Activity状态保存在onDestroy()中并不是一个好主意,因为系统可能会在不调用活动的最终onDestroy()回调的情况下终止托管您活动的进程。 (see docs)。

要保存状态,您可以改用onSaveInstanceState / onRestoreInstanceState。请参阅:Saving and restoring activity state

override fun onSaveInstanceState(outState: Bundle?) {
    outState?.putString(YOUR_TEXT, textView.text)
    super.onSaveInstanceState(outState)
}

override fun onRestoreInstanceState(savedInstanceState: Bundle?) {
    super.onRestoreInstanceState(savedInstanceState)
    if (savedInstanceState != null) {
        textView.text = savedInstanceState.getString(YOUR_TEXT)
    }
}

companion object {
    val YOUR_TEXT = "your_text"
}