从多任务任务栏停止应用时,Android应用未收到Firebase通知


74

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

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

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

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

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


1
解决了相同的问题即可解决.. stackoverflow.com/a/45810771/1993001
Rahul Devanavar


这里有一些步骤可以为您提供帮助。
IgniteCoders

Answers:


55

更新03/2017-在此处包括我的回答的一部分。

对于涉及关闭/杀死/强制停止的主题,该主题已经讨论了很长时间,并且似乎没有明确的答案。在我的一项测试中,如果我轻扫关闭应用程序,我仍然能够收到一条消息(经过测试data-消息有效负载)。但是,当我从“设置”菜单强行关闭它时,我无法收到任何消息。请注意,这并非总是如此。

设计了一些设备,当您滑动关闭应用程序时,这与强制停止它们相同(请参阅此处的答案)。

即使在没有强制关闭应用程序的情况下,也有一些设备即使只是简单地将其滑开,设备本身也会阻止它接收消息。其他人则说不可能,因为像WhatsApp这样的应用程序能够做到这一点。到目前为止,我了解到的原因是,设备制造商已将大多数知名应用列入白名单,以使其成为可能。

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


原始答案:

由于它是特定设备的(如您在文章中提到的:OPPO F1系列手机),当应用程序该设备中的多任务托盘停止时,很可能会杀死该应用程序,从而导致服务和与之关联的其他后台进程也将被销毁。请参阅此答案,以进一步了解我要说的内容。

如果您在社区中搜索,通常建议在这里使用START_STICKY标志。但是,我看到它以前曾提到过FirebaseMessagingService(请参阅此帖子,@ ArthurThompson发表评论):

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

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

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


我建议进行进一步测试,以确定服务是否已被设备本身杀死,或者查看是否有阻止通知的设置。


2
@AL是正确的(我没有说其他的意思),但是它不会阻止您接收推送通知。Google Play服务已与GCM / FCM保持永久连接,一旦收到消息,它将启动您声明的服务来向您发送消息。因此,无论您的应用程序是否已完全失效,如果正确实施了GCM,您都将收到此消息。
tomacco

1
@AL。是的,请检查以下内容:stuff.mit.edu/afs/sipb/project/android/docs/google/gcm/gcm.html 他们几乎没有提及,但这是一个有趣的文档。您也可以在其他SO答案中找到更多信息。 stackoverflow.com/questions/19111901/…–
tomacco

2
@milanm许多中国供应商,包括OPPO,都有模仿iOS的趋势。在我的公司中,我们发现其中许多人都认为在“最近的屏幕”中关闭与强制杀死该应用程序相同,更重要的是,这种行为不是统一实施的,即流行的IM应用程序不受此行为的影响。因此,建议您下载其他不受欢迎的应用程序并测试其行为。
2016年

2
@KapilRajput您是否有一个链接可以支持您的主张,以便我可以向老板展示?:D
lelloman '17

2
@AL。这是一个带有Google Android API的带有Android 25的仿真器,但是在未强制关闭该应用程序的情况下,它仍在工作。您对如何调试有任何建议吗?在具有Android 7.1.1的OnePlus 3T上也相同
lelloman

19

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

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

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

如果该标志为false,则onTaskRemovedService类中有一个回调。

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


这对我有用。在com.yourapp.YourPushService该类中,您需要输入扩展的类FirebaseMessagingService:)
Michele La Ferla

1
如此设置对还是错?为防止杀戮服务
Farzad

19
stopWithTask的默认值为false,那又有什么用呢?
代言人

按照问题,FirebaseMessagingService即使应用程序从系统托盘关闭也始终在运行。我同意@codepeaker
Faizan Mubasher

10

我经历过同样的事情,但就我而言,这是小米手机而不是Oppo手机。实际发生的情况是,当您从系统托盘中关闭应用程序时,系统会完全杀死该应用程序。这意味着您的应用将无法通过GCM / FCM接收通知。WAKE_LOCK权限也无济于事。

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

解决此问题的一种可能方法是使用SyncAdapter。尽管不建议这样做,但我看到一些应用程序正在使用它。其他可能的解决方案是使用始终运行的某种后台服务。有些人还使用AlarmManager它,因为它几乎永远不会被杀死。我的意思是-您不能依赖GCM / FCM进行通知。

让我们现在谈论WhatsApp-

在小米手机中,他们会根据特定条件将应用列入白名单或黑名单。如果您下载了某个应用,并且该应用在其白名单中,则他们将允许该应用显示通知。如果没有,您已经知道会发生什么。但是,好处是您可以更改这些设置。查找名为“安全性”的应用程序。如果您撤消了正确的权限,即使WhatsApp也将停止显示通知。


1
您能否详细说明如何利用它SyncAdapter来发送通知?我们已经SyncAdapter用于同步数据。我们也如何处理推送通知?
SepehrM '16

请提供如何使用SyncAdapter 此示例的示例
blueware'October

4

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

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

2

这里找到答案

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

但是还有其他发送通知到设备的方法,它们会被onMessageReceived捕获!

您需要使用终端(Mac或Linux)或诸如Postman之类的某些服务来通过以下链接发送发布请求:https : //fcm.googleapis.com/fcm/send

与下一个身体:

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

您还需要添加2个标题:

  1. 授权-key = your_server_key_here
  2. 内容类型-application / json

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

在此处输入图片说明

在此处输入图片说明


-3

关闭应用程序后,它将关闭服务。您必须重新启动服务。看这里

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.