【问题标题】:Does a GCM-App really need a wakelock?GCM-App 真的需要唤醒锁吗?
【发布时间】:2014-03-20 19:48:07
【问题描述】:

我不太清楚如何解释GCM Client documentation 中的这句话:

android.permission.WAKE_LOCK 权限,以便应用程序可以在收到消息时阻止处理器休眠。可选 - 仅在应用想要让设备不进入睡眠状态时使用。

.

如果您在将工作转换为服务时没有保持唤醒锁定,则实际上是在让设备在工作完成之前重新进入睡眠状态。最终结果是应用程序可能要到将来某个任意时间点才能完成对 GCM 消息的处理,这不是您想要的。

使用 WakefulBroadcastReceiver 不是必需的。如果您有一个不需要服务的相对简单的应用程序,您可以在常规 BroadcastReceiver 中拦截 GCM 消息并在那里进行处理。

我不太确定我的应用是否需要保持唤醒锁(或者它是否需要服务)。 推送通知部分对应用程序来说非常重要,它不应延迟超过几分钟。 BroadcastReceiver 是否有可能在接收到所有数据之前被挂起?

【问题讨论】:

  • GcmReceiver 仅在 Google Play Services v8.4.0 (com.google.android.gms:play-services-gcm:8.4.0) 中没有唤醒锁定权限(如 @RobMeeuwisse 所述)的情况下开始工作。在 v8.4.0 之前,在没有唤醒锁定权限的情况下使用 GcmReceiver 会发生崩溃。在没有唤醒锁权限的v8.4.0中,出现警告:“缺少唤醒锁权限,服务启动可能会延迟”

标签: android google-cloud-messaging wakelock


【解决方案1】:

BroadcastReceiver 是否有可能在接收到所有数据之前被挂起?

没有。在整个 4K 或更少的有效负载已下载并可供您使用之前,您将无法获得控制权。

但是,onReceive() 在主应用程序线程上被调用,因此如果您的工作需要超过一毫秒左右的时间,您应该使用WakefulBroadcastReceiverIntentService 来完成这项工作。或者,如果您愿意,可以使用 my WakefulIntentService 和普通的 BroadcastReceiver

【讨论】:

  • 好吧,它只会显示一个通知,但我认为这甚至需要超过一毫秒。如果已经启动的意图在显示通知之前被发送到睡眠状态会发生什么?它会永远消失,还是会在手机再次唤醒后继续工作?
  • @jreuab:“好吧,它只会显示一个通知,但我认为这甚至需要超过一毫秒”——你的代码部分不应该,除非你正在做一些磁盘 I/O检索要在Notification 中显示的数据。 “它会永远消失,还是会在手机再次唤醒时继续工作?” - 一旦手机再次唤醒,它应该会继续。但是,无法保证会持续多长时间,尤其是在设置为相当节能的设备上。
  • 因此,如果我们使用 GCM 的广播接收器,即 com.google.android.gcm.GCMBroadcastReceiver,那么我们不需要此唤醒锁定权限,因为我们在 onRecieve 中没有做任何事情。
  • @varunbhardwaj:GCM 没有在他们的文档中列出的com.google.android.gcm.GCMBroadcastReceiver。他们确实有a GcmListenerServicea GcmReceiver,虽然他们似乎是新的,我还没有和他们一起玩过。
  • GcmReceiver 可以使用和不使用唤醒锁。它检查应用程序是否具有WAKE_LOCK 权限,以在启动服务之前决定是否获取唤醒锁。完成后GcmListenerService 调用GcmReceiver.completeWakefulIntent(),如果它被获取则释放唤醒锁。
猜你喜欢
  • 1970-01-01
  • 2012-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-14
  • 1970-01-01
相关资源
最近更新 更多