我正在将GCM与Android应用集成,以接收推送通知。一切正常,我能够收到通知。问题是,即使应用未运行,我也会收到这些通知,但是当应用正在运行时,我需要 。
所以我想如果我将在应用程序中以编程方式注册广播接收器,并在onDestroy()
中取消注册它将完成这项工作。
但是这不起作用,当尝试获取注册ID时,它返回SERVICE_NOT_AVAILABLE。
这是在清单中声明的广播接收器有效,但我一直收到通知:
<receiver android:name=".service.MyBroadcastReceiver"
android:permission="com.google.android.c2dm.permission.SEND">
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE"/>
<category android:name="com.testgcm"/>
</intent-filter>
</receiver>
这是我以编程方式创建它的方式,但收到上述错误:
receiver = new MyBroadcastReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction("com.google.android.c2dm.intent.RECEIVE");
filter.addCategory("com.testgcm");
registerReceiver(receiver, filter, "com.google.android.c2dm.permission.SEND", null);
你可以告诉我我做错了什么吗?
或者也许还有更好的方法,只有在应用程序运行时才能收到通知?
答案 0 :(得分:2)
事实证明,这与我以编程方式注册BroadcastReceiver
这一事实关系不大,但实际上它代表了注册失败的操作。
以下是文档的说法:
当应用程序收到时 com.google.android.c2dm.intent.REGISTRATION意图与错误 额外设置为SERVICE_NOT_AVAILABLE,它应该重试失败 操作(注册或注销)。
在最简单的情况下,如果您的应用程序只调用register和GCM 应用程序可以不是应用程序的基本部分 只需忽略错误并尝试下次再次注册 开始。否则,它应该使用重试上一个操作 指数回退。在指数后退,每次都有一个 失败,它应该等待前一段时间的两倍 再试一次。如果注册(或取消注册)操作是 同步,它可以在一个简单的循环中重试。但是,既然如此 是异步的,最好的方法是安排挂起的意图 重试该操作。