Я прочитал в документации, что Context.startForegroundService()
имеет неявное обещание, что запущенная служба вызовет startForeground()
. Однако, поскольку в Android O появились изменения в фоновых и передних службах, есть ли какие-либо другие улучшения производительности по сравнению с использованием более старого метода startService()
, или это всего лишь наилучшая практика?
Существуют ли какие-либо преимущества для использования Context.startForegroundService(Intent) вместо Context.startService(Intent) для служб переднего плана?
Ответ 1
Это касается ни повышения производительности, ни преимуществ, ни лучшей практики.
Начиная с API 26, система просто не позволяет фоновому приложению создавать фоновый сервис.
Таким образом, если ваше приложение находится в фоновом режиме (вы можете сделать то же самое, если оно также находится на переднем плане), вы должны использовать Context.startForegroundService(Intent)
вместо прежнего startService(Intent)
. Затем служба должна вызвать startForeground(int, Notification)
течение первых 5 секунд после ее запуска, иначе система остановит службу.
Следует также упомянуть, что есть информация о том, что старый способ запуска службы с startService(Intent)
из фонового приложения по-прежнему работает в текущей версии Android Oreo, но скоро будет исправлено.
Следовательно, начиная с API 26, вы хотите использовать новый Context.startForegroundService(Intent)
вместо startService(Intent)
всякий раз, когда вы хотите запустить службу переднего плана.
Ответ 2
Как я объяснил здесь, у startForegroundService есть серьезная проблема, которая неизбежно приведет к нечастым ANR. Так как эта проблема не может быть исправлена на уровне приложения, startForegroundService не должен использоваться. Я переключился на модели JobScheduler и JobService, чтобы реализовать одинаковую функциональность.
Последняя модель работает хорошо, и я больше не видел сбоев приложений в Play Store. Новая модель совершенно другая, хотя я потратил два дня на перефакторинг существующего кода на основе startForegroundService, но он определенно окупился.