1

我正在将 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);

你能告诉我我做错了什么吗?或者也许有更好的方法,以便仅在应用程序运行时接收通知?

4

1 回答 1

2

事实证明,这与我以BroadcastReceiver编程方式注册的事实关系不大,但实际上它代表了注册操作失败。

这是文档所说的:

当应用程序收到 com.google.android.c2dm.intent.REGISTRATION Intent 并将错误附加设置为 SERVICE_NOT_AVAILABLE 时,它应该重试失败的操作(注册或取消注册)。

在最简单的情况下,如果您的应用程序只是调用 register 并且 GCM 不是应用程序的基本部分,则应用程序可以简单地忽略错误并在下次启动时再次尝试注册。否则,它应该使用指数退避重试先前的操作。在指数回退中,每次出现故障时,它都应该等待两倍于之前的时间,然后再重试。如果注册(或取消注册)操作是同步的,则可以在一个简单的循环中重试。但是,由于它是异步的,最好的方法是安排一个挂起的意图来重试操作。

于 2013-07-23T08:52:34.490 回答