如何在应用程序处于后台时删除单个FCM通知?

6
我正在开发一个应用程序,其中我收到FCM通知,在应用程序打开时,onMessageRecieved()方法触发,我根据标签和ID通知消息,并根据ID和标签删除通知。但是当应用程序在后台运行时,onMesasageRecived()没有被调用。如何附加ID和标记通知,或者当我从后台接收通知时,如何基于某个ID删除单个通知。

请查看onMessageReceived

 @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
............
     notificationManager.notify("tag", notificationId, notification);
.......
}

删除消息的方法:
  private void clearNotifications() {

        NotificationManager nMgr = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

        nMgr.cancel("tag",notificationId);
    }

这个代码在应用程序运行时是有效的,但当应用程序关闭时代码将不会工作。我们是否可以从服务器端载荷中通知或附加标签和ID?


打开自定义活动时 - android_jain
你打开客户活动了吗? - Santanu Sur
Santanu应用程序在后台运行,但当我打开应用程序时,我只想删除ID == 0的通知。 - android_jain
在点击通知后打开活动后,您想要在该特定活动的 onCreate 方法中取消它,对吗? - Santanu Sur
叶萨曼努,我想在创建时删除它,但仅限于具有id等于1的通知。 - android_jain
显示剩余4条评论
2个回答

2
如果您查看文档此处,您会发现如果您有一个notification负载,您的通知将在您的应用程序后台时直接传递到系统托盘,无法拦截。如果您有一个包含可选数据有效负载的通知负载,则也会发生相同的情况,通知将直接进入托盘,数据有效负载将传递给启动器活动的意图。
{
  "message":{
    "token":"bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
    "notification":{
      "title":"Portugal vs. Denmark",
      "body":"great match!"
    }
  }
}

onMessageReceive方法中检查id/tag时,为了确保它总是调用onMessageReceived方法,您可以从通知中删除通知负载,并添加仅数据负载。所有data负载都会传递到onMessageReceived方法。

  "message":{
    "token":"bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
    "data":{
      "Nick" : "Mario",
      "body" : "great match!",
      "Room" : "PortugalVSDenmark"
    }
  }
}

1
要在应用程序后台时调用onMessageReceived()方法,您需要从消息中删除“notification”键及其有效负载,并仅包括“data”键及其有效负载。
之前:(同时具有通知和数据有效负载的消息)
{
  "message":{
    "token":"bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
    "notification":{
      "title":"Portugal vs. Denmark",
      "body":"great match!"
    },
    "data" : {
      "Nick" : "Mario",
      "Room" : "PortugalVSDenmark"
    }
  }
}

之后:(仅为数据信息)
{
  "message":{
    "token":"bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
    "data" : {
      "Nick" : "Mario",
      "Room" : "PortugalVSDenmark"
    }
  }
}

因为只有包含“data”键的数据消息才能在您的应用程序在后台时调用onMessageReceive()方法,如this document所述。
还有一件事:如果您的应用程序针对Android 8.0及更高版本的设备进行定位,则必须按照this document中指定的方式注册应用程序的通知通道,否则消息通知将不会出现。

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