SharedPreferences между двумя приложениями, не обновленными, если первое приложение не будет открыто и повторно открыто

53
4

У меня есть два приложения, которые делятся предпочтениями, проблема, с которой я сталкиваюсь, - это то, что одно приложение пишет некоторые настройки, а другое приложение читает их, это старое значение, которое извлекается, если приложение чтения не выйдет, а затем снова открыто, то есть:

Если приложение A запущено и читает значение из настроек:

 ...
prefs = m_context.getSharedPreferences (name, Context.MODE_PRIVATE);
m_retryCount = prefs.getInt(RETRY_COUNT, 0);

Допустим, что полученное значение равно 10.

Теперь, если приложение B запускает и записывает предпочтения:

  prefs = cityidCtx.getSharedPreferences (prefsName, Context.CONTEXT_IGNORE_SECURITY);
SharedPreferences.Editor editor = prefs.edit ();
editor.putInt(CityIdHandsetState.RETRY_COUNT, this.m_retryCount);
editor.commit ();

Допустим, что написанное значение равно 20.

Теперь, если приложение A снова читает настройки после того, как новое значение 20 было написано приложением B, тогда значение, которое получает приложение A, равно 10. Но если приложение A завершено, а затем снова открывается, то значение, которое он читает сейчас, будет 20.

Как это можно зафиксировать так, что приложение A всегда получает обновленные значения.

спросил(а) 2015-12-22T01:26:00+03:00 4 года, 5 месяцев назад
1
Решение
65

Вы используете неправильный FLAG, этот флаг не используется там

Флаг для использования с createPackageContext (String, int): игнорировать любые ограничения безопасности для запрашиваемого Контекста, позволяя ему всегда загружаться. Для использования с CONTEXT_INCLUDE_CODE, чтобы разрешить загрузку кода в процесс, даже если это небезопасно. Используйте с особой осторожностью!

Вы используете Context.getSharedPreferences(String name, int mode), который указывает

Рабочий режим. Используйте 0 или MODE_PRIVATE для операции по умолчанию, MODE_WORLD_READABLE и MODE_WORLD_WRITEABLE для управления разрешениями.

Вам просто повезло, что они имеют похожие значения. Вам нужно использовать...

Context.MODE_WORLD_WRITEABLE

Однако... То, что вы хотите, это на самом деле Context.MODE_MULTI_PROCESS Но... он был устаревшим в 23 и не разрешает одновременный доступ к данным.

Эта константа была устаревшей в API-уровне 23. MODE_MULTI_PROCESS не работает надежно в некоторых версиях Android и, кроме того, не предоставляет какого-либо механизма для согласования одновременных изменений между процессами. Приложения не должны пытаться использовать его. Вместо этого они должны использовать явный кросс-процесс управления данными, например ContentProvider.

Поэтому вам необходимо использовать ContentProvider.

ответил(а) 2015-12-22T01:50:00+03:00 4 года, 5 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема