【问题标题】:Retrieve notification values from a notification in system tray android firebase FCM从系统托盘android firebase FCM中的通知中检索通知值
【发布时间】:2017-08-28 20:31:18
【问题描述】:

我正在使用 firebase 向我的应用发送通知。我想将每个设备上收到的通知保存在本地数据库中。问题是,当应用程序处于后台并收到通知时,不会调用 onMessageReceived() 方法,而是根据文档将通知添加到系统托盘中。该文档还提到了在应用程序处于后台时接收通知的以下内容:

在这些情况下,通知会传送到设备的系统托盘,而数据负载会在启动器 Activity 的 Intent 的附加内容中传送。

因此,当我尝试访问意图中的附加功能时,找不到通知的键。 我的代码在MainActivity.java:

if (getIntent().getExtras() != null) {
        for (String key : getIntent().getExtras().keySet()) {
            Object value = getIntent().getExtras().get(key);
            Toast.makeText(this, "Key: " + key + " Value: " + value, Toast.LENGTH_LONG).show();
        }
    }

我们从服务器发送的通知:

{
"to" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
"notification" : {
  "body" : "great match!",
  "title" : "Portugal vs. Denmark",
  "icon" : "myicon"
  }
}

有人知道如何检索通知中的值吗?

【问题讨论】:

    标签: android android-intent firebase google-cloud-messaging firebase-cloud-messaging


    【解决方案1】:

    将此添加到清单文件

            <intent-filter>
                <action android:name=".MainActivity" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
    

    【讨论】:

      【解决方案2】:

      您所要做的就是更新您的通知推送格式。

      发件人:

      {
        "to" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
        "notification" : {
          "body" : "great match!",
          "title" : "Portugal vs. Denmark",
          "icon" : "myicon"
         }
      }
      

      {
        "to" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
        "data" : {
          "body" : "great match!",
          "title" : "Portugal vs. Denmark",
          "icon" : "myicon"
         }
      }
      

      解释:

      您的系统正在运行一个 firebase 服务,该服务适用于所有应用程序并处理所有推送通知(如果它包含 "notification" 标记)。但如果包含 "data" 标记,它只是将任务移交给应用程序创建的服务,您可以在其中执行任何操作。在您的情况下,显示用户通知并将其保存到本地数据库。更多内容请点击此处Documentation : Handle Messages

      【讨论】:

      • 但是如果有数据有效负载,您可以使用 getBody() 检索通知的标题并获取 Title() 消息吗?如果是纯数据负载,我们需要在 onMessageReceived 方法中创建通知对吗?
      • 是的,您可以将 json 响应绑定到 Model 类,并且可以为每个属性创建 getter 和 setter。 :)
      【解决方案3】:

      这是预期的行为(正如您在documentation 中看到的那样)。如果您正在使用 notification-only 消息负载(您是),则仅当您的应用在 前台 中时才会调用 onMessageReceived(),否则,系统托盘将接收它。

      data(重点是我的):

      在这些情况下,通知会传送到设备的系统托盘,数据负载会在启动器 Activity 的 Intent 的附加内容中传送。

      data 消息负载(参见Message Types)。

      您必须发送带有notificationdata 的有效负载。像这样:

      {
        "to" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
        "notification" : {
          "body" : "great match!",
          "title" : "Portugal vs. Denmark",
          "icon" : "myicon"
          },
        "data": {
          "body" : "great match!",
          "title" : "Portugal vs. Denmark",
          "icon" : "myicon"
        }
      }
      

      另见my answer here

      【讨论】:

      • 有没有办法在“通知”有效负载存在时处理通知,这是因为系统托盘没有做很多推荐的事情,比如分组通知,或者以防万一消息应用程序,显示发送通知的人的头像
      • @Andrea 我没有尝试覆盖它。当我需要对通知进行自定义处理时,我只需发送一个data-only 消息负载,然后在onMessageReceived() 中处理它
      【解决方案4】:

      这不是一个简单或干净的解决方案,但您可以使用NotificationListenerService 来接收每个通知的回调。另一个限制是它仅支持 API 18 及更高版本。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-04
        • 2017-02-03
        • 1970-01-01
        • 2018-05-31
        • 1970-01-01
        相关资源
        最近更新 更多