我正在我的应用程序中实现FCM(Firebase消息服务)。除了应用处于后台状态时,这里所有其他内容似乎都还不错,我无法提取预期的通知数据。
基于概念:FCM中有两种消息类型:
显示消息:仅当您的应用程序位于前台时,这些消息才起作用。
数据消息:即使您的应用程序在后台运行,这些消息仍然有效
当我们的应用程序在后台运行时,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
和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
crash_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
中缺少“notification”对象,但没有使用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上,可以在用于启动 Activity 的Intent中检索数据有效负载。详细地说,如果您具有“click_action”:“launch_Activity_1”,则可以仅从Activity_1通过getIntent()检索此 Intent 。
带有通知和数据有效载荷的消息:
在后台时,应用程序会在通知托盘中接收通知有效载荷,并且仅在用户点击通知时处理数据有效载荷。
在前台时,您的应用程序会收到一个同时具有两个有效负载的消息对象。
其次,click_action参数通常用于通知有效负载中,而不用于数据有效负载中。如果在数据有效载荷内部使用,则此参数将被视为自定义键值对,因此您需要实现自定义逻辑以使其按预期工作。
另外,我建议您使用
onMessageReceived
方法(请参阅数据消息)来提取数据包。根据您的逻辑,我检查了bundle对象,但未找到预期的数据内容。这是对类似情况的引用,可能会提供更多的清晰度。关于android - 当应用程序处于后台状态时,Google FCM getIntent不返回预期数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39046270/