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