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

Я пишу приложение для Android, содержащее как пользовательский интерфейс, так и отдельные процессы. Я хочу поделиться простой информацией между основным процессом и службой, определенной в моем приложении, которая выполняется в другом процессе. Я считаю бесполезным использовать AIDL для межпроцессного общения для этой цели.

Возникает вопрос: безопасно ли использовать общие настройки приложения для обмена данными между этими двумя процессами? Это: как чтение, так и запись одних и тех же общих настроек.

Мне интересно, работает ли это на самом деле. В разработчиках android разработчики ссылаются на общие настройки (http://developer.android.com/reference/android/content/SharedPreferences.html), они заявляют: Примечание: в настоящее время этот класс не поддерживает использование нескольких процессов. Это будет добавлено позже. Но я точно не знаю, что это значит.

Спасибо за вашу помощь

В Android <2.3 он работает. Один процесс может записывать изменения, а другой процесс может читать изменения. Код для чтения / записи файлов общих настроек (они фактически хранятся в файлах) проверяет, были ли какие-либо изменения, внесенные в файл перед чтением / записью, и соответственно обновили свою кешированную версию.

В Android> 2.3 он работает, но вам нужно специально установить MODE_MULTI_PROCESS при вызове getSharedPreferences() .

В Android 2.3 он сломан, и он не работает 🙁

Обратите внимание, что MODE_MULTI_PROCESS устарел на уровне API 23 (Android M) .

Вы можете проверить библиотеку https://github.com/hamsterksu/MultiprocessPreferences, которая предоставляет API-интерфейсы, подобные SharedPreferences, для доступа к данным SharedPreferences через ContentProvider. Он также выглядит хорошим альтернативом после удаления Google MODE_MULTI_PROCESS с Android 6.

Нет; Это небезопасно. Указанная вами заметка верна. Известны проблемы, которые могут возникнуть, если вы попытаетесь использовать SharedPreferences для нескольких процессов. (См. https://code.google.com/p/android/issues/detail?id=66625 .)

Если вы хотите получить больше доказательств, посмотрите исходный код SharedPreferencesImpl , особенно части, которые сохраняют настройки.

Я работал над этой проблемой, предотвращая одновременное обращение обоих процессов к файлу SharedPreferences . (Вот один из способов обеспечить блокировку перекрестных процессов , и вот полная реализация примера, которую я написал ).

Внимание : К сожалению, MODE_MULTI_PROCESS устарел в Android M, поэтому он может перестать работать в более позднем выпуске. Альтернативным методом, таким как использование ContentProvider может быть лучший вариант.

Intereting Posts
Метод retrieveRequestToken повышает «Не удалось связаться с поставщиком услуг: null» Android :: Как изменить тему из другого apk программно Как я могу включить / выключить «Показать уведомление» программно в android File.delete () не удаляет полностью пустой файл образа изображения Как ограничить продолжительность MediaStore в Android 7 Что такое «serviceAccountKey.json», о котором идет речь в учебнике по уведомлениям устройства Firebase от устройства к устройству NullPointerException при отражении во время запуска Robolectric – любые подсказки? Программно удалить SMS не работает Начните Android с электронной почты Android – Как я могу получить доступ к объекту View, созданному в onCreate in onResume? «Сообщение об ошибке WTF» в ошибке logcat Как отобразить границу для просмотра изображений? Понимание утечек памяти в приложении для Android Ошибка при запуске Android (написанного в Kotlin), скомпилированного с Gradle2.0.0-alpha плагином Приложение Xamarin Android закрывается сразу после запуска