【问题标题】:Android - Service, IntentService, JobIntentService - they are stoped if app killedAndroid - Service、IntentService、JobIntentService - 如果应用程序被杀死,它们就会停止
【发布时间】:2018-12-29 22:45:50
【问题描述】:

我在 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 的文章,正如谷歌所说:

注意:WorkManager 适用于需要保证的任务 即使应用程序退出,系统也会运行它们,例如上传应用程序 数据到服务器。它不适用于进行中的后台工作 如果应用程序进程消失,可以安全地终止;为了 类似的情况,我们建议使用 ThreadPools。

但无法弄清楚它是如何工作的或如何用于我的目的

谢谢

【问题讨论】:

标签: java android android-studio kotlin android-9.0-pie


【解决方案1】:

当您的应用处于未运行/前台时,您可以使用 FCM 推送通知来唤醒设备。当应用收到推送通知时,您可以启动您的服务来执行所需的任务。同样,当应用程序处于后台时,您可能无法启动服务,因为您可能需要将服务作为前台服务运行。

【讨论】:

  • 您好,感谢您的想法。是的,您对这种解决方法是正确的,但我认为 viber 或其他人不会使用这种解决方法来唤醒设备。
  • 不使用 FCM 的服务呢?
  • 我相信 whatsApp/Viber 应该使用 FCM .. 现在大多数调用应用程序都在使用 FCM
  • 我明白了,但是对于 E.x 检查某些东西是否在线的服务,如果它停止了,就不能使用 FCM。我认为 FCM 仅适用于类似消息传递应用程序的解决方案,对其他人来说呢?
  • @EAKTEAM 我不熟悉基本的 Android 编程,但是您是否认为它很可能根本不可能做您想做的事情?事实上,我希望不是,因为运行一个在强制杀戮中幸存下来并且不显示任何通知的后台任务(我希望我理解正确,这就是你想要的)似乎是一个安全问题。
【解决方案2】:

WorkManager 现在是做一些工作背景的最佳解决方案。因为现在 Android OS 对它允许在后台长时间运行的内容有更多限制。从官方文档中... 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。这样,您就不必一直在后台运行服务。您可以设置重复警报,当它触发时,您可以启动服务并执行您需要的操作。

【讨论】:

    【解决方案3】:

    在 Android 打盹模式文档中,他们指定使用 FirebaseJobDispatcher,即使在打盹模式下也能正常工作。但这每 15 分钟只能工作一次。 您可以使用 Android 架构组件中的 WorkManager,这些组件可以在相应支持的 API 级别上适当地使用 FirebaseJobDispatcher、AlarmManager 和 JobScheduler

    【讨论】:

      【解决方案4】:

      您提到您熟悉一个应用程序,它可以满足您的需求。使用https://play.google.com/store/apps/details?id=sk.styk.martin.apkanalyzer 检查应用的清单文件 (或类似的应用程序)或重构应用程序。问候。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多