当应用程序从多任务托盘停止时,Android应用程序未收到Firebase通知

我已经阅读了类似的问题 ,但是我无法从中得到正确的答案。

我有一个系统,我们发送通知大约500个设备。 不幸的是,这些设备中有很多没有收到通知。 我发现OPPO F1系列手机特别没有收到通知。

我发现如果应用程序从多任务托盘中停止,则会发生这种情况。 我如何解决这个问题?

[更新:我观察到,当我从任务托盘closures应用程序,我的应用程序被迫停在应用程序pipe理器。 而当我从任务托盘closuresWhatsApp时,它仍然不会被迫停止。 Whatsapp如何处理?]

更新03/2017 – 包括我的答案在这里的一部分。

关于滑动closures/死亡/强制停止的话题,这个话题已经讨论了相当长的一段时间,似乎没有一个明确的答案。 在我的一个testing中,如果我滑动closures我的应用程序,我仍然能够收到一条消息仅用 data消息负载testing)。 但是当我强制从设置菜单closures它,我无法收到任何消息 。 请注意,这并不总是行为。

有一些devise的devise,当你滑动closures应用程序,这将是相同的强制停止他们(见我的答案在这里 )。

也有设备,即使应用程序仍然只是简单地刷掉 ,即使它没有强制closures ,设备本身也阻止它收到消息。 其他人则认为这不可能,因为像WhatsApp这样的应用程序能够做到这一点。 我之所以学到这一点,是因为设备制造商已经把大部分知名的应用列入了白名单

由于(IMO),这是没有logging的任何地方,这也是一个主题,也取决于设备,FCM没有完全控制


原始答案:

由于它是特定设备的( 正如你在文章中提到的:OPPO F1系列手机 ),当一个应用程序在该设备的多任务托盘停止时,它实际上可能会杀死应用程序,导致服务和与之相关的其他后台进程也被销毁。 看到这个答案多一点想法我想说。

如果你在社区周围search,这里通常build议使用START_STICKY标志。 不过,我已经看到,之前提到的FirebaseMessagingService (请参阅本文,由@ArthurThompson发表评论):

这些服务将由Google Play服务启动,该服务始终在设备上运行。 您不必也不应该自己启动/停止这些服务。

有了这个说法,也有可能(再次从评论):

设备上可能有一个允许/禁止的设置。


我build议进一步testing,如果服务被设备本身杀死或看看是否有设置阻止通知。

你有没有尝试在你的服务类上使用stopWithTask属性?

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

如果设置为true,则在用户移除根据应用程序拥有的活动中的任务时,该服务将自动停止。 默认值是false。

如果该标志为false,则在Service类中会有一个onTaskRemovedcallback。

在这种情况下,您可以检测到“滑动”事件,并且可以实施解决方法。

我也经历过,但在我的情况下,这是小米手机,而不是OPPO手机。 实际情况是,当你从系统托盘closures应用程序时,系统会完全杀死应用程序。 这意味着您的应用将无法通过GCM / FCM接收通知。 WAKE_LOCK权限也没有帮助。

这并不意味着手机没有收到通知。 它是。 它只是不会让应用程序显示它。 您可以通过从adb发送广播并查看您的logcat来validation。

一个可能的解决scheme是使用SyncAdapter 。 虽然不build议,我看到一些应用程序使用它。 其他可能的解决scheme是使用某种总是在运行的后台服务。 有些人也使用AlarmManager因为它几乎不会被杀死。 我的观点是 – 你不能依靠GCM / FCM来进行通知。

现在我们来谈谈WhatsApp –

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

我也面临同样的问题,但后来我意识到经过大量的debugging,我停止接收Firebase通知的服务停止方法之一的活动。

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

答案在这里find

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

但有其他的方式发送通知给设备,他们将被捕获onMessageReceived!

您需要使用terminal(Mac或Linux)或Postman等邮件服务发送Post链接: https : //fcm.googleapis.com/fcm/send

与下一个机构:

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

还需要添加2个标题:

  1. 授权 – 密钥= your_server_key_here
  2. Content-Type – application / json

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

在这里输入图像描述

在这里输入图像描述

当应用程序closures时,会closures服务。 您必须重新启动服务。 看到这里

我试图使用元数据标签覆盖通知图标。 它为我工作。

 <meta-data android:name="com.google.firebase.messaging.default_notification_icon" android:resource="@mipmap/ic_launcher" /> <meta-data android:name="com.google.firebase.messaging.default_notification_color" android:resource="@color/colorPrimary" />