Кроме того, они будут продолжать работать, когда приложение работает в фоновом режиме, в обход новых ограничений Oreo.
Это не совсем так. Это правда, что фоновые потоки будут продолжать выполняться до тех пор, пока ваше приложение живо. Проблема в том, что ваше приложение может существовать недолго! Service
используется для указания операционной системе: «Я не хочу, чтобы меня снесли; у меня все еще есть полезная работа, которую я должен выполнить».
Из документов:
... [Служба представляет собой] либо желание приложения выполнять более длительную операцию, не взаимодействуя с пользователем, либо предоставлять функциональные возможности для использования другими приложениями.
а также
Это не само по себе средство для работы вне основного потока.
В конечном счете, когда Android решает, оставить ваше приложение или нет, его не волнует количество запущенных вами потоков, количество CountDownTimers
, которые еще не завершены, сколько Runnables
вы ожидаете в очереди, и т. д. Он заботится о том, есть ли у вас какие-либо активные компоненты приложения. Виден ли Activity
? Отлично, держись. Service
запущен? Тоже здорово. Ни один из вышеперечисленных? Возможно, пришло время закрыть приложение.
Таким образом, это также отвечает на вопрос: «Когда именно я должен использовать службу для выполнения фоновой работы?» Как уже упоминалось, Служба не будет делать работу за вас, она просто поможет вам остаться в живых. Вы можете попытаться запустить поток в BroadcastReceiver
(обратите внимание, что большинство неявных трансляций больше не работают post-Oreo), но как только вы вернетесь из onReceive()
, ваше приложение, скорее всего, будет уничтожено, если только у вас не запущена Служба.
ДОПОЛНИТЕЛЬНЫЕ ПРЕДОСТЕРЕЖЕНИЯ ПОСЛЕ OREO
Обратите внимание, что Service
, скорее всего, поможет вашему приложению оставаться активным только в течение «несколько минут» после того, как приложение покинет передний план (документы). Единственный известный мне способ обойти это — вернуться на передний план, сделав Service
«службой переднего плана».
Кроме того, если вам нужно, чтобы устройство оставалось активным до завершения вашей работы, вам понадобится компонент на переднем плане. То есть вы все еще можете выполнять эту работу в «фоновом режиме» (в смысле «за кадром»), но вам понадобится «служба переднего плана» (значок на панели действий). В противном случае будет применяться Doze, а это, как правило, блокирует любые WakeLocks
, которые использует ваше приложение.
person
greeble31
schedule
27.01.2019