首页 > 解决方案 > 更新具有相同值的键时如何强制 SharedPreferenceChangeListener 通知

问题描述

SharedPreferenceChangeListener当 db 使用相同的值更新时,可以(并且确实!)跳过通知,例如booleantrueto的值true。实际上,当值更改为不同的值时,您会收到通知。

如何获得有关每个 SharedPreference 键/值更新的通知?

标签: androidsharedpreferences

解决方案


简单、幼稚的解决方案是删除SharedPreferences 中存在的键/值对。请记住忽略. SharedPreferenceChangeListener当删除值和插入新值时,您会收到通知。

签出preferenceManager.remove(key)

open class MyBasePreferences : KoinComponent {

    val context: Context by inject()
    val preferenceManager: SharedPreferences = PreferenceManager.getDefaultSharedPreferences(context)

    /**
     * Saves primitive value to shared preferences
     */
    fun SharedPreferences.save(key: String, value: Any?) {
        if (value == null)
            throw RuntimeException("Trying to save null value!")

        if (preferenceManager.contains(key))
            preferenceManager.remove(key)
        preferenceManager.edit {
            when (value) {
                is String -> putString(key, value)
                is Long -> putLong(key, value)
                is Boolean -> putBoolean(key, value)
                is Int -> putInt(key, value)
                is Float -> putFloat(key, value)
                else -> throw RuntimeException("Type not supported in Preferences!")
            }
        }
    }
}

自定义SharedPrefChangeListener

class MySharedPrefChangeListener : SharedPreferences.OnSharedPreferenceChangeListener, KoinComponent {

    /**
     * Called when a shared preference is changed, added, or removed.
     */
    override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) {
        if (sharedPreferences == null)
            return

        if (sharedPreferences.contains(key)) {
            when (key) {
                "YOUR_KEY" -> {
                    // action to perform
                }
            }
        }
    }
}

App 类内部:

/**
 * Main application class
 */
class MyApp : Application(), KoinComponent {

    var preferenceManager: SharedPreferences? = null
    var prefChangeListener: MySharedPrefChangeListener? = null

    override fun onCreate() {
        super.onCreate()

        preferenceManager = PreferenceManager.getDefaultSharedPreferences(this)
        prefChangeListener = MySharedPrefChangeListener()
        preferenceManager?.registerOnSharedPreferenceChangeListener(prefChangeListener)
    }
}

推荐阅读