Проблема SharedPreferences для отдельных процессов [дубликат]

269
26 ноября 2016, 19:13

На данный вопрос уже ответили:

  • Не обновляется SharedPreferences в Service 1 ответ

Есть сервис, есть активити, у каждого есть SharedPreferences:

Activity:

public class MainActivity extends AppCompatActivity {
SharedPreferences sPref;
SharedPreferences.Editor sPrefEdit;
final String SAVED_TEXT = "saved_text"; 
...
@Override
protected void onCreate(Bundle savedInstanceState) {
sPref = getSharedPreferences(SAVED_TEXT,MODE_PRIVATE);
sPrefEdit = sPref.edit();
...

и сервис:

public class HealthService extends Service {
SharedPreferences sPref;
SharedPreferences.Editor sPrefEdit;
final String SAVED_TEXT = "saved_text"; 
...
@Override
public void onCreate() {
sPref = getSharedPreferences(SAVED_TEXT,MODE_PRIVATE);
sPrefEdit = sPref.edit();

У них один и тот же файл преференсес, но если сервис записывает что-либо в преференсес, то активити изменения видит только после перезапуска приложения, так же и сервис видит изменения преференсес сделанные активитей только после перезапуска.

Как с этим бороться?

Answer 1

Такова текущая особенность работы SharedPreferences.

В некоторых случаях можно получить актуальное состояние SharedPreferences вызовом метода getSharedPreferences(...) с флагом Context.MODE_MULTI_PROCESS.

Но будьте внимательны, использовать Context.MODE_MULTI_PROCESS не рекомендуется, так как начиная с API level 23 оно deprecated.

This constant was deprecated in API level 23. MODE_MULTI_PROCESS does not work reliably in some versions of Android, and furthermore does not provide any mechanism for reconciling concurrent modifications across processes. Applications should not attempt to use it. Instead, they should use an explicit cross-process data management approach such as ContentProvider.

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

Answer 2

Попробуйте использовать Dagger для передачи объекта SharedPreferences между частями вашего приложения. Для начала работы с Dagger вам потребуется некоторая подготовка вашего приложения. Об этом подробно написано здесь.

Вам понадобится создать класс-модуль:

@Module
public class AppModule {
    private final App app;
    public AppModule(App app) {
        this.app = app;
    }
    @Provides
    @Singleton
    SharedPreferences provideSharedPreferences() {
        return app.getSharedPreferences("settings", 0);
    }
    @Provides
    @Singleton
    App provideApplication() { return app; }
}

Чтобы обратиться к объекту SharedPreferences, вам необхожимо будет добавить в ваши Activity и HealthService как поле класса следующую строчку:

 @Inject
 SharedPreferences pref;

и производить все действия с настройками через это поле.

READ ALSO
Отправка запроса на удаление на REST сервер

Отправка запроса на удаление на REST сервер

Клиент шлет запрос на REST сервер на удаление записиИсполнение на Angular

443
Подключение к mysql (написание интерфейса)

Подключение к mysql (написание интерфейса)

Помогите пожалуйста разобраться с подключением к Базе данныхнужно сделать интерфейс и чтобы по нажатию кнопки программа подключалась к базе,...

202
сортировка используя Sort

сортировка используя Sort

мне в методе нужно реализовать сортировку List используя объект класса Sort, но я сделал используя обычный метод sort, но это не подходит, объясните...

305