Android Firebase云消息onMessageReceived无法使用ShortcutBadger

Android Firebase云消息onMessageReceived无法使用ShortcutBadger,android,android-service,firebase-cloud-messaging,Android,Android Service,Firebase Cloud Messaging,我正在使用Firebase云消息发送通知,并使用ShortcutBadger更新我们应用程序标记上的未读消息计数。我扩展了FirebaseMessagingService类,并实现了覆盖方法onMessageReceived,该方法似乎工作正常,因为当我的应用程序处于后台或被杀死时,我会收到通知。但是,当我在这个方法中添加ShortcutBadger调用时,我不再收到通知,ShortcutBadger调用也不起作用 ShortcutBadger需要一个上下文,而且由于FirebaseMessag

我正在使用Firebase云消息发送通知,并使用ShortcutBadger更新我们应用程序标记上的未读消息计数。我扩展了
FirebaseMessagingService
类,并实现了覆盖方法
onMessageReceived
,该方法似乎工作正常,因为当我的应用程序处于后台或被杀死时,我会收到通知。但是,当我在这个方法中添加
ShortcutBadger
调用时,我不再收到通知,ShortcutBadger调用也不起作用

ShortcutBadger需要一个
上下文
,而且由于FirebaseMessagingService扩展了服务,所以它是一个上下文,这就是为什么我只传递
这个
。我还让ShortcutBadger在代码的其他部分工作,所以我知道它可以工作

如有任何建议,将不胜感激

public class Notifications extends FirebaseMessagingService {

    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        super.onMessageReceived(remoteMessage);
        ShortcutBadger.applyCount(getApplicationContext(), 1); // <-- now is working
    }

}
有人建议我在不发送通知负载的情况下发送消息。我会试试看会发生什么

  • 测试时是否确保没有调用
    ShortcutBadger.removeCount(上下文)
  • 尝试使用
    ShortcutBadger.applyCountOrThrow(上下文,int-badgeCount)
    查看是否引发任何异常
  • 在后台线程上调用
    onMessageReceived(RemoteMessage RemoteMessage)
    。可能您正在测试的手机/启动器使用的是无法从后台线程创建和显示的徽章

  • 您需要从服务器端处理这种情况。从JSON中删除通知,并使用数据。 删除通知孔对象, “通知”:{ “头衔”:“我的头衔,如果有的话”, “正文”:“位置”, “声音”:“默认值” },

    您需要从发送通知的位置更改代码, 对于服务器端代码,即使应用程序处于后台或已被终止,您的onMessageReceived方法调用也应如下所示

    {
      "registration_ids": [
        "cBbGxlj5JRI:APA91bFRLp3tDoBo_P5lGYGUZ4F6iJ55yBJq4GInL7RVV2asHR5PovqnMX-ekIdl_xOYyRyJmSe3SkxYMa3mzIvqml3MmLYZUh8JWygixIebhzhb_l4xv0Q-v3werKl_UO069G1uOyvq"
      ],
      "data": {
        "title": "alt_ctgry - Vehicle Number - extra detail(if any)",
        "body": "location"
      },
      "priority": "high"
    }
    
    如果要创建通知,请编写自己的通知代码。 对于通知数据访问,请使用以下代码

    @Override
        public void onMessageReceived(RemoteMessage remoteMessage) {
            super.onMessageReceived(remoteMessage);
            Log.e("FCM", "Call onMessageReceived\n" + remoteMessage + "");
    
            String title = remoteMessage.getData().get("title");
            String body = remoteMessage.getData().get("body");
    
            createNotification(title, body);
        }
    
    这似乎很好,因为当我的应用程序在后台或被杀死时,我会收到通知

    否,
    onMessageReceived
    在应用程序位于前台而不是后台时被调用(如果您有通知负载)

    在您的服务器端代码中添加了通知有效负载,因此以前在后台应用程序时也不会调用您的
    onMessageReceived
    ,但操作系统会从您的有效负载中显示通知


    如果您想一直处理推送,则需要删除通知负载,但请记住,如果您有iOS应用程序,它可能会中断iOS上的推送。

    您是否尝试了应用程序上下文?不幸的是,我尝试了“this”和“this.getApplicationContext()”,但都没有成功。谢谢你的建议。你从服务器发送什么类型的Firebase消息?这非常重要,谢谢。我们今天将删除通知负载并测试它是否有效。
    @Override
        public void onMessageReceived(RemoteMessage remoteMessage) {
            super.onMessageReceived(remoteMessage);
            Log.e("FCM", "Call onMessageReceived\n" + remoteMessage + "");
    
            String title = remoteMessage.getData().get("title");
            String body = remoteMessage.getData().get("body");
    
            createNotification(title, body);
        }