3

当应用程序在后台或关闭时,我的 GCM 实现正常工作,应该是这样。

但是当“后台数据”(在设备的“帐户和同步”设置中)被禁用时,我不再收到 GCM 通知。

我不能 100% 确定这是否是“背景数据”设置的唯一原因,但根据我们的实验,“背景数据”似乎是应用程序是否接收 GCM 的变量。

我的第一个问题:

这是预期的行为,还是我们在做一些根本错误的事情?

我的第二个问题:

我从一位程序员同事那里听说,有些人创建了一个新服务来生活在后台并收听传入的 GCM。

我仍在试图弄清楚这背后的逻辑,但这听起来像是一个可行的选择吗?

对不起,我的问题含糊不清。

我仍在努力设计解决此问题的解决方案,所以...

4

2 回答 2

3

就像 Google Play 需要启用后台数据的Google Play一样,我猜 GCM 也是这样做的。

当您尝试访问 GCM 并且手机上没有注册帐户时,GCM 服务会返回错误 ACCOUNT_MISSING,当您检测到它时,您应该重定向到 ACCOUNT_SETTINGS,以便用户可以添加谷歌邮件。之后,您必须使用 ConnectivityManager 函数getBackgroundDataSetting()检测是否启用了该背景数据。

照顾好它,它在 >= 14 API 上已被弃用,您将不得不使用 getActiveNetworkInfo() 来查看 apperas 是否因为用户禁用了后台数据而断开连接。

如果您看到最后一个链接,则其他方式是使用过滤器 ACTION_BACKGROUND_DATA_SETTING_CHANGED 注册侦听器(但在 API 16 上已弃用)。

IntentFilter intentFilter = new IntentFilter(); 
intentFilter.addAction(ConnectivityManager.ACTION_BACKGROUND_DATA_SETTING_CHANGED);
于 2013-03-12T16:04:51.443 回答
1

根据安卓手册:

后台数据控制应用程序和服务是否可以在您不直接使用它们时传输数据

它没有明确说背景数据是 GCM,但是有很多证据和一堆线程都说:

禁用后台数据时不传递 GCM 消息

您可以轻松地自己测试,禁用后台数据,转到网络版的 Play 商店安装应用程序。只有当您重新启用后台数据时,您才会收到它。如果连谷歌都做不到,那么你也可能做不到。

如果您仍然认为在禁用后台数据时看到应用程序接收 GCM 消息,可能是因为:

  • 在较新的 android 手机中,您可以为每个应用程序启用后台数据,可能它是为另一个应用程序启用的
  • 您看到的可能不是 GCM 通知,但是当 GCM 不可用时,应用程序会退回到轮询服务器

如果您仍然不相信,那么将您的手机设置为在您的机器上使用代理服务器(如 burp 套件),您将能够看到其他应用程序在网络上正在做什么。

于 2013-03-21T21:12:26.407 回答