【问题标题】:How to retrieve notification message intent.getExtras() when app is background FCM当应用程序是后台 FCM 时如何检索通知消息 intent.getExtras()
【发布时间】:2017-05-18 10:07:19
【问题描述】:

我正在使用 FCM 进行简单通知

当应用程序处于前台时,一切正常。我收到一条通知以及 onMessageReceived 方法中的数据消息。

但是当应用程序处于后台时,我会在系统托盘中收到通知。当我单击控件时,它会转到主要活动。当我解析 intent.getExtras(); 时,我只得到这个关键数据 - google.sent_timefromgoogle.message_idcollapse_key

如何从intent.getExtras()获取系统托盘中可见的通知消息标题和消息?

我正在使用 FCM 控制台发送通知我没有专门的服务器来执行此操作。

接收消息的代码:

final Bundle extras = intent.getExtras(); 
final Set<String> keySet = extras.keySet(); 
final Iterator<String> iterator = keySet.iterator(); 
while (iterator.hasNext()) {     
    final String key = iterator.next(); 
    final Object o = extras.get(key); 
    System.out.println(key + ":" + o); 
} 

【问题讨论】:

  • 请包含您目前拥有的代码。
  • 首先确保您收到的是通知消息或有效负载消息或两者的组合。 Google 提供了示例应用程序,请按照该示例进行操作,否则请在此处粘贴您的代码。
  • 老兄感谢您的建议。我已经提到,当应用程序在前台时,我会同时收到通知和数据消息。并且当通知进入系统托盘时在后台 - 单击它时。来自意图.getExtras();我只得到提到的键。如何检索通知负载
  • 发布你的 onReceive() 方法的代码!
  • " final Bundle extras = intent.getExtras(); final Set keySet = extras.keySet(); final Iterator iterator = keySet.iterator(); while (iterator.hasNext ()) { final String key = iterator.next(); final Object o = extras.get(key); System.out.println(key + ":" + o); } "

标签: android firebase firebase-cloud-messaging firebase-notifications


【解决方案1】:

当您的应用处于后台或被终止时,Firebase 通知将表现为数据消息。在这些场景中,如果要检索通知消息,则必须在

下的键值对中定义它

FCM 控制台的高级选项

然后在您的活动中使用此检索此消息,该活动将通过点击通知打开。

 if (getIntent().getExtras() != null) {
        Object value ;
        for (String key : getIntent().getExtras().keySet()) {
            if(key.equals("Message Key")) {
                 value = getIntent().getExtras().get(key); // value will represend your message body... Enjoy It
                 Log.d("NotificationTag" , key+"____" + value);
                }
          }
   } 

【讨论】:

    【解决方案2】:

    只需覆盖 FirebaseMessagingService .class 的 handleIntent() 方法,它将在前台和后台模式下调用,在这里您可以获取和解析通知密钥和有效负载数据

    public void handleIntent(Intent intent)
        {
        String title = bundle.getString("gcm.notification.title");
         String body = bundle.getString("gcm.notification.body");
        }
    

    注意:它适用于播放服务 11

    【讨论】:

    【解决方案3】:

    Handling Messages for Android FCM docs所见,如果你发送的payload既有通知又有数据,会分别处理。通知部分将由通知托盘处理,而数据部分将在 Intent 的附加部分中。

    AFAIK,当应用程序处于后台时(始终由通知托盘处理),无法获取通知负载。但是,您可以将自定义键值对添加到数据负载中,如下所示:

    {
    "data": {
          "notification_title": "title here",
          "notification_message": "message here"
         }
    }
    

    当然,您必须确保 notification_titlenotification_message 的数据值与您在通知负载中设置的值相同。然后像往常一样从 Intent extras 中检索它。

    【讨论】:

    • 我正在使用 firebase 控制台发送通知。当我点击通知时。我只得到 google.sent_time,来自 google.message_id,collapse_key。这把钥匙。我想要消息和标题键
    • 对不起。你说的有点混乱。据我了解,当您的应用处于后台时,您希望从使用 Firebase 控制台发送的消息中检索 titlemessage。看到您从控制台发送消息时,它将被视为notification 有效负载。您需要做的是在 Advanced Option 部分中添加 custom 键值对(正如我在回答中提到的),然后使用您使用的密钥在 Intent extras 中解析它。
    • 目前我也在做同样的事情。但是有没有别的办法。因为我必须添加两次标题和消息。在 Firebase 控制台中。
    • 我明白了。不幸的是,我认为在后台时没有任何方法可以检索通知有效负载值。它将始终由通知托盘处理。
    • 感谢您的回复。所以我必须设置我自己的服务器并只发送数据有效负载,所以即使我的应用程序在后台 onMessageReceived 也会被调用。在这种情况下,我们必须小心生成通知。正确
    猜你喜欢
    • 1970-01-01
    • 2018-07-31
    • 1970-01-01
    • 2017-06-25
    • 2016-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-25
    相关资源
    最近更新 更多