Каковы типичные варианты использования многопоточности по сравнению с сервисами?

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

Я что-то упустил здесь?

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




Ответы (1)


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

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

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

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

а также

Это не само по себе средство для работы вне основного потока.

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

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

ДОПОЛНИТЕЛЬНЫЕ ПРЕДОСТЕРЕЖЕНИЯ ПОСЛЕ OREO

Обратите внимание, что Service, скорее всего, поможет вашему приложению оставаться активным только в течение «несколько минут» после того, как приложение покинет передний план (документы). Единственный известный мне способ обойти это — вернуться на передний план, сделав Service «службой переднего плана».

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

person greeble31    schedule 27.01.2019