如何在应用程序处于后台时检索通知消息intent.getExtras()(FCM)

13

我正在使用 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); 
} 

1
请包含您目前为止的代码。 - AL.
首先,请确保您正在接收通知消息、有效载荷消息或两者的组合。Google已经提供了示例应用程序,请按照该示例进行操作,否则请在此处粘贴您的代码。 - taman neupane
兄弟,感谢你的建议。我已经在问题中提到了当应用程序在前台时,我会收到通知和数据消息。当应用程序在后台时,通知出现在系统托盘中,点击它后,从intent.getExtras()中只能获取指定的键。如何检索通知负载? - mayur rahatekar
请发布您的onReceive()方法的代码! - android_griezmann
最终Bundle extras = intent.getExtras(); 最终Set<String> keySet = extras.keySet();最终Iterator<String> iterator = keySet.iterator();while (iterator.hasNext()) { 最终String key = iterator.next(); 最终Object o = extras.get(key);System.out.println(key + ":" + o);} - mayur rahatekar
这个解决方案对我有用 https://dev59.com/JVoU5IYBdhLWcg3wM08H#44150822 希望能帮到你。祝好运。 - Tony Barajas
3个回答

16

正如在处理 Android FCM 文档中的消息部分所述,如果您发送的负载既包含通知又包含数据,则它们将分别处理。通知部分将由通知托盘处理,而数据部分将在意图的 extras 中处理。

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

{
"data": {
      "notification_title": "title here",
      "notification_message": "message here"
     }
}
当然,你需要确保notification_titlenotification_message的数据值与通知载荷中所设置的值相同。然后就像往常一样从Intent extras中检索它。

我正在使用Firebase控制台发送通知。 当我点击通知时,我只获得google.sent_time,from,google.message_id,collapse_key等密钥。 我想要消息和标题密钥。 - mayur rahatekar
1
抱歉,你说的有点混淆。据我理解,你想在后台状态下从使用 Firebase 控制台发送的消息中检索 titlemessage 。由于你从控制台发送了消息,因此它将被视为“通知”负载。你需要做的是在“高级选项”部分添加一个自定义键值对(就像我在我的答案中提到的那样),然后用你所用的密钥在Intent extras中解析它。 - AL.
目前我正在这样做。但是还有其他方法吗?因为我需要在Firebase控制台中添加标题和消息两次。 - mayur rahatekar
1
我明白了。不幸的是,我认为在后台时没有办法检索通知负载值。它将始终由通知托盘处理。 - AL.
谢谢您的回复。所以我必须设置自己的服务器并仅发送数据有效负载,这样即使我的应用程序在后台运行,onMessageReceived也会被调用。在这种情况下,我们必须注意通知的生成。正确吗? - mayur rahatekar

7
Firebase通知在应用程序处于后台或已关闭时将作为数据消息进行处理。在这些情况下,如果您想检索通知消息,则必须在键值对中定义它。
FCM控制台的高级选项。

enter image description here

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

 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);
                }
          }
   } 

1

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

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

注意:它适用于Play服务11。

1
FirebaseMessagingService没有名为handleIntent的方法。请参阅文档:https://firebase.google.com/docs/reference/android/com/google/firebase/messaging/FirebaseMessagingService。需要审核此评论。 - voghDev

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