Какую практику лучше использовать для фоновых задач? - PullRequest
0 голосов
/ 06 июня 2018

У меня есть сценарий использования, когда всякий раз, когда транзакция завершается или завершается неудачей, мне приходится ждать в фоновом режиме (не останавливая интерфейс) в течение 5 минут и вызывать фрагмент кода без вмешательства пользователя.Так что AFAIK мне нужно реализовать фоновый сервис для этого.

Я хочу знать, что было бы лучше для моего сценария.

  1. Workermanager (JetPack)
  2. Jobscheduler (для API 14 - 21, Firebase JobDispatcher)
  3. IntentService

А в Oreo и выше, если я запустлю фоновый сервис, он будет отображаться в уведомлении, что приложение работает в фоновом режиме?

Ответы [ 3 ]

0 голосов
/ 06 июня 2018

Теперь рекомендуемый способ выполнения фоновой обработки - это Jetpack WorkManager API.Я приведу официальную документацию по следующим причинам:

WorkManager выбирает подходящий способ выполнения вашей задачи на основе таких факторов, как уровень API устройства и состояние приложения.Если WorkManager выполняет одну из ваших задач во время работы приложения, WorkManager может запустить вашу задачу в новом потоке процесса вашего приложения.Если ваше приложение не работает, WorkManager выбирает подходящий способ планирования фоновой задачи - в зависимости от уровня API устройства и включенных зависимостей, WorkManager может использовать JobScheduler, Firebase JobDispatcher или AlarmManager.Вам не нужно писать логику устройства, чтобы выяснить, какими возможностями обладает устройство, и выбрать соответствующий API;вместо этого вы можете просто передать свою задачу в WorkManager и позволить ему выбрать лучший вариант.

Кроме того, WorkManager предоставляет несколько расширенных функций.Например, вы можете настроить цепочку задач;По завершении одной задачи WorkManager ставит в очередь следующую задачу в цепочке.Вы также можете проверить состояние задачи и ее возвращаемые значения, наблюдая за ее LiveData;это может быть полезно, если вы хотите, чтобы пользовательский интерфейс отображал состояние вашей задачи.

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

Это учитывает следующее замечание:

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

PS Поскольку API WorkManager использует JobScheduler, Firebase JobDistpacher или AlarmManager под капотом, необходимо учитывать минимальные уровни API для используемой функциональности.JobScheduler требует минимум API 21, Firebase JobDispatcher требует минимум API 14 и Google Play Services.

Для полной проверки документации: https://developer.android.com/topic/libraries/architecture/workmanager

Для вашего второго вопроса: насколько я знаю, вы будетевсегда смотрите это уведомление, так как оно уведомляет пользователя о том, что ваше приложение расходует заряд батареи.Уведомление может быть отключено пользователем из настроек в Android Oreo 8.1.

0 голосов
/ 06 июня 2018

WorkManager , вероятно (в конечном итоге) решение, которое вы ищете.Он действует как абстракция, решая, использовать ли JobScheduler (если он доступен), Firebase JobDispatcher (если он доступен) или использовать альтернативу реализации по умолчанию.Таким образом, вы получите лучшее из всех миров.Однако он все еще в альфа-версии, поэтому вы можете хотя бы рассмотреть другие варианты.

Если вы решите не использовать WorkManager, вероятно, целесообразно использовать комбинацию JobScheduler и JobDispatcher (см. здесь ).

Однако, если вы ориентируетесь на устройства без Google Play Services ниже API 22, вам нужно будет использовать другое решение.В этом случае AlarmManager может быть тем, что вы ищете, так как вам нужна отложенная задача с гарантированным выполнением.Использование IntentService для этого возможно, но не так просто.Он включает в себя введение какого-либо механизма задержки, из которых есть несколько вариантов.

Обратите внимание, что поскольку вы используете механизм пакетирования, если вы используете один из API-интерфейсов Job или WorkManager, вы не увидите уведомление вOreo.Решения на основе AlarmManager / IntentService могут отображать уведомление, но, вероятно, не очень долго, поскольку задачи довольно короткие.Это особенно верно для AlarmManager.

0 голосов
/ 06 июня 2018

В дальнейшем официальная документация по Android предлагает использовать JobScheduler вместо фоновой службы.

Во многих случаях приложения, которые ранее были зарегистрированы для неявной трансляции, могут получить аналогичную функциональность, используяРабота JobScheduler.Например, приложение социальной фотографии может время от времени выполнять очистку своих данных и предпочитает делать это, когда устройство подключено к зарядному устройству.Ранее приложение зарегистрировало получателя для ACTION_POWER_CONNECTED в своем манифесте;когда приложение получит эту трансляцию, оно проверит, необходима ли очистка.Для перехода на Android 8.0 или выше приложение удаляет этот получатель из своего манифеста.Вместо этого приложение планирует очистку, которая выполняется, когда устройство находится в режиме ожидания и заряжается.https://developer.android.com/about/versions/oreo/background#services

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...