Как обойти тайм-аут Android JobScheduler?

У меня есть приложение, которое подключается к сети Bitmessage, т.е. постоянно загружает и обрабатывает данные из сети P2P. Кроме того, он должен (опционально) использовать только Wi-Fi/безлимитные сети.

Я реализовал это с помощью JobScheduler, но, к сожалению, тайм-аут составляет 10 минут (очевидно, даже 1 минута на Lollipop).

Итак, как мне реализовать сервис, который

  • автоматически запускается при наличии WiFi
  • автоматически отключается при использовании лимитной сети
  • не истекает время
  • работает на всех версиях Android начиная с Lollipop

person Chris    schedule 15.09.2017    source источник


Ответы (2)


Как вы обнаружили, JobScheduler не является правильным компонентом для непрерывной работы в фоновом режиме. Правильным компонентом для этого является служба переднего плана.

Из ваших требований:

  • автоматически запускается при наличии WiFi

Вы все равно должны использовать JobScheduler для этого. Ваш JobScheduler сам по себе ничего не делает: он просто запускает службу переднего плана. Вы можете использовать Firebase JobDispatcher, если хотите, чтобы он работал с API 14 и только необходимо запустить на устройствах с сервисами Google Play.

  • автоматически отключается при использовании лимитной сети

В своей службе переднего плана вы должны программно зарегистрировать прослушиватель для CONNECTIVITY_ACTION Трансляция. В обратном вызове вы должны проверить результат isActiveNetworkMetered() (доступно в API 16) и, если это так, остановите службу переднего плана.

  • не истекает время

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

person ianhanniballake    schedule 15.09.2017
comment
Большое спасибо, я попробую это! Это почти то же самое, что и я, за исключением того, что я реализовал onStopJob() вместо вашего решения. Жаль, что JobScheduler не позволяет отключить тайм-аут, это было бы идеально для моих нужд и очень просто в использовании. - person Chris; 15.09.2017

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

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

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

person ctate    schedule 28.09.2017