Android - Сервис, IntentService, JobIntentService - они останавливаются, если приложение убито - PullRequest
0 голосов
/ 20 декабря 2018

Я читал много таких же вопросов здесь, в StackOverflow и в Web, но не могу настроить что-то вроде «никогда не заканчивающийся сервис» или запуск, даже когда приложение удалено из задачи (принудительное уничтожение).Мне просто интересно, как работают такие сервисы, как Viber или WhatsUp, потому что, когда мы принудительно убиваем эти приложения, мы все еще можем получать сообщения, когда кто-то пишет нам (так что сервис по-прежнему работает).Я знаю о сервисе переднего плана, но это не решение, потому что пользователь не хочет видеть уведомление.Итак, вот что я попробовал.: Этот код запускается внутри сервисов для обнаружения изменений в реальном времени, и просто хотел, чтобы он оставался активным в любых условиях приложения: Foreground, Background, Removed и т. Д. *

firestoreDb!!.collection("example").document("example").collection("real_time_request")
                    .addSnapshotListener { documentSnapshot: QuerySnapshot?, _: FirebaseFirestoreException? ->

                    }

Я использую сервиснапример, чтобы получать данные в реальном времени из базы данных Firestore, когда что-то меняется в коллекции пользователя.

Способы, которыми я пробую сервисы:

FirestoreListeners : IntentService("Firestore Listeners")
FirestoreListeners : Service
FirestoreListeners : JobIntentService

Все выше работает нормально, когда приложение на переднем плане илив фоновом режиме, но службы закрываются после принудительного закрытия приложения (при удалении из задачи)

Я попытался внести эти изменения в манифест:

android:stopWithTask="false"
android:directBootAware="true"
android:process=":remote"

В иерархии приложения:

android:persistent="true"

В IntentService onHandleIntent:

setIntentRedelivery(true)

В службе onStartCommand:

return START_STICKY

Попытка перезапустить службу, если система уничтожит или уничтожит ее:

override fun onTaskRemoved(rootIntent: Intent) {
        val restartServiceIntent = Intent(applicationContext, this::class.java)
        restartServiceIntent.setPackage(packageName)
        val restartServicePendingIntent = PendingIntent.getService(applicationContext, 1, restartServiceIntent, PendingIntent.FLAG_ONE_SHOT)
        val alarmService = applicationContext.getSystemService(Context.ALARM_SERVICE) as AlarmManager
        alarmService.set(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime() + 1000, restartServicePendingIntent)
        Log.e("Service Firestore ", "Task Removed")
        super.onTaskRemoved(rootIntent)
    }

Но ничего не работает ОК.Какое лучшее решение для достижения этой цели?Таким образом, цель состоит в том, чтобы что-то работало в фоновом режиме и прослушивало изменения Firestore (или что-то еще) даже после того, как приложение было убито или удалено из задач, таких как Viber и т.д. ... Может быть, они используют службу переднего плана без значка уведомления?Но я не думаю, что Android позволяет нам предоставлять такие услуги переднего плана (без уведомления)

Я прочитал несколько статей о WorkManager и, как говорит Google:

Примечание. WorkManager предназначен для задач, требующих гарантии того, что система их запустит, даже если приложение выйдет, например, для загрузки данных приложения на сервер.Он не предназначен для фоновой работы в процессе, которую можно безопасно прекратить, если процесс приложения завершится;для подобных ситуаций мы рекомендуем использовать ThreadPools.

Но не могу понять, как именно это работает или как использовать для моих целей

Спасибо

Ответы [ 4 ]

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

Вы упомянули, что знакомы с приложением, которое делает то, что вам нужно.Проверьте файл манифеста приложения с помощью https://play.google.com/store/apps/details?id=sk.styk.martin.apkanalyzer (или аналогичного приложения) или выполните рефакторинг приложения.Привет.

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

WorkManager теперь является лучшим решением для выполнения некоторого рабочего фона.Потому что теперь ОС Android более ограничена тем, что позволяет работать в фоновом режиме в течение длительного периода времени.Из официальной документации ... WorkManager выбирает подходящий способ планирования фоновой задачи - в зависимости от уровня API устройства и включенных зависимостей, WorkManager может использовать JobScheduler, Firebase JobDispatcher или AlarmManager.

Веб-сайт разработчика AndroidХорошее место для начала изучения WorkManager https://developer.android.com/topic/libraries/architecture/workmanager/basics.

Для периодических задач, которые будут выполняться непрерывно с задержкой между ними, вы можете создать PeriodicWorkRequest и поставить его в очередь в экземпляре WorkManager.https://developer.android.com/topic/libraries/architecture/workmanager/basics#recurring

Другой старый способ - просто использование AlarmManager.Таким образом, вам не нужно постоянно запускать службу в фоновом режиме.Вы можете установить повторяющуюся тревогу, а при ее срабатывании вы можете запустить службу и делать то, что вам нужно.

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

В документации по режиму Android Doze указано использование FirebaseJobDispatcher, которое будет работать даже в режиме Doze.но это будет работать только один раз каждые 15 минут.Вы можете использовать WorkManager из компонентов архитектуры Android, которые могут соответствующим образом использовать FirebaseJobDispatcher, AlarmManager и JobScheduler на соответствующих поддерживаемых уровнях API

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

Вы можете использовать push-уведомление FCM, чтобы разбудить устройство, когда ваше приложение не работает / передний план. Когда приложение получает push-уведомления, вы можете запустить службу для выполнения требуемой задачи.Опять же, вы не сможете запустить службу, когда приложение находится в фоновом режиме, для этого вам может потребоваться запустить службу в качестве службы переднего плана.

...