Каковы типичные варианты использования многопоточности против служб? - PullRequest
0 голосов
/ 27 января 2019

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

Я что-то здесь упускаю?

Кроме того, с момента введения режима Doze и введения еще большего количества ограничений на фоновую работу при запуске Oreo, когда именно мне следует использовать сервис для фоновой работы? Помимо планирование задач для будущих условий, таких как WIFI-соединение или начисление платы, я бы тогда использовал JobScheduler. Но даже это может быть обработано через BroadcastReceiver ...

1 Ответ

0 голосов
/ 27 января 2019

Также они будут продолжать работать, когда приложение работает в фоновом режиме, минуя новые ограничения Oreo.

Это не совсем верно.Это правда, что фоновые потоки будут выполняться до тех пор, пока ваше приложение живо.Проблема в том, что ваше приложение может не существовать очень долго!Service используется для обозначения операционной системы: «Я не хочу срываться; у меня все еще есть полезная работа, которую я должен сделать».

Из документов :

... [Служба представляет] либо желание приложения выполнить более продолжительную операцию, не взаимодействуя с пользователем, либо предоставить функциональность для использования другими приложениями.

и

Это не средство само по себе, чтобы работать вне основного потока

В конечном счете, когда Android решает, сохранять ли ваше приложение или нетвокруг, его не волнует количество запущенных вами потоков, количество CountDownTimers, которые еще не закончились, сколько Runnables вы ожидаете в очереди и т. д. Он заботится о том, действительно ли выесть какие-либо активные компоненты приложения.Activity виден?Отлично, держись.Service запущен?Тоже отлично.Ни один из вышеперечисленных?Может быть, пришло время завершить работу приложения.

Так что это также отвечает на вопрос: «Когда именно мне следует использовать службу для фоновой работы?»Как уже упоминалось, Служба не сделает работу за вас, она просто поможет вам остаться в живых.Вы можете попробовать запустить поток в BroadcastReceiver (обратите внимание, что большинство неявных трансляций больше не работают после Oreo ), но как только вы вернетесь из onReceive(), ваше приложение, вероятно, будетубит - если только у вас не запущен Сервисв течение нескольких минут после того, как приложение покинет передний план ( docs ).Единственный способ обойти это, как мне известно, - вернуться на передний план, превратив ваш Service в «сервис переднего плана».

Кроме того, если вам нужно убедиться, что устройство остается активным до вашей работызавершен, вам понадобится компонент на переднем плане.То есть, вы все еще можете выполнять эту работу в «фоне» (в смысле «за кадром»), но вам понадобится «Служба переднего плана» (значок на панели действий).В противном случае применяется Doze, что приводит к запрету любых WakeLocks, используемых вашим приложением.

...