Общие предпочтения между двумя процессами одного и того же приложения
Я пишу приложение для Android, содержащее как пользовательский интерфейс, так и отдельные процессы.
Я хочу поделиться простой информацией между основным процессом и службой, определенной в моем приложении, которая выполняется в другом процессе.
Я считаю бесполезным использовать AIDL для межпроцессного общения для этой цели.
Вопрос: безопасно ли использовать общие настройки приложения для обмена данными между этими двумя процессами? Это: чтение и запись одних и тех же общих настроек.
Мне интересно, действительно ли это работает. В разработчиках android разработчики ссылаются на общие настройки (http://developer.android.com/reference/android/content/SharedPreferences.html), они заявляют: Примечание: в настоящее время этот класс не поддерживает использование нескольких процессов. Это будет добавлено позже. но я точно не знаю, что это значит.
Спасибо за помощь
Ответы
Ответ 1
В Android < 2.3 он работает. Один процесс может записывать изменения, а другой процесс может читать изменения. Код для чтения/записи файлов общих настроек (они фактически хранятся в файлах) проверяет, были ли какие-либо изменения, внесенные в файл перед чтением/записью, и соответственно обновили свою кэшированную версию.
В Android > 2.3 он работает, но вам нужно специально установить MODE_MULTI_PROCESS
при вызове getSharedPreferences()
.
В Android 2.3 он сломан, и он не работает: - (
Обратите внимание, что MODE_MULTI_PROCESS
устарел в уровне API 23 (Android M).
Ответ 2
Вы можете проверить https://github.com/hamsterksu/MultiprocessPreferences библиотеку, которая предоставляет API-интерфейсы, подобные SharedPreferences, для доступа к данным SharedPreferences через ContentProvider. Он также выглядит хорошим альтернативом после удаления Google MODE_MULTI_PROCESS с Android 6.
Ответ 3
Нет; это небезопасно. Указанная вами заметка верна. Известны проблемы, которые могут возникнуть, если вы попытаетесь использовать SharedPreferences
для нескольких процессов. (См. https://code.google.com/p/android/issues/detail?id=66625.)
Если вам нужно больше доказательств, посмотрите исходный код SharedPreferencesImpl
, особенно части, которые сохраняют настройки.
Я работал над этой проблемой, предотвращая одновременное обращение обоих процессов к файлу SharedPreferences
. (Здесь один из способов обеспечить блокировку перекрестных процессов, и здесь полная реализация примера, которую я написал.)
Предупреждение. К сожалению, MODE_MULTI_PROCESS
устарел в Android M, поэтому он может перестать работать в более позднем выпуске. Альтернативный метод, такой как использование ContentProvider
, может быть лучшим вариантом.