Android FCM在应用程序被从后台移除时无法接收通知

9
手机型号是OnePlus3T。氧气OS版本为4.1.6。当应用程序在前台或后台但在内存中时,应用程序会收到通知。但是,当应用程序不在内存中即从内存中滑出时,不会收到通知。 其他设备上的通知可以在Android OS版本4.2、5.1.1、6.0.1、7.1.1 Lineage OS上接收,即使应用程序不在内存中。 请提出建议。 提前致谢。

如果它在其他设备上运行正常,那么很可能是制造商在操作系统中进行了更改,所以我怀疑你无法做任何事情来解决它。 - tyczj
但是WhatsApp和Gmail的通知正在工作......我有一个用于创建通知的服务,除了FirebaseMessagingService之外。它是START_NOT_STICKY。尝试了START_STICKY,但仍然没有起作用。我做错了什么吗? - Rajas47Ashtikar
请查看我的答案此处 - AL.
2个回答

24

我也遇到了同样的问题。

解决这个问题的两种方法:

1- 使用通知负载

可以使用data标签或notification标签发送通知负载。

使用data标签

 "data" {
  "title": "welcome",
  "description" :"to your app" ,
  "image" :"image_url",  
  "deeplink" :"deeplink",
   - -
  }

它会触发FirebaseMessagingService的onMessageReceived方法。 在某些设备上,当应用程序在后台运行时,它将无法正常工作。

使用通知

 "notification" {
   "title":"title",
   "description" : "description",
   "click_action" :"activity to be open"
   ..
}
这种情况下,安卓系统会处理并展示通知,您的FirebaseMessagingService的onMessageReceived方法将不会被调用。即使应用程序在后台,通知也会显示出来。缺点是您无法自定义这些通知,因为它们由Android系统处理。 更多信息请参见此处

2- 在设备设置中启用自动启动

如果您使用“data”发送通知并且应用程序已被杀死,则通知将不会显示。如果您观察log cat,您会看到:
W/GCM-DMM: broadcast intent callback: result=CANCELLED forIntent { act=com.google.android.c2dm.intent.RECEIVE pkg=com.cabipool (has extras) }

可以在OnePlus 3的设置中解决此问题-->应用程序-->点击齿轮-->最后一个选项“应用选择应用程序自动启动”-->找到您的应用程序并启用开关。

这是大多数设备(如Vivo、Oppo、小米、华硕和OnePlus 3)都存在的问题。

启用应用程序自动启动的步骤因设备制造商而异。

更新:

在OnePlus 3和Android 8.0中,自动启动选项已被删除,因此现在您可以前往“设置”>“电池”>“电池优化”>(左上角的三点菜单)高级优化>关闭高级优化。


8
在OnePlus 3和Android 8.0上,自动启动选项已被移除,所以现在您可以前往“设置”>“电池”>“电池优化”>(左上角的三点菜单)“高级优化”>关闭“高级优化”。 - Isaac Bosca
通知或数据的有效载荷是强制性的吗?需要在FirebaseMessagingService类的onMessageReceived()方法中调用吗?你能告诉我吗?我在一些设备上也遇到了同样的问题。@Rahul Devanavar - Revathi Manoharan
@RevathiManoharan 如果你从 Firebase 控制面板发送通知,那么默认情况下它会成为通知负载。你必须使用 curl 或者自定义数据负载来发送通知。通知负载有其限制,它只支持标题和描述。 - Rahul Devanavar

2

这看起来像是特定设备的问题。

为了检查,请在应用关闭后(重新启动或滑动后)运行此命令。

adb shell dumpsys package MY-PACKAGE | grep stopped

如果您可以读到stopped=true,那么这意味着您设备的制造商实现了一种非标准行为,即在应用程序被滑动关闭时"强制停止"应用程序。

强制停止与禁用应用程序非常相似,直到用户再次打开应用程序为止。
当应用程序处于该状态时,许多其他 Android API 将无法工作! (广播、闹钟等)

如果这是问题,请联系制造商并请求修复设备!


谢谢您的回复,我尝试了该命令,并将stopped设置为false。但是通知仍然没有出现。 - Rajas47Ashtikar
2
可能是设备有不同类型的定制。如果应用程序在不同设备上工作,则意味着代码是正确的。 - Diego Giorgini
我认为这取决于包名,当我测试我的包名时,stopped=true,当我添加WhatsApp的包名时,stopped=false,如果您有任何想法,请告诉我,我正在遇到相同的问题。 - Sanjay

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接