Чтобы Service
работал бесконечно в фоновом режиме, используйте службу foreground .Это заставит вас поддерживать видимый значок уведомлений / навигационной панели;это цена, которую Android извлекает из вас в обмен на поддержание работы вашего сервиса в течение длительного периода времени.Поддерживается API 5 +.
JobScheduler/WorkManager/AlarmManager
не будет предотвращать убийство вашего Service
.Они могут быть использованы, чтобы вернуть ваш Service
к жизни.Кроме того, JobScheduler
и WorkManager
могут вывести вашу систему из doze , чтобы вы могли выполнять полезную работу.A WakeLock
также может быть необходимо.Если пользователь явно прекратит работу вашего приложения, JobScheduler
заданий больше не разбудит его.Я не знаю ни одного хорошего "одобренного Android" способа реанимировать приложение в этих обстоятельствах.Хотя даже в Oreo + вы можете зарегистрироваться для получения этих намерений , которые вы можете использовать для восстановления выполнения.
Вы можете превратить любой из упомянутых вами подклассов Service
в службу переднего плана(позвонив по номеру startForeground()
. Выбор подкласса является делом удобства и зависит от того, как вы хотели бы распределять и планировать свою работу. Ваше приложение также легко можно реализовать с помощью базового класса Service
. * 1028.*
START_STICKY
на самом деле не предотвращает остановку Service
. Это больше похоже на запрос к системе: «После того, как вы убьете мое приложение / службу, пожалуйста, перезапустите его, если / когда вы сочтете нужным». ВПо моему мнению, это не эффективный способ поддерживать Service
в течение длительного периода времени. Если Service
не на переднем плане, и никакие другие компоненты приложения не на переднем плане (например, на экране),тогда Android может убить ваше приложение довольно быстро. Это более справедливо для более поздних версий ОС (Oreo +).
Ваш Service
должен быть связан с другими компонентами (например, Activities
) из время от времени.Вы привязываетесь к Service
, чтобы вы могли 1.) Убедитесь, что он существует, и 2.) Выполните связь с ним (вызовите функции для него и т. Д.).Так что, да, с помощью IBinder
вы можете обновить пользовательский интерфейс вашей MainActivity.
Привязка Service
не делает его вечным.Если ваш Activity
привязан к Service
, вы можете быть уверены, что Service
будет держаться до тех пор, пока Activity
отображается на экране.Как только он покидает экран, все ставки отключаются.
Другими словами, Android, скорее всего, убьет приложение / службу, если оно не находится на переднем плане и не привязано к каким-либо компонентам на переднем плане (
A Service
обычно может открыть Activity
в любое время по своему выбору, просто позвонив по номеру startActivity()
.Ваш Activity
может даже отменить защиту клавиатуры (при определенных обстоятельствах), используя FLAG_DISMISS_KEYGUARD
.
Если вы можете допускать менее частые обновления местоположения, вы можете сделать это, не оставаясь на переднем плане, но есть ограничения .