我在StackOverflow和Web上看到了很多相同的问题,但是无法配置类似于“永不停止的服务”或者即使应用程序被从任务中删除(强制杀死)也可以运行。我想知道像Viber或WhatsUp这样的服务是如何工作的,因为当我们强制关闭这些应用程序时,仍然能够接收到有人写信给我们的消息(因此服务仍在运行)。我知道前台服务,但这并不是解决方案,因为用户不想看到通知。所以这里是我尝试过的:这段代码在服务内部运行以检测实时更改,并希望它在应用的每个条件下保持活动状态:前台、后台、已删除等。
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处理此类情况。
但我无法弄清楚它如何工作或如何用于我的目的。
谢谢