从系统托盘android firebase FCM中的通知中检索通知值

时间:2017-04-03 20:30:26

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

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

  

在这些情况下,通知会传递到设备的系统托盘,并且数据有效负载会以启动器活动的附加内容的形式提供。

因此,当我尝试访问intent中的extras时,找不到通知的键。 我在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"
  }
}

任何人都知道如何检索通知中的值?

4 个答案:

答案 0 :(得分:3)

这是预期的行为(正如您在documentation中看到的那样)。如果您使用的是notification - 消息有效负载(您就是这样),只有当您的应用位于前景时才会调用onMessageReceived()如果没有,系统托盘将收到它。

强调我的 data

  

在这些情况下,通知会传递到设备的系统托盘,并且数据有效负载会在启动器活动的附加内容中传递。

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

答案 1 :(得分:3)

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

自:

changeCurrent(role: string): void {
    // Things to do right now
    dispatch(RolesActionID.ROLES_CHANGE_CURRENT, {
        role: role
    });

    let props: any = { Role: role };
    let data: any = formAjaxData("GetPrivileges", props, true);

    // Send ajax
    let post: any = $.post({ url: "/v1/json", data: data, contentType: "text/html; charset=utf-8" })
        .done(function (result: string): void {
            dispatch(RolesActionID.ROLES_CHANGE_CURRENT_SUCCESS, {
                rolePrivileges: result,
                role: role
            });
        })

        .fail(function (result: any): void {
            // Fail actions
        });
};

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

说明:

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

将此添加到清单文件

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