Android接收并显示双GCM推送通知

时间:2017-02-23 18:38:10

标签: android notifications google-cloud-messaging gcmlistenerservice

每当我的应用程序在后台接收到推送时,它就会自动处理并显示。

每当应用程序位于前台时,都会使用我的GCMMessageHandler类手动显示推送。

以下是GCMMessageHandler

的摘要
@Override
public void onMessageReceived(String from, Bundle data) {
    super.onMessageReceived(from, data);

    MyNotification notification = new MyNotification(getApplicationContext(), data);
    notification.handleNotification();
}

问题在于,只要我的应用处于后台,推送通知就会显示两次而不是一次(在这种情况下,onMessageReceived显然不会被调用)。

我发现问题出在哪里,但我不知道如何修复它。

这是在我的AndroidManifest.xml文件中:

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

            <category android:name="com.codepath.gcmquickstart" />
        </intent-filter>
    </receiver>

    <service
        android:name=".helpers.GCMMessageHandler"
        android:exported="false">
        <intent-filter>
            <action android:name="com.google.android.c2dm.intent.RECEIVE" />
        </intent-filter>
    </service>

我注意到如果删除以下行:

<action android:name="com.google.android.c2dm.intent.RECEIVE" />

来自其中任何一个声明,通知不再显示两次,但前景通知不再起作用(onMessageReceived永远不再被调用)。

如果我从接收器或服务中删除该行,则行为完全相同。

知道如何正确地执行此操作,以便在应用程序处于后台时,我的通知将只显示一次,而在前台时仍会调用onMessageReceived吗?

1 个答案:

答案 0 :(得分:1)

根据GCM文档的Canonical IDs部分,声明“如果客户端应用程序中的错误触发同一设备的多个注册,则很难协调状态,客户端应用程序可能会结束重复邮件。“

要使用规范ID,此SO question可以帮助您了解如何使用GCM实现它。

如需更多信息,请查看这些问题是否可以帮助您。