На данный вопрос уже ответили:
Есть сервис, есть активити, у каждого есть 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();
У них один и тот же файл преференсес, но если сервис записывает что-либо в преференсес, то активити изменения видит только после перезапуска приложения, так же и сервис видит изменения преференсес сделанные активитей только после перезапуска.
Как с этим бороться?
Такова текущая особенность работы 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, или же можно использовать что-то готовое, вроде этого.
Попробуйте использовать 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;
и производить все действия с настройками через это поле.
Сборка персонального компьютера от Artline: умный выбор для современных пользователей