当应用程序从多任务托盘中停止时,Android 应用程序没有接收 Firebase 通知

我已经阅读了 类似的问题的所以,但是,我不能得到正确的答案从它。

我有一个系统,我们发送通知到大约500个设备。

不幸的是,这些设备中的许多都没有接收到通知。我发现 OPPO F1系列手机尤其没有得到通知。

我观察到,如果应用程序从多任务托盘中停止,就会出现这种情况。我如何解决这个问题?

更新: 我观察到当我从任务托盘关闭应用程序时,我的应用程序被强制停止在应用程序管理器中。当我从任务托盘关闭 Whatsapp 时,它仍然没有被强制停止。Whatsapp 是怎么处理的?

53925 次浏览

更新03/2017-包括部分答案 给你

关于 滑动关闭[杀死/强制停止]的话题,这个话题已经讨论了很长时间,似乎没有一个明确的答案。在我的测试之一,我能够 还是会收到信息(测试与 data-只有消息有效载荷) ,如果我 靠近点我的应用程序。但是当我 强制关闭它从设置菜单,我 无法接收任何信息。请注意,这是 不是始终的行为。

有一些设备的设计,当你 关闭滑动的应用程序,它将是一样的 强制停止他们(见我的答案 给你)。

还有一些设备,即使应用程序仍然只是简单的 被偷走了,即使它不是 强制关闭,设备本身也阻止它接收消息。其他人说这不可能,因为像 WhatsApp 这样的应用程序可以做到这一点。到目前为止,我之所以知道这些是因为设备制造商拥有 白名单大部分知名的应用程序,这样才有可能实现。

这是没有文件的任何地方,因为(IMO) ,这是一个主题,也取决于设备和 FCM 没有 完全控制超过。


原答案:

因为它是特定于设备的(正如你在文章中提到的: OPPO F1系列电话) ,所以很有可能当一个应用程序在该设备中是 从多任务托盘中停止时,它实际上是 杀戮应用程序,导致与它相关的服务和其他后台进程也被破坏。看看这个 回答,了解我想说的更多的想法。

如果您搜索整个社区,这里通常建议您使用 START _ STICKY标志。然而,我已经看到之前在 FirebaseMessagingService中提到过它(参见这个 邮寄,@ArthurThompson 的评论) :

这些服务将由总是在设备上运行的 GooglePlay 服务启动。您不必也不应该自己启动/停止这些服务。

话虽如此,也有可能(同样来自评论) :

设备上可能有一个允许/不允许这样做的设置。


我建议进一步测试服务是否被设备本身杀死,或者看看是否有设置阻塞了通知。

我也面临着同样的问题,但是经过大量的调试之后,我意识到,我停止了其中一个活动的停止方法中接收 Firebase通知的服务。

  1. 请检查您是否在应用程序的任何地方停止这些服务。
  2. 确保你使用的是服务而不是意图服务。
  3. 滑动应用程序永远不会停止服务。所以尝试调试应用程序的前两点。

我也经历过同样的情况,但在我的情况下,是小米电话,而不是 Oppo 电话。实际发生的情况是,当你从系统托盘关闭应用程序时,系统会完全杀死应用程序。这意味着你的应用程序将无法通过 GCM/FCM 接收通知。WAKE_LOCK许可也没用。

这并不意味着电话没有收到通知。是的。只是不让应用程序显示而已。您可以通过从 adb 发送广播并查看您的 logcat 来验证这一点。

这个问题的一个可能的解决方案是使用 SyncAdapter。虽然这不是建议,我已经看到一些应用程序使用它。其他可能的解决方案是使用某种总是在运行的后台服务。有些人也使用 AlarmManager,因为它几乎从来没有被杀死。我想说的是,你不能依赖 GCM/FCM 来发送通知。

现在我们来谈谈 WhatsApp

在小米手机上,他们根据一定的标准将应用列入白名单或黑名单。如果你下载了一个应用程序,并且它在他们的白名单中,他们会允许应用程序显示通知。如果没有,你已经知道会发生什么。但好的一面是,您可以更改这些设置。查找一个名为 Security 的应用程序。如果您撤销了正确的权限,即使是 WhatsApp 也将停止显示通知。

您是否尝试过在服务类中使用 停止任务属性?

<service
android:name="com.yourapp.YourPushService"
android:stopWithTask="false" />

如果设置为 true,此服务将在 用户删除根植于应用程序拥有的活动中的任务 默认为 false。

如果标志为 false,则在 Service 类中有一个 onTaskRemoved回调。

在这种情况下,您可以检测到“滑动”事件,并且您可以实现一个变通方法。

找到了答案 给你

无法从通知控制台发送数据消息。

但是还有其他方法可以向设备发送通知,并且它们将在 MessageRecected 中被捕获!

您需要使用终端(Mac 或 Linux)或一些服务,如邮递员发送邮政请求在这个链接: https://fcm.googleapis.com/fcm/send

下一具尸体:

{
"to": "/topics/your_topic_here",
"data": {
"text":"text",
"text1":"text1",
...
}
}

还需要添加两个头:

  1. Authorization-key = your _ server _ key _ here
  2. Content-Type-application/json

要获取服务器密钥,您可以在 Firebase 控制台中找到它: 您的项目-> 设置-> 项目设置-> 云消息-> 服务器密钥

enter image description here

enter image description here

我使用 MoEngage 推送通知服务发送推送通知。

解决方案是在 Android 的 Application 类中初始化 PushNotification 对象/服务,而不是 MainActivity。

然后通知也将以被杀状态接收。

如何从应用程序类调用

在 androidManifest.xml 文件中声明类名,它将是应用程序标记中的 Application 类

<application
android:name="App" //class name that will be an Application class
android:label="@string/app_name"
android:fullBackupContent="@xml/backup_descriptor"
android:usesCleartextTraffic="true"
android:icon="@mipmap/ic_launcher">

这将是 App.kt 类

class App: FlutterApplication() {
override fun onCreate() {


super.onCreate()
//initialize your notification service here
}
}