Наличие Android службы в качестве фоновой и основной службы - PullRequest
0 голосов
/ 21 февраля 2020

Я прочитал, что мне следует позвонить

startForegroundService(intent)

, если я хочу правильно запустить службу, которая может работать в качестве службы переднего плана. Но как мне подумать, если я хочу, чтобы это началось, не будучи сервисом переднего плана, но потенциально могло бы стать таковым позже? Немного информации о том, как у нас это сейчас есть:

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

startService(intent);

Когда приложение переходит в фоновый режим, мы проверяем, включена ли эта функция, и, если это так, запускаем startForeground(id, notificiation);, который эффективно добавляет несъемные уведомления в ОС, и служба продолжает работать. Когда приложение возвращается на передний план, мы называем stopForeground(true). Если эта функция не включена, служба никогда не будет установлена ​​в качестве службы переднего плана, и мы не будем пытаться выполнять эти задачи в фоновом режиме.

Итак, мой вопрос: Достаточно ли этого, чтобы получить "полную производительность обслуживания переднего плана"? Или я что-то теряю, не звоня startForegroundService(intent)? У меня сложилось впечатление, что у нас действительно есть полностью работающий сервис переднего плана, но я запутываюсь, когда читаю утверждения, которые foreground services must be started using startForegroundService(intent) мы не делаем. Если нам действительно нужно для использования startForegroundService(intent), единственное решение, которое я могу придумать, - это изначально запустить нормальный экземпляр службы, а когда приложение переходит в фоновый режим, мы запускаем новый, используя startForegroundService(intent). Но нужно ли нам это делать или выполняется startForegund(id, notification) на службе, запущенной с использованием startService(intent), достаточной для достижения службы переднего плана?

ПРИМЕЧАНИЕ: Я нахожу одно отличие в том, что если При запуске службы само приложение находится в фоновом режиме, тогда мне нужно startForegroundService(intent) для API> = 26. В нашем случае мы всегда запускаем службу, когда приложение находится на переднем плане. Однако я вспоминаю некоторые случаи, когда я видел исключение, возникающее, когда мы пытаемся запустить службу с использованием startService(intent), приложение почему-то (очень и очень редко) все еще думает, что оно работает в фоновом режиме (возможно, что-то из ОС появляется только тогда, когда приложение запущен). Поэтому, если я пойму, когда это произойдет, я смогу запустить startForegroundService(intent), чтобы запустить службу. Но возможно ли запустить stopForeground(true) на этом сервисе, когда приложение вернется на передний план? Или это обязательно будет приоритетным сервисом навсегда, так как мы начали его таким образом?

1 Ответ

0 голосов
/ 21 февраля 2020

Я прочитал ваш вопрос несколько раз и думаю (надеюсь), что ответ на ваш вопрос:

Согласно официальному документу Android 8.0 Пределы выполнения фона:

Android 8.0 представляет новый метод startForegroundService () для запуска новой службы на переднем плане. После того, как система создала службу, у приложения есть пять секунд, чтобы вызвать метод startForeground () службы, чтобы отобразить видимое пользователю уведомление новой службы. Если приложение не вызывает startForeground () в течение срока, система останавливает службу и объявляет приложение ANR.

Итак, убедитесь, что вы начали текущее уведомление, вызвав startForeground (int id, Уведомление-уведомление) в методе onCreate () вашего сервиса.

Примечание. Приложения, нацеленные на API Build.VERSION_CODES.P или более поздней версии, должны запросить разрешение Manifest.permission.FOREGROUND_SERVICE для использования этого API.

И есть отличная средняя статья, опубликованная Мацей Витовски , которая поможет вам понять, как действительно работает API новых сервисов: https://proandroiddev.com/pitfalls-of-a-foreground-service-lifecycle-59f014c6a125

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