每当我的应用程序在后台接收到推送时,它就会自动处理并显示。
每当应用程序位于前台时,都会使用我的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吗?
答案 0 :(得分:1)
根据GCM文档的Canonical IDs部分,声明“如果客户端应用程序中的错误触发同一设备的多个注册,则很难协调状态,客户端应用程序可能会结束重复邮件。“
要使用规范ID,此SO question可以帮助您了解如何使用GCM实现它。
如需更多信息,请查看这些问题是否可以帮助您。