当应用程序从多任务托盘停止时,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类中会有一个onTaskRemoved
callback。
在这种情况下,您可以检测到“滑动”事件,并且可以实施解决方法。
我也经历过,但在我的情况下,这是小米手机,而不是OPPO手机。 实际情况是,当你从系统托盘closures应用程序时,系统会完全杀死应用程序。 这意味着您的应用将无法通过GCM / FCM接收通知。 WAKE_LOCK
权限也没有帮助。
这并不意味着手机没有收到通知。 它是。 它只是不会让应用程序显示它。 您可以通过从adb发送广播并查看您的logcat来validation。
一个可能的解决scheme是使用SyncAdapter
。 虽然不build议,我看到一些应用程序使用它。 其他可能的解决scheme是使用某种总是在运行的后台服务。 有些人也使用AlarmManager
因为它几乎不会被杀死。 我的观点是 – 你不能依靠GCM / FCM来进行通知。
现在我们来谈谈WhatsApp –
在小米手机中,他们根据一定的标准将应用列入白名单或黑名单。 如果您下载的应用程序,并且如果它在他们的白名单,他们将允许应用程序显示通知。 如果没有,你已经知道发生了什么事。 但好的是你可以改变这些设置。 找一个名为Security的应用程序。 如果您撤销正确的权限,即使WhatsApp将停止显示通知。
我也面临同样的问题,但后来我意识到经过大量的debugging,我停止接收Firebase
通知的服务停止方法之一的活动。
- 请检查你是否在应用程序的任何地方停止这些服务。
- 确保你使用服务,而不是意图服务。
- 滑动应用程序将永远不会停止服务。 所以尝试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个标题:
- 授权 – 密钥= your_server_key_here
- 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" />