我在SO上看过similar question但是,我无法从中得到正确答案。
我有一个系统,我们会向大约500个设备发送通知。
不幸的是,许多这些设备没有收到通知。我发现OPPO F1系列手机特别没有收到通知。
我观察到如果应用程序从多任务托盘停止,就会发生这种情况。我该如何解决这个问题?
更新:我观察到当我从任务托盘关闭应用时,我的应用会被强制停在应用管理器中。当我从任务托盘关闭Whatsapp时,仍然没有强制停止。怎么被Whatsapp处理?
答案 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
通知的服务。
答案 4 :(得分:2)
找到了答案request
无法从通知控制台发送数据消息。
但还有其他方法可以向设备发送通知,它们将被捕获到onMessageReceived中!
您需要使用终端(Mac或Linux)或Postman等服务在此链接上发送帖子请求:here
下一个身体:
{
"to": "/topics/your_topic_here",
"data": {
"text":"text",
"text1":"text1",
...
}
}
您还需要添加2个标题:
要获取服务器密钥,可以在firebase控制台中找到它:您的项目 - &gt;设置 - &gt;项目设置 - &gt;云消息传递 - &gt;服务器密钥
答案 5 :(得分:-3)
当应用关闭时,它会关闭服务。您必须重新启动该服务。见here