Remote service и Activity - работа с prefrences

Ответить
Аватара пользователя
Andrés
Сообщения: 11
Зарегистрирован: 17 мар 2015, 11:28

Remote service и Activity - работа с prefrences

Сообщение Andrés » 24 окт 2015, 20:58

Здравствуйте!
Подскажите куда копать:

Основная часть приложения работает в удаленном сервисе (:remote). Есть настройки (sharedPreferences) которые используются и в активити и в сервисе.
Проблема заключается в следующем: при изменении настроек сервис не может получить из файла измененные данные,
такое ощущение что для каждого процесса своя копия переменных и пока приложение не перезагрузишь сервис обновленных данных не видит, но активити при этом может считать "свежую" версию.
Пробовал создавать и собственные объекты sharedPrefrences в активити и сервисе и делать один в Application и потом через
него считывать данные - все равно ничего не меняется. Делал даже отдельный класс с переменными - активити читает
preferences и меняет значение переменной в классе, а сервис потом сам оттуда считывает данные. Объект класса
также создавал и в сервисе и в application - все остается как есть.

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

Для чтения из файла в сервисе создавал как глобальный (для класса в котором читаю) объект sharedPreferences так и локальный в методе где нужны данные (т.е. по идее при каждом обращении к методу объект создается заново и уже
в любом случае файл должен считываться заново).

Возможно есть какой-то способ принудительно сбросить/обновить кэш?

Вариант передавать через интент не хочу использовать - кмк для интента многовато данных будет...
(кстати, есть какие то рекомендации/ограничения по объему данных в интенте?)

Дополнение: стартует приложение с активити, а потом уже запускается сервис (за исключением случаев когда сервис запускается интентом с alarm manager'a). Возможно стОит сделать основным запуск сервиса, а уже потом из него
стартовать активити? Перенесется ли после этого активити в один процесс с сервисом?

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: Remote service и Activity - работа с prefrences

Сообщение Mikhail_dev » 26 окт 2015, 23:11

Я прекрасно вас понимаю. Сам сталкивался с такой проблемой и ... и это, мягко говоря, даже в небольшую заметку вылилось
viewtopic.php?f=26&t=1980
PreferenceActivity не надо использовать, я сделал как-то и без него. Там вариант с ним, но сейчас работает и с обычной активностью.
P.S. Не используйте getDefaultSharedPreference (на сколько помню были проблемы с тем, что в разных ПРОЦЕССАХ это были разные файлы) и .apply (синхронизацию настроек делает чуть позже, в отличии от commit) для коммита
Для получения настроек я обычно использую
this.mPreferences = c.getSharedPreferences(c.getPackageName() + "_preferences",Context.MODE_MULTI_PROCESS);

Аватара пользователя
Andrés
Сообщения: 11
Зарегистрирован: 17 мар 2015, 11:28

Re: Remote service и Activity - работа с prefrences

Сообщение Andrés » 27 окт 2015, 23:03

Спасибо, уже после того как отправил вопрос - нашел вашу статью (до того как спросить промучался с поиском причины и способа её победить пару недель, но ничего не нашел).
Пока еще не пробовал в приложении (пришлось откатываться на версию до появления настроек и идти дальше, теперь надо все заново соединять), но основная причина - в том что не разбирался с флагами у getSharedPreferences. :oops:
Но сама статья - отличная, явно то что я искал. Спасибо.
А PreferenceActivity вообще не рекомендуете в данном случае или просто не желательно, но не смертельно?

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: Remote service и Activity - работа с prefrences

Сообщение Mikhail_dev » 27 окт 2015, 23:31

Крайне не рекомендую, потому что она ничего не умеет. К примеру мне хотелось чтобы у меня сам элемент настроек мог отображать выбранную информацию. Вот пример
Изображение
"300 метров" - это то, что я выбрал в настройке. Такого не сделать через PreferenceActivity. Она вообще очень и очень ограниченная. В итоге я писал через обычные фрагменты (с ну или обычные активити, не столько важно).
P.S. то что у меня вышло, можете найти в приложении по ссылке в картике, в подписи. (да да, минутка рекламы =) ). Только зарегистрироваться надо, правда подтверждение имейла пока не используем, поэтому можно схитрить.

Аватара пользователя
Andrés
Сообщения: 11
Зарегистрирован: 17 мар 2015, 11:28

Re: Remote service и Activity - работа с prefrences

Сообщение Andrés » 28 окт 2015, 10:41

Да, то что PreferenceActivity крайне ограниченная тоже заметил.
А можно (т.е. насколько разумно) для отображения использовать ListView?
Т.е. что проще/правильнее делать ListView с обработкой каждого пункта или сделать на каждый пункт
свои TextView (например)? Количество/тип настроек в процессе развития приложения - вещь непостоянная
кмк, какой вариант лучше для поддержки?

ps MODE_MULTI_PROCESS с 23 api устарел... Теперь рекомендуют ContentProvider.
Похоже есть повод порадоваться что сразу сделал отдельную библиотеку под чтение/запись параметров - для
перехода не надо будет все приложение ломать.

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: Remote service и Activity - работа с prefrences

Сообщение Mikhail_dev » 28 окт 2015, 11:25

А можно (т.е. насколько разумно) для отображения использовать ListView?
Вполне разумно. Я сделал без него, и не уверен что это правильно. Но у меня опять же, настройки могут быть сильно кастомизированны, поэтому я сделал в ручную. Но если они не сильно кастомизированны, то можно и через ListView сделать (или еще лучше через RecyclerView)

Аватара пользователя
Andrés
Сообщения: 11
Зарегистрирован: 17 мар 2015, 11:28

Re: Remote service и Activity - работа с prefrences

Сообщение Andrés » 28 окт 2015, 19:48

Спасибо. В итоге - пока собрал с PreferenceActivity (у меня пока еще альфа, а настройки нужны) благодаря вашей статье с передачей
настроек все отлично. Но теперь другая проблема на Android 5.0 в уведомлении звук пропадает

Ответить