我已经阅读了关于SO的类似问题,但是,我无法从中获得正确的答案。
我有一个系统,其中我们将通知发送到大约500台设备。
不幸的是,这些设备中有许多没有收到通知。我发现OPPO F1系列手机尤其没有收到通知。
我观察到,如果该应用程序从多任务托盘中停止,则会发生这种情况。我该如何解决?
更新:我观察到,当我从任务栏关闭应用程序时,我的应用程序被迫在应用程序管理器中停止。当我从任务托盘关闭Whatsapp时,它仍然没有被强制停止。Whatsapp如何处理?
我已经阅读了关于SO的类似问题,但是,我无法从中获得正确的答案。
我有一个系统,其中我们将通知发送到大约500台设备。
不幸的是,这些设备中有许多没有收到通知。我发现OPPO F1系列手机尤其没有收到通知。
我观察到,如果该应用程序从多任务托盘中停止,则会发生这种情况。我该如何解决?
更新:我观察到,当我从任务栏关闭应用程序时,我的应用程序被迫在应用程序管理器中停止。当我从任务托盘关闭Whatsapp时,它仍然没有被强制停止。Whatsapp如何处理?
Answers:
更新03/2017-在此处包括我的回答的一部分。
对于涉及关闭/杀死/强制停止的主题,该主题已经讨论了很长时间,并且似乎没有明确的答案。在我的一项测试中,如果我轻扫关闭应用程序,我仍然能够收到一条消息(经过测试data
-仅消息有效负载)。但是,当我从“设置”菜单强行关闭它时,我无法收到任何消息。请注意,这并非总是如此。
设计了一些设备,当您滑动关闭应用程序时,这与强制停止它们相同(请参阅此处的答案)。
即使在没有强制关闭应用程序的情况下,也有一些设备即使只是简单地将其滑开,设备本身也会阻止它接收消息。其他人则说不可能,因为像WhatsApp这样的应用程序能够做到这一点。到目前为止,我了解到的原因是,设备制造商已将大多数知名应用列入白名单,以使其成为可能。
因为(IMO),这在任何地方都没有记录,这是一个主题,它也取决于设备,并且FCM无法完全控制。
原始答案:
由于它是特定于设备的(如您在文章中提到的:OPPO F1系列手机),当应用程序从该设备中的多任务托盘停止时,很可能会杀死该应用程序,从而导致服务和与之关联的其他后台进程也将被销毁。请参阅此答案,以进一步了解我要说的内容。
如果您在社区中搜索,通常建议在这里使用START_STICKY标志。但是,我看到它以前曾提到过FirebaseMessagingService
(请参阅此帖子,@ ArthurThompson发表评论):
这些服务将由始终在设备上运行的Google Play服务启动。您不必也不应该自己启动/停止这些服务。
话虽如此,也有可能(再次从评论中):
设备上可能有一个设置允许/不允许这样做。
我建议进行进一步测试,以确定服务是否已被设备本身杀死,或者查看是否有阻止通知的设置。
您是否尝试在服务类上使用stopWithTask属性?
<service
android:name="com.yourapp.YourPushService"
android:stopWithTask="false" />
如果设置为true,则当用户删除根于应用程序拥有的活动中的任务时,该服务将自动停止。默认为false。
如果该标志为false,则onTaskRemoved
Service类中有一个回调。
在这种情况下,您可以检测到“ swipe”事件,并且可以实施解决方法。
com.yourapp.YourPushService
该类中,您需要输入扩展的类FirebaseMessagingService
:)
FirebaseMessagingService
即使应用程序从系统托盘关闭也始终在运行。我同意@codepeaker
我经历过同样的事情,但就我而言,这是小米手机而不是Oppo手机。实际发生的情况是,当您从系统托盘中关闭应用程序时,系统会完全杀死该应用程序。这意味着您的应用将无法通过GCM / FCM接收通知。WAKE_LOCK
权限也无济于事。
这并不意味着电话没有收到通知。它是。它只是不会让应用显示它。您可以通过从adb发送广播并查看logcat来验证这一点。
解决此问题的一种可能方法是使用SyncAdapter
。尽管不建议这样做,但我看到一些应用程序正在使用它。其他可能的解决方案是使用始终运行的某种后台服务。有些人还使用AlarmManager
它,因为它几乎永远不会被杀死。我的意思是-您不能依赖GCM / FCM进行通知。
让我们现在谈论WhatsApp-
在小米手机中,他们会根据特定条件将应用列入白名单或黑名单。如果您下载了某个应用,并且该应用在其白名单中,则他们将允许该应用显示通知。如果没有,您已经知道会发生什么。但是,好处是您可以更改这些设置。查找名为“安全性”的应用程序。如果您撤消了正确的权限,即使WhatsApp也将停止显示通知。
SyncAdapter
来发送通知?我们已经SyncAdapter
用于同步数据。我们也如何处理推送通知?
SyncAdapter
此示例的示例
我也面临着同样的问题,但是后来我经过大量调试后才意识到,我正在停止Firebase
其中一项活动的on stop方法中接收通知的服务。
在这里找到答案
无法从通知控制台发送数据消息。
但是还有其他发送通知到设备的方法,它们会被onMessageReceived捕获!
您需要使用终端(Mac或Linux)或诸如Postman之类的某些服务来通过以下链接发送发布请求:https : //fcm.googleapis.com/fcm/send
与下一个身体:
{
"to": "/topics/your_topic_here",
"data": {
"text":"text",
"text1":"text1",
...
}
}
您还需要添加2个标题:
要获取服务器密钥,可以在firebase控制台中找到它:项目->设置->项目设置->云消息传递->服务器密钥