android - 当应用程序处于后台状态时,Google FCM getIntent 不返回预期数据

标签 android firebase firebase-cloud-messaging

我正在我的应用程序中实现 FCM(Firebase 消息服务)。这里一切似乎都正常,除非当应用程序处于后台状态时我无法提取预期的通知数据。

基于概念:FCM中有两种类型的消息:

display-messages:这些消息仅在您的应用处于前台时有效。

data-messages:即使您的应用处于后台,这些消息也能正常工作 当我们的应用程序在后台运行时,Android 会将通知消息定向到系统托盘。

为了处理数据消息,您的通知应该有click_action = "YOUR_ACTION" 字段。

我的消息会是这样的:

{
 "data": {
  "body": "here is body",
  "title": "Title",
  "click_action": "YOUR_ACTION"
 },
 "to": "ffEseX6vwcM:APA91bF8m7wOF MY FCM ID 07j1aPUb"
}

Activity 将显示 list 文件如下所示的消息:

<activity
            android:name=".NotificationActivity"
            android:screenOrientation="portrait"
            android:theme="@style/Theme.AppCompat.Dialog"
            android:windowSoftInputMode="stateHidden" >

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

点击通知后,它将重定向到我的 NotificationActivity 。在我的 NotificationActivity 中,onCreateonNewIntent 方法中,我使用这种方式提取消息:

Bundle bundle=getIntent().getExtras();
        if(bundle!=null) {
            for (String key : bundle.keySet()) {
                Object value = bundle.get(key);
                Log.d("DATA_SENT", String.format("%s %s (%s)", key,
                        value.toString(), value.getClass().getName()));
            }
        }

不幸的是,在我的 NotificationActivity 中,我收到以下消息:

google.sent_time:1471631793774

来自:50711789666

google.message_id 0:1471631793776823%098e508d098e508d

collapse_key:com.myapp.package_name

但是我预期的通知数据在哪里?

这是我的系统配置:

Android Studio 版本:2.1.3

Firebase 版本:com.google.firebase:firebase-auth:9.0.1

Google Play 服务版本:com.google.android.gms:play-services:9.2.1

以下是一些相关链接:

提前致谢。抱歉英语不好。

最佳答案

上面的android方案是正确的。实际上,问题出在通知消息上。它向我发送“数据”对象而不是“通知”对象。我的 TargetActivity 中缺少“通知”对象,因此无法使用 getIntent() 获取消息。发送“通知”对象后,它解决了我的问题。

正确的消息格式如下:

{
 "data": {
  "body": "here is body",
  "title": "Title"
 },
"notification": {
  "body": "here is body",
  "title": "Title",
  "click_action": "YOUR_ACTION"
 },
 "to": "ffEseX6vwcM:APA91bF8m7wOF MY FCM ID 07j1aPUb"
}

这里是关于 firebase 消息的更清晰的概念。我是从他们的支持团队那里找到的。 Firebase 具有三种消息类型:

通知消息:通知消息在后台或前台工作。当应用程序处于后台时,通知消息会传送到系统托盘。如果应用程序在前台,则消息由 onMessageReceived() 或 didReceiveRemoteNotification 回调处理。这些本质上就是所谓的显示消息。

Data messages:在Android平台上,data message可以在后台和前台工作。数据消息将由 onMessageReceived() 处理。 此处的平台特定说明是:在 Android 上,可以在用于启动 Activity 的 Intent 中检索数据有效负载。详细来说,如果您有“click_action”:“launch_Activity_1”,您可以通过 getIntent() 仅从 Activity_1 检索此 Intent 。

具有通知和数据负载的消息: 在后台时,应用程序在通知托盘中接收通知负载,并且仅在用户点击通知时处理数据负载。 在前台时,您的应用程序会收到一个消息对象,其中包含两个有效负载。 其次,click_action 参数通常用于通知有效载荷而不是数据有效载荷。如果在数据负载中使用,此参数将被视为自定义键值对,因此您需要实现自定义逻辑才能使其按预期工作。

此外,我建议您使用 onMessageReceived 方法(请参阅数据消息)来提取数据包。根据你的逻辑,我检查了 bundle 对象并没有找到预期的数据内容。这是对类似案例的引用,可能会更清楚。

关于android - 当应用程序处于后台状态时,Google FCM getIntent 不返回预期数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39046270/

相关文章:

当应用程序从多任务托盘停止时,Android 应用程序未收到 Firebase 通知

firebase - 如何通过HTTP向观众发送Firebase通知

android - 如何配置 Android Studio 以在其他 jetbrain ide 附带的自定义 jdk 上运行?

android - 无法从 Firebase DB 填充回收器 View

android - 应用在什么情况下会删除Firebase Instance ID?

firebase - 只允许具有特定自定义声明的用户调用 Firebase 函数

ios - FirebaseInstanceID 未正确安装 cocoapods

android - 文本到语音应用程序无法在 android studio 的模拟器中运行,但可以在 android 设备中运行

android - 在 intellij android studio 中将图像添加到 android 启动屏幕?

android - 如何在android中自定义Header