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

时间:2016-09-15 06:58:14

标签: android firebase firebase-cloud-messaging firebase-notifications

我在SO上看过similar question但是,我无法从中得到正确答案。

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

不幸的是,许多这些设备没有收到通知。我发现OPPO F1系列手机特别没有收到通知。

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

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

6 个答案:

答案 0 :(得分:45)

更新03/2017 - 包括我的部分答案here

关于刷卡关闭/杀死/强制停止的主题,这个主题已经讨论了很长一段时间,似乎并不是一个明确的答案。在我的一次测试中,如果我滑动关闭<,我能够仍然收到消息(使用data - 消息有效负载进行测试) / em>我的应用。但是当我从“设置”菜单强制关闭时,我无法接收任何消息。请注意, 始终是行为。

有些设备是在滑动关闭应用时设计的,它与强制停止它们相同(请参阅我的回答here )。

还有一些设备,即使应用仍然只是刷掉,即使它不是强制关闭,设备本身也会阻止它从接收消息。其他人则认为情况并非如此,因为像WhatsApp这样的应用程序能够做到这一点。到目前为止,我之所以学到这一点,是因为设备制造商已将列入白名单大多数知名应用程序都可以实现。

这在任何地方都没有记录,因为(IMO),这个主题也取决于设备,FCM没有完全控制

原始答案:

由于它是特定于设备的(,正如您在帖子中提到的那样:OPPO F1系列手机),当应用停止使用时,很可能该设备中的任务托盘实际上是查杀应用程序,导致与其关联的服务和其他后台进程也被销毁。请参阅此answer,了解我想说的内容。

如果您在社区中搜索,此处通常建议使用START_STICKY标记。但是,我已经看到之前曾提到的FirebaseMessagingService(请参阅此post,@ ArthurThompson的评论):

  

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

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

  

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

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

答案 1 :(得分:18)

您是否尝试在服务类上使用stopWithTask属性?

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

如果设置为true,则此服务在自动停止时   用户删除以应用程序拥有的活动为根的任务。该   默认为false。

如果该标志为false,则您的Service类中会有onTaskRemoved回调。

如果您可以检测到“滑动”事件,则可以实施解决方法。

答案 2 :(得分:9)

我已经完成了同样的事情但在我的情况下,它是小米手机而不是Oppo手机。实际发生的是,当您从系统托盘关闭应用程序时,系统会完全杀死应用程序。这意味着您的应用程序无法通过GCM / FCM接收通知。 WAKE_LOCK权限也没有帮助。

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

此问题的一种可能解决方案是使用SyncAdapter。虽然不建议,但我已经看到一些使用它的应用程序。其他可能的解决方案是使用始终运行的某种后台服务。有些人也使用AlarmManager因为它几乎从未被杀死。我的观点是 - 您不能依赖GCM / FCM来发送通知。

现在让我们谈谈WhatsApp--

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

答案 3 :(得分:4)

我也遇到了同样的问题,但后来我意识到经过大量的调试后,我停止了在其中一项活动的停止方法中接收Firebase通知的服务。

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

答案 4 :(得分:2)

找到了答案request

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

但还有其他方法可以向设备发送通知,它们将被捕获到onMessageReceived中!

您需要使用终端(Mac或Linux)或Postman等服务在此链接上发送帖子请求:here

下一个身体:

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

您还需要添加2个标题:

  1. 授权 - key = your_server_key_here
  2. Content-Type - application / json
  3. 要获取服务器密钥,可以在firebase控制台中找到它:您的项目 - &gt;设置 - &gt;项目设置 - &gt;云消息传递 - &gt;服务器密钥

    https://fcm.googleapis.com/fcm/send

    enter image description here

答案 5 :(得分:-3)

当应用关闭时,它会关闭服务。您必须重新启动该服务。见here