当前位置: 首页 > 知识库问答 >
问题:

我的应用程序前台服务被终止时未收到FCM通知

翟元凯
2023-03-14

当我的应用程序前台服务被终止时,不会收到FCM通知,更清楚的是,我正试图让我的应用程序始终在后台运行,我使用前台服务来实现这一点,有时应用程序未被ANDROID系统终止,前台通知会出现15个多小时,但其他情况下,当我的前台通知被终止,并且我发送FCM通知时,它在1小时或更短时间内被终止,而我的设备没有收到FCM通知!!这里有什么问题!我怎样才能解决它!

共有1个答案

孔正文
2023-03-14

在前台处理通知

当应用程序关闭时,您的通知将由Google服务流程处理,该流程负责根据需要显示您的通知,包括默认的单击操作(打开应用程序)和通知图标。

当应用程序处于前台时,接收到的消息由应用程序处理,由于没有处理它的逻辑,所以什么都不会发生!

要解决这个问题,我们需要自己的FirebaseMessagingService,让我们创建一个。创建一个扩展它的新类并实现onMessageReceived方法。然后从remoteMessage获取通知对象,并创建自己的Android通知。

public class NotificationService extends FirebaseMessagingService { 
  @Override
  public void onMessageReceived(RemoteMessage remoteMessage) {
    super.onMessageReceived(remoteMessage);
    Notification notification = new NotificationCompat.Builder(this)
      .setContentTitle(remoteMessage.getNotification().getTitle())
      .setContentText(remoteMessage.getNotification().getBody())
      .setSmallIcon(R.mipmap.ic_launcher)
      .build();
     NotificationManagerCompat manager = NotificationManagerCompat.from(getApplicationContext());
     manager.notify(123, notification);
   }
}

然后将服务添加到您的Androidanifest.xml

<service android:name=”.NotificationService”>
 <intent-filter>
  <action android:name=”com.google.firebase.MESSAGING_EVENT”/>
 </intent-filter>
</service>

现在,如果您再试一次,您将在应用程序处于前台时显示通知!

在现实生活中,你的onMessageRec的内容会稍微复杂一点,你会想要不同的智能操作,这取决于通知的类型,你会想要显示一个更好的大图标(出现在通知正文上的图标),并且一定要更改状态栏图标。

你现在遇到的问题是,你的onMessageReceived仅在应用程序位于前台时调用,如果你的应用程序位于后台,谷歌服务将负责显示你的消息。

解决方案是什么?不要使用“通知”消息负载,而是使用“数据”。使用数据

解决这个前台/后台问题的最后一步是从消息负载中删除通知对象。

而不是发送:

{
   "to": "the device token"
   "notification":{
     "title":"New Notification!",
     "body":"Test"
   },
   "priority":10
 }

Send:

{
   "to": "the device token"
   "data":{
     "title":"New Notification!",
     "body":"Test"
   },
   "priority":10
 }

这样,您的通知将始终由应用程序、通知服务处理,而不是由谷歌服务流程处理。

您还需要更改代码以处理数据负载:

// Old Way
//.setContentTitle(remoteMessage.getNotification().get(“title”))
//.setContentText(remoteMessage.getNotification().get(“body”))

// New Way
.setContentTitle(remoteMessage.getData().get(“title”))
.setContentText(remoteMessage.getData().get(“body”))

您的整个通知服务现在将如下所示:

public class NotificationService extends FirebaseMessagingService { 
  @Override
  public void onMessageReceived(RemoteMessage remoteMessage) {
    super.onMessageReceived(remoteMessage);
    Notification notification = new NotificationCompat.Builder(this)
      .setContentTitle(remoteMessage.getData().get(“title”))
      .setContentText(remoteMessage.getData().get(“body”))
      .setSmallIcon(R.mipmap.ic_launcher)
      .build();
     NotificationManagerCompat manager = NotificationManagerCompat.from(getApplicationContext());
     manager.notify(123, notification);
   }
}

使用数据而不是通知对象的另一个优点是,您可以在“数据”对象中放入任何需要的内容。例如,用户ID、图像的URL……您可能希望用于生成通知或传递给单击操作的任何信息。请注意,所有将被视为字符串。例如

"data":{
     "title":"New Notification!",
     "body":"Test",
     "user_id": "1234",
     "avatar_url": "http://www.example.com/avatar.jpg"
 },

本文档的“处理消息”部分也解释了这种差异:https://firebase.google.com/docs/cloud-messaging/android/receive

结论

请注意,如果您将“通知”对象保留在有效载荷中,它将像以前一样运行。你需要摆脱“通知”,只提供“数据”对象。

 类似资料:
  • 我正在将通知从GCM迁移到FCM。在GCM中,当应用程序处于前台、后台或被杀死时,我能够收到通知,但在FCM中,当应用程序未被打开或被刷出时,我无法收到通知。我错过什么了吗???? } json请求正文:

  • 即使应用程序从后台被杀死或从内存中被刷出,我如何接收到设备的fcm通知。我使用维梧、Oppo、松下设备。但在应用程序被终止时未收到通知。

  • 当应用程序在前台时不接收推送通知,但当应用程序在后台时接收我已遵循来自https://medium . com/@ ankushaggarwal/GCM-setup-for-Android-push-notifications-656 cf DD 8 adbd的FCM教程

  • 我正在处理FCM通知。当应用程序在后台时,我的通知工作正常,但当应用程序在前台时,我的通知无法接收。我几乎什么都试过了,但都不奏效。当应用程序处于前台时,不会收到通知。 manifest.xml: 代码(FirebaseMessagingService):

  • 我使用Firebase控制台发送通知到我的Android设备,它的工作正常时,应用程序是在后台或前台状态。但它没有收到的通知在被杀死的状态,因为我没有附加任何数据,它不应该是一个数据通知。

  • 我使用firebase推送通知到设备令牌。当应用程序打开或前景我可以得到通知很好。但当当前任务的应用程序被杀死或清除应用程序时,我无法收到通知发送。 我试过OnMessageReceedEardy的第一次工作。但现在它不工作时,杀死的应用程序。 > 代码接收通知: