Простое, наивное решение состоит в том, чтобы удалить пару ключ / значение, если она существует в 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!")
}
}
}
}
custom 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
}
}
}
}
}
внутри класса приложения:
/**
* 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)
}
}