Общие предпочтения между двумя процессами одного приложения

Я пишу приложение для 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 может быть лучшим вариантом.