Сделать сервис запущенным на неопределенный срок и общаться с активностью - PullRequest
0 голосов
/ 02 декабря 2018

Я не могу понять различия в службах Android

Я хочу, чтобы служба все время работала в фоновом режиме (распознавание активности)

Когда он обнаруживает, что я RUN -> open GPS -> save curent longitude latitude -> if I stopped to run (WALKING) -> display the log lat on my MainActivity

я хочу, чтобы служба запускалась, если пользователь закрыл приложение, если устройство закрылось и снова открылось, если моя служба была убита

, поэтому я прочитал о:

[Started Service , Intent Service , Bound Service , Intent Bound Service , Job Scheduler , Job Intent Service] ....... Но все же я что-то упустил

Я понимаю, что с Service start_sticky for API<26 будет работать вечно (если не будет убит), а с IBinder я могу обновитьИнтерфейс моей MainActivity;верно?

My Many Q: ...:

1. Связанные службы могут работать вечно?и обновить мой интерфейс MainActivity?Нужно ли мне связываться или я могу достичь этого с помощью службы или намеренной службы

2. Для oreo я "должен" использовать Job Scheduler -> when killed -> open again with broadcast receiver|| work manager || alarm manager ||?

Мои вопросы больше к теории. Ответы, а не код.

НЕОБХОДИМО * -> сервис для "когда-либо" запуска -> если (что-то) -> открытый gps -> сохранить долгоlat -> показывает длинный lat в пользовательском интерфейсе MainActivity.

1 Ответ

0 голосов
/ 02 декабря 2018

Чтобы 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.

Если вы можете допускать менее частые обновления местоположения, вы можете сделать это, не оставаясь на переднем плане, но есть ограничения .

...