当应用程序处于后台状态时,Google FCM getIntent 未返回预期数据
Posted
技术标签:
【中文标题】当应用程序处于后台状态时,Google FCM getIntent 未返回预期数据【英文标题】:Google FCM getIntent not returning expected data when app is in background state 【发布时间】:2016-12-27 00:59:45 【问题描述】:我正在我的应用程序中实现 FCM(Firebase 消息传递服务)。这里一切似乎都很好,除非当应用程序处于后台状态时,我无法提取预期的通知数据。
基于概念:FCM 中有两种类型的消息:
display-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 会显示 manifest 文件如下所示的消息:
<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
在onCreate
和onNewIntent
方法中,我正在使用这种方式提取消息:
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
以下是一些相关链接:
https://github.com/firebase/quickstart-android/issues/4 https://github.com/firebase/quickstart-android/issues/47 How to handle notification when app in background in Firebase Firebase onMessageReceived not called when app in background How to handle notification when app in background in Firebase提前致谢。抱歉英语不好。
【问题讨论】:
能否请您发布您的 onMessageReceived 方法?我认为问题可能出在该方法上,因此您的 NotificationActivity 没有收到通知数据。 【参考方案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 回调处理。这些本质上就是所谓的显示消息。
数据消息:在Android平台上,数据消息可以在后台和前台工作。数据消息将由 onMessageReceived() 处理。 这里有一个特定于平台的说明:在 Android 上,可以在用于启动您的活动的 Intent 中检索数据有效负载。详细地说,如果你有 "click_action":"launch_Activity_1",你可以通过 getIntent() 仅从 Activity_1 中检索这个意图。
同时包含通知和数据负载的消息: 在后台时,应用程序在通知托盘中接收通知负载,并且仅在用户点击通知时处理数据负载。 在前台时,您的应用会收到一个消息对象,其中包含两个可用的有效负载。 其次,click_action 参数通常用于通知负载而不是数据负载。如果在数据负载中使用,此参数将被视为自定义键值对,因此您需要实现自定义逻辑以使其按预期工作。
另外,我建议您使用onMessageReceived
方法(请参阅数据消息)来提取数据包。根据您的逻辑,我检查了 bundle 对象并没有找到预期的数据内容。这是对类似案例的参考,可能会提供更清晰的信息。
【讨论】:
正确。您也可以在 Firebase 控制台中执行此操作。在Advanced options
下填写 custom data
作为键值对。然后,就可以从intent.getExtra()
获取数据了;
很高兴您找到了解决方案。您能否编辑原始问题以澄清“显示消息:这些消息仅在您的应用程序处于前台时才有效”段落。 “显示消息是:如果应用程序在后台,则在通知托盘中自动显示,如果应用程序在前台,则触发 onMessageReceived()。” ?请参阅:firebase.google.com/docs/cloud-messaging/… 非常感谢,如果有不清楚的地方,请继续提问!
当您的应用程序处于后台并且您的通知将由 FCM 自动生成时,您将如何向任何活动发送数据?
在 menifest.xml 的目标活动中添加意图过滤器 以上是关于当应用程序处于后台状态时,Google FCM getIntent 未返回预期数据的主要内容,如果未能解决你的问题,请参考以下文章
FCM点击应用处于后台状态时如何打开用户指定的活动而不是默认活动