Задача #2098

Неоднозначное поведение автообновления доставок на фоне

Added by Бороздин Владимир over 3 years ago. Updated over 3 years ago.

Status:Новая Start date:11/01/2017
Priority:Нормальный Due date:
Assignee:- % Done:

0%

Category:-
Target version:5.0.1351.0
Сметная стоимость:0.0

Description

Обновление доставок происходило с неравномерным интервалом, а также ночью вообще не могло отправить ничего, и было множество ошибок связи с сервером.

Выяснилось, что обновление запущено из Activity, а дизайн Activity рассчитан на работу её процессов, когда сама Activity видна, то есть экран разблокирован, приложение не свёрнуто и т.п.
Потому обновление доставок было перенесено на Service, и там запускается бесконечно работающий Task обновления с заданной периодичностью.

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

В документации Android рекомендовалось использовать для периодичных событий Timer, JobScheduler и подобные "Task'и", а также AlarmManager.
Timer и JobScheduler работали также как и Task - время обновления оставалось неоднозначно.
Далее были попробованы методы AlarmManager: SetRepeating и SetExactAndAllowWhileIdle.
С использованием SetRepeating интервал стал более однозначным, но промежутки также остались большими спустя небольшое время.
SetExactAndAllowWhileIdle проявил себя гораздо лучше - очень долго обновлялся с нужным интервалом, но всё также были и неоднознычные моменты.

Вся проблема в итоге заключалась в подсистеме PowerManager, которая следит за батареей, и при долгом состоянии неактивности (30 минут),
переводит устройство в режим сна, которое могут "разбудить" либо сам пользователь, взяв устройство в руки, либо Push-уведомления с высоким приоритетом.
Также система сама периодически "просыпается", чтобы завершить отложенные задачи.

С версии Android 6.0 Marshmellow мы можем ловить событие ухода и выхода устройства из режима сна, и эти события на таких устройствах и выше пишутся в лог.

Итого: на данный момент для обновления доставок с точной периодичностью используется метод AlarmManager.SetExactAndAllowWhileIdle,
который максимально долго может перезапускаться, пока устройство не уйдёт в режим сна.
Однако режима сна в любом случае не избежать, но так как курьеры наверняка будут часто брать устройство в руки, то и устройство практически всегда будет активно.

History

Updated by Бороздин Владимир over 3 years ago

при долгом состоянии неактивности (30 минут), переводит устройство в режим сна

уточнение: 60 минут - проверено дважды

Also available in: Atom PDF