2017-02-18 23 views
-1

В основном я застреваю, потому что «улучшения» в батарее добавлены в Android 6.0+. Мое приложение поддерживает API из 11+Правильный способ запуска IntentService каждые x минут в Android, доза включена

Сценарий

Вот мой сценарий: мое приложение извлекает данные из веб-службы сервера 3 партии. Поскольку это не мой сервер, я не контролирую, когда данные добавляются или удаляются. Доступность данных различна. Я хочу иметь возможность запускать IntentService для извлечения данных, например каждые 30/60 минут в течение следующих 6 часов. Таким образом, у меня могут быть данные в моем приложении, охватывающие случай, когда данные становятся недоступными с сервера. Конечно, это нужно сделать, даже если мое приложение закрыто.

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

То, что я сделал до сих пор

Я боролся много с установкой Alarms. Хотя установка повторяющегося сигнала тревоги казалась самым простым и удобным способом его работы, он оказался надежно работать только до версии android 5.0.

Начиная с введения Doze, согласно документам, тревоги откладываются до maintenance window, и поскольку эти окна приходят в 1-2-4 часа и так далее, это не подходит для моих нужд.

Я отказался от использования set repeating и попытался использовать один раз Alarm, который переносится в течение IntentService. От тестирования setExact, похоже, не работал хорошо, но затем попытался setExactAndAllowWhileIdle, который действительно срабатывает в нужный момент, но если в режиме Doze он не имеет доступа к сети, что делает его бесполезным.

Несмотря на это, я не уверен, что происходит, когда сигнал с setRepeating или setExact задерживается, но устройство пробуждать перед тем окно следующего техобслуживания ...

В основном теперь я застрял, с механизмом, который не работать, и я не знаю, что еще выбрать, учитывая версии Android, поддерживаемые приложением и требованиями.

LE: на самом деле я не знаю о хорошем способе задания фоновых заданий на Android, даже если исключить Doze. Я имею в виду, что у нас есть JobScheduler, который кажется приятным делом ... но эй, он доступен только на Android 21 и не поддерживается в обратном порядке ... Я имею в виду действительно, имея простую вещь, и я уже жду через несколько дней.

ответ

1

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

Единственный путь для пробуждения по телефону, предоставление доступа к сети Интернет использует

setAlarmClock() 

Если вы используете setAlarmClock(), то устройство выйдет из режима ожидания за несколько минут до будильника: это зависит от того, конфигурации Doz, которые вы и фактически меняете для целей тестирования, используя команды оболочки. Вы должны использовать setAlarmClock() в исключительном случае, напоминающем важные события календаря.

Кроме того, при его установке в строке состояния отображается значок (звонок): это тот же механизм, который используется для системного аварийного сигнала.

Btw, я бы отговорил этот подход и дождался следующего окна обслуживания. На самом деле вам следует избегать механизма опроса.

+0

Спасибо, 'setAlarmClock', кажется, единственный реальный вариант, но на самом деле это не выход. – Alin