Я читал много таких же вопросов здесь, в 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.
Но не могу понять, как именно это работает или как использовать для моих целей
Спасибо