GCM - 以编程方式注册广播接收器时获取SERVICE_NOT_AVAILABLE

时间:2013-07-05 09:14:59

标签: android google-cloud-messaging

我正在将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);
你可以告诉我我做错了什么吗? 或者也许还有更好的方法,只有在应用程序运行时才能收到通知?

1 个答案:

答案 0 :(得分:2)

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

以下是文档的说法:

  

当应用程序收到时   com.google.android.c2dm.intent.REGISTRATION意图与错误   额外设置为SERVICE_NOT_AVAILABLE,它应该重试失败   操作(注册或注销)。

     

在最简单的情况下,如果您的应用程序只调用register和GCM   应用程序可以不是应用程序的基本部分   只需忽略错误并尝试下次再次注册   开始。否则,它应该使用重试上一个操作   指数回退。在指数后退,每次都有一个   失败,它应该等待前一段时间的两倍   再试一次。如果注册(或取消注册)操作是   同步,它可以在一个简单的循环中重试。但是,既然如此   是异步的,最好的方法是安排挂起的意图   重试该操作。