Remote service и Activity - работа с prefrences
Remote service и Activity - работа с prefrences
Здравствуйте!
Подскажите куда копать:
Основная часть приложения работает в удаленном сервисе (:remote). Есть настройки (sharedPreferences) которые используются и в активити и в сервисе.
Проблема заключается в следующем: при изменении настроек сервис не может получить из файла измененные данные,
такое ощущение что для каждого процесса своя копия переменных и пока приложение не перезагрузишь сервис обновленных данных не видит, но активити при этом может считать "свежую" версию.
Пробовал создавать и собственные объекты sharedPrefrences в активити и сервисе и делать один в Application и потом через
него считывать данные - все равно ничего не меняется. Делал даже отдельный класс с переменными - активити читает
preferences и меняет значение переменной в классе, а сервис потом сам оттуда считывает данные. Объект класса
также создавал и в сервисе и в application - все остается как есть.
Думаю что загвоздка в том что реально все происходит в разных процессах,
но имхо вариант с файлом тут самый подходящий. Почему данные не обновляются - не пойму.
Для чтения из файла в сервисе создавал как глобальный (для класса в котором читаю) объект sharedPreferences так и локальный в методе где нужны данные (т.е. по идее при каждом обращении к методу объект создается заново и уже
в любом случае файл должен считываться заново).
Возможно есть какой-то способ принудительно сбросить/обновить кэш?
Вариант передавать через интент не хочу использовать - кмк для интента многовато данных будет...
(кстати, есть какие то рекомендации/ограничения по объему данных в интенте?)
Дополнение: стартует приложение с активити, а потом уже запускается сервис (за исключением случаев когда сервис запускается интентом с alarm manager'a). Возможно стОит сделать основным запуск сервиса, а уже потом из него
стартовать активити? Перенесется ли после этого активити в один процесс с сервисом?
Подскажите куда копать:
Основная часть приложения работает в удаленном сервисе (:remote). Есть настройки (sharedPreferences) которые используются и в активити и в сервисе.
Проблема заключается в следующем: при изменении настроек сервис не может получить из файла измененные данные,
такое ощущение что для каждого процесса своя копия переменных и пока приложение не перезагрузишь сервис обновленных данных не видит, но активити при этом может считать "свежую" версию.
Пробовал создавать и собственные объекты sharedPrefrences в активити и сервисе и делать один в Application и потом через
него считывать данные - все равно ничего не меняется. Делал даже отдельный класс с переменными - активити читает
preferences и меняет значение переменной в классе, а сервис потом сам оттуда считывает данные. Объект класса
также создавал и в сервисе и в application - все остается как есть.
Думаю что загвоздка в том что реально все происходит в разных процессах,
но имхо вариант с файлом тут самый подходящий. Почему данные не обновляются - не пойму.
Для чтения из файла в сервисе создавал как глобальный (для класса в котором читаю) объект sharedPreferences так и локальный в методе где нужны данные (т.е. по идее при каждом обращении к методу объект создается заново и уже
в любом случае файл должен считываться заново).
Возможно есть какой-то способ принудительно сбросить/обновить кэш?
Вариант передавать через интент не хочу использовать - кмк для интента многовато данных будет...
(кстати, есть какие то рекомендации/ограничения по объему данных в интенте?)
Дополнение: стартует приложение с активити, а потом уже запускается сервис (за исключением случаев когда сервис запускается интентом с alarm manager'a). Возможно стОит сделать основным запуск сервиса, а уже потом из него
стартовать активити? Перенесется ли после этого активити в один процесс с сервисом?
- Mikhail_dev
- Сообщения: 2386
- Зарегистрирован: 09 янв 2012, 14:45
- Откуда: Самара
Re: Remote service и Activity - работа с prefrences
Я прекрасно вас понимаю. Сам сталкивался с такой проблемой и ... и это, мягко говоря, даже в небольшую заметку вылилось
viewtopic.php?f=26&t=1980
PreferenceActivity не надо использовать, я сделал как-то и без него. Там вариант с ним, но сейчас работает и с обычной активностью.
P.S. Не используйте getDefaultSharedPreference (на сколько помню были проблемы с тем, что в разных ПРОЦЕССАХ это были разные файлы) и .apply (синхронизацию настроек делает чуть позже, в отличии от commit) для коммита
Для получения настроек я обычно использую
this.mPreferences = c.getSharedPreferences(c.getPackageName() + "_preferences",Context.MODE_MULTI_PROCESS);
viewtopic.php?f=26&t=1980
PreferenceActivity не надо использовать, я сделал как-то и без него. Там вариант с ним, но сейчас работает и с обычной активностью.
P.S. Не используйте getDefaultSharedPreference (на сколько помню были проблемы с тем, что в разных ПРОЦЕССАХ это были разные файлы) и .apply (синхронизацию настроек делает чуть позже, в отличии от commit) для коммита
Для получения настроек я обычно использую
this.mPreferences = c.getSharedPreferences(c.getPackageName() + "_preferences",Context.MODE_MULTI_PROCESS);
Re: Remote service и Activity - работа с prefrences
Спасибо, уже после того как отправил вопрос - нашел вашу статью (до того как спросить промучался с поиском причины и способа её победить пару недель, но ничего не нашел).
Пока еще не пробовал в приложении (пришлось откатываться на версию до появления настроек и идти дальше, теперь надо все заново соединять), но основная причина - в том что не разбирался с флагами у getSharedPreferences.
Но сама статья - отличная, явно то что я искал. Спасибо.
А PreferenceActivity вообще не рекомендуете в данном случае или просто не желательно, но не смертельно?
Пока еще не пробовал в приложении (пришлось откатываться на версию до появления настроек и идти дальше, теперь надо все заново соединять), но основная причина - в том что не разбирался с флагами у getSharedPreferences.
Но сама статья - отличная, явно то что я искал. Спасибо.
А PreferenceActivity вообще не рекомендуете в данном случае или просто не желательно, но не смертельно?
- Mikhail_dev
- Сообщения: 2386
- Зарегистрирован: 09 янв 2012, 14:45
- Откуда: Самара
Re: Remote service и Activity - работа с prefrences
Крайне не рекомендую, потому что она ничего не умеет. К примеру мне хотелось чтобы у меня сам элемент настроек мог отображать выбранную информацию. Вот пример
"300 метров" - это то, что я выбрал в настройке. Такого не сделать через PreferenceActivity. Она вообще очень и очень ограниченная. В итоге я писал через обычные фрагменты (с ну или обычные активити, не столько важно).
P.S. то что у меня вышло, можете найти в приложении по ссылке в картике, в подписи. (да да, минутка рекламы =) ). Только зарегистрироваться надо, правда подтверждение имейла пока не используем, поэтому можно схитрить.
"300 метров" - это то, что я выбрал в настройке. Такого не сделать через PreferenceActivity. Она вообще очень и очень ограниченная. В итоге я писал через обычные фрагменты (с ну или обычные активити, не столько важно).
P.S. то что у меня вышло, можете найти в приложении по ссылке в картике, в подписи. (да да, минутка рекламы =) ). Только зарегистрироваться надо, правда подтверждение имейла пока не используем, поэтому можно схитрить.
Re: Remote service и Activity - работа с prefrences
Да, то что PreferenceActivity крайне ограниченная тоже заметил.
А можно (т.е. насколько разумно) для отображения использовать ListView?
Т.е. что проще/правильнее делать ListView с обработкой каждого пункта или сделать на каждый пункт
свои TextView (например)? Количество/тип настроек в процессе развития приложения - вещь непостоянная
кмк, какой вариант лучше для поддержки?
ps MODE_MULTI_PROCESS с 23 api устарел... Теперь рекомендуют ContentProvider.
Похоже есть повод порадоваться что сразу сделал отдельную библиотеку под чтение/запись параметров - для
перехода не надо будет все приложение ломать.
А можно (т.е. насколько разумно) для отображения использовать ListView?
Т.е. что проще/правильнее делать ListView с обработкой каждого пункта или сделать на каждый пункт
свои TextView (например)? Количество/тип настроек в процессе развития приложения - вещь непостоянная
кмк, какой вариант лучше для поддержки?
ps MODE_MULTI_PROCESS с 23 api устарел... Теперь рекомендуют ContentProvider.
Похоже есть повод порадоваться что сразу сделал отдельную библиотеку под чтение/запись параметров - для
перехода не надо будет все приложение ломать.
- Mikhail_dev
- Сообщения: 2386
- Зарегистрирован: 09 янв 2012, 14:45
- Откуда: Самара
Re: Remote service и Activity - работа с prefrences
Вполне разумно. Я сделал без него, и не уверен что это правильно. Но у меня опять же, настройки могут быть сильно кастомизированны, поэтому я сделал в ручную. Но если они не сильно кастомизированны, то можно и через ListView сделать (или еще лучше через RecyclerView)А можно (т.е. насколько разумно) для отображения использовать ListView?
Re: Remote service и Activity - работа с prefrences
Спасибо. В итоге - пока собрал с PreferenceActivity (у меня пока еще альфа, а настройки нужны) благодаря вашей статье с передачей
настроек все отлично. Но теперь другая проблема на Android 5.0 в уведомлении звук пропадает
настроек все отлично. Но теперь другая проблема на Android 5.0 в уведомлении звук пропадает