Существуют ли какие-либо преимущества для использования Context.startForegroundService(Intent) вместо Context.startService(Intent) для служб переднего плана?

Я прочитал в документации, что Context.startForegroundService() имеет неявное обещание, что запущенная служба вызовет startForeground(). Однако, поскольку в Android O появились изменения в фоновых и передних службах, есть ли какие-либо другие улучшения производительности по сравнению с использованием более старого метода startService(), или это всего лишь наилучшая практика?

Ответ 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, но он определенно окупился.