Firebase 随时获取通知数据

Firebase Get Notification data on tap

我是用 f​​irebase 控制台来发送通知的。它直接将通知发送到系统托盘。我想在用户点击它们时从它们那里获取有效负载。

When your app is in the background, Android directs notification messages to the system tray. A user tap on the notification opens the app launcher by default.

This includes messages that contain both notification and data payload (and all messages sent from the Notifications console). In these cases, the notification is delivered to the device's system tray, and the data payload is delivered in the extras of the intent of your launcher Activity.

https://firebase.google.com/docs/notifications/android/console-audience

我能够收到从控制台发送的通知 如何从我的意图中获取通知负载?

我转储了附加包并找到了答案。

这些是我正在寻找的密钥:

google.sent_time(长)
来自(字符串)
google.message_id(字符串)
collapse_key(字符串)

除此之外,您还可以直接使用用于自定义数据的密钥(在发送消息时)。

当我们从 firebase 控制台触发消息时,我认为只有我们发送的自定义数据才能从 extra 的意图中接收到。我无法从此处检索到标题、消息等

更新

正如其他人所观察到的,我认为不可能从 extra 意图中提取标题和消息。我通过使用单独的密钥再次传递它们找到了解决方法。一些代码如何从额外的意图中提取数据是

Bundle Extras = getIntent().getExtras(); 
public static String Content_KEY = "NotificationContent"; //alterative to message
String Content = Extras.getString(Content_KEY);

我不记得确切的名称,但是有两种发送消息的模式。

  1. 第一种模式是 firebase 控制台使用的模式。它直接发送消息

    1. 如果在后台(作为通知)到系统托盘
    2. 如果在前台,则转到 onMessageReceived。

你必须处理这两个问题,如果我在 onMessageReceived 中收到通知,我最终会从我的应用程序本身发送通知到系统托盘,这样我就可以使用处理 main 中额外意图的相同代码来管理它们 activity.

如果通知丢失,您也会丢失数据。

  1. 直接从服务器或应用向 Firebase 服务器发送消息。我认为消息将始终发送到 onMessageReceived,从而节省了再次发送消息作为单独的密钥的所有痛苦以及如果通知被删除则丢失数据的问题。但是在这里你必须设置你自己的通知应用程序/服务器
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.support.v4.content.WakefulBroadcastReceiver;


public class FirebaseDataReceiver extends WakefulBroadcastReceiver {

private final String TAG = "FirebaseDataReceiver";

public void onReceive(Context context, Intent intent) {

String dataBundle intent.getExtras().getString("gcm.notification.message");

}
}


<receiver
        android:name="PACKAGENAME.FirebaseDataReceiver"
        android:exported="true"
        android:permission="com.google.android.c2dm.permission.SEND">
        <intent-filter>
            <action android:name="com.google.android.c2dm.intent.RECEIVE" />
        </intent-filter>
</receiver>

这可能对我们有帮助