SharedPreferences - это способ обмена данными между многими частями вашего приложения.Когда у кого-то есть ссылка на общее предпочтение, он может читать из него что-то вроде этого:
int currlist = prefs.getInt("currlist", 0);
float goal = prefs.getFloat("goaltxt", 0);
Они также могут зарегистрироваться, чтобы получать уведомления об изменении данных:
prefs.registerOnSharedPreferenceChangeListener(this);
ИхМетод onSharedPreferenceChanged
срабатывает, когда кто-то изменяет данные в общих настройках (они, конечно, должны реализовывать интерфейс SharedPreferenceChangedListener
).Не забудьте отменить регистрацию, если вы больше не наблюдаете за набором данных.
Как он узнает, когда изменились настройки?Ну, вы должны получить ссылку на SharedPreferences.Editor
, прежде чем сможете редактировать данные внутри SharedPreferences
, как вы это сделали:
final SharedPreferences.Editor prefsEditor = prefs.edit();
В этот момент вы используете редактор для добавления или обновления некоторыхпеременная, сохраненная в общих настройках:
prefsEditor.putInt("currlist", 1);
И когда вы закончите редактирование, вы фиксируете свои изменения, это уведомит всех слушателей о том, что произошло изменение:
prefsEditor.commit();
Вк этому моменту все зарегистрированные наблюдатели будут уведомлены о том, что произошли изменения в общих настройках (включая ваши собственные!)
Как использовать это:
Когда ваше приложение, действие, служба или что-либо еще запускается, возьмите ссылку на интересующую вас общую настройку, скопируйте все необходимые значения в переменные члена класса и зарегистрируйте себя в качестве наблюдателя.
Не забудьте удалить слушателя, когда ваш класс больше не активен и / или не слушает события изменения.
В вашем методе onSharedPreferenceChanged
проверьте, оценивается ли значениеe в prefs.getWhatever("value", default)
отличается от вашей переменной члена класса.Если это так, примите меры , но имейте в виду, что это, вероятно, вызывается из другого потока ;вы не можете редактировать пользовательский интерфейс извне потока пользовательского интерфейса, иначе произойдет сбой, точно так же вы не хотите вызывать задержки в потоке пользовательского интерфейса или он зависнет.Выполняйте очень быстро, только локальную работу (добавляйте вещи в очереди и т. Д.) И обязательно пишите потокобезопасный код.
Когда вы изменяете какое-то общее значение, сначала измените переменную члена класса,затем возьмите редактор prefs, внесите изменения в переменную и commit()
результат.Ваш локальный onSharedPreferenceChanged
слушатель сработает, но так как значение будет таким же, как и у вашей переменной-члена, вы проигнорируете его.
С этого момента ваше межклассовое общение будет устойчивым,изменение префиксов и пользовательского интерфейса плавно обновляет, отправляет обновление работающим службам, передает значения между несвязанными действиями.