C2DM广播接收器

我有一个有效的C2DM应用程序。 我在创建新的C2DM应用程序时重用了相同的包名称。

它的工作原理除外,当应用程序未运行时,不会调用BroadcastReceiver。 也就是说,如果我运行应用程序并向其发送C2DM消息,则一切正常。 但是在强制退出后,不再调用BroadcastReceiver。

我查看了很多例子,并将旧清单中的所有内容与新清单进行了比较。 特别注意类别中使用的包名,意图服务等。

问题:是否存在常见的C2DM编码/配置错误导致应用程序强制退出后未调用BroadcastReceiver?

强制退出应用程序后,当我发送C2DM消息时,我确实得到了这个日志:

01-11 00:54:43.580:WARN / GTalkService(286):[DataMsgMgr]广播意图回调:result = CANCELED forIntent {act = com.google.android.c2dm.intent.RECEIVE cat = [com.aawwpcd.pcd3] (有额外的)}

我强制退出应用程序后,为每个发送到设备的C2DM消息获取其中一个消息。

它似乎意图进入,但没有传递给我的BroadcastReceiver。

编辑:

以下是Manifest和BroadcastReceiver的相关位:

BroadcastReciever

package com.aawwpcd.pcd3.c2dm; import ... public class C2DMBroadcastReceiver extends BroadcastReceiver { @Override public IBinder peekService(Context myContext, Intent service) { return super.peekService(myContext, service); } public C2DMBroadcastReceiver() { super(); } @Override public void onReceive(Context context, Intent intent) { ... } } 

表现

                              

编辑:这可能是3.x中的新function吗? 如上所述,我的问题始于这个新的应用程序 – 为3.x编写。 我想要的是C2DM甚至在应用程序没有运行时调用BroadcastReceiver。 我没有看到。 这可能是3.x的变化吗? 它之前在2.3.x手机上工作过,我找不到任何我正在做的事情。 编写测试代码来certificate这一点将是一件麻烦事,但我认为这是下一步。

编辑:似乎与强制退出有关。 当我重新安装.apk然后向设备发送c2dm消息时,我没有任何问题; 广播接收器拿起它。 在这种情况下,当C2DM进入时,应用程序尚未运行,但一切都按预期工作。 我唯一的问题是在我强制退出应用程序之后。 之后的C2DM消息不被BroadcastReceiver拾取。

看看https://stackoverflow.com/a/7108611

在Android 3.1发行说明http://developer.android.com/about/versions/android-3.1.html#launchcontrols

从3.1开始,强制停止的应用程序默认情况下不再由C2DM重新启动。 在强制关闭后请求重新启动有一个新标志。

在你“强行退出”你的接收器几次之后你有没有监视过logcat? 您可能会看到一条“Bad Process”消息,暗示您的接收器已经崩溃了太多次,Android将不再发送它意图。 重新启动手机/重新安装应用程序可以解决您在编辑中隐含的问题。

只需将以下标志添加到您为创建推送通知而创建的待定意图中。

intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);

它应该发布这个。

如果您的手机有权限管理器。 打开应用的自动启动权限。 谷歌如何为您的手机这样做。