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

时间:2016-08-19 19:16:19

标签: android firebase firebase-cloud-messaging

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

基于概念: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
            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

以下是一些相关链接:

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

1 个答案:

答案 0 :(得分:16)

上端的android解决方案是正确的。实际上,通知消息就是问题所在。它发送给我的数据&#34;对象但不是&#34;通知&#34;宾语。缺乏&#34;通知&#34;我的TargetActivity中的对象没有使用getIntent()收到邮件。发送&#34;通知&#34;它解决了我的问题。

下面给出了正确的消息格式:

{
 "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中检索数据有效负载。详细说明,如果您有&#34; click_action&#34;:&#34; launch_Activity_1&#34;,您可以通过仅来自Activity_1的getIntent()来检索此意图。

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

另外,我建议您使用onMessageReceived方法(请参阅数据消息)来提取数据包。根据您的逻辑,我检查了捆绑对象,但未找到预期的数据内容。以下是对可能提供更清晰的类似案例的引用。