一个GCM-App是否真的需要一个wakelock?

12

我不太确定如何解释GCM客户端文档中的这个句子:

android.permission.WAKE_LOCK权限允许应用在接收到消息时防止处理器休眠。可选-只有当应用程序想要防止设备休眠时才使用。

.

如果在将工作转移到服务时不持有唤醒锁,则实际上允许设备在工作完成之前返回睡眠状态。结果是,应用程序可能直到将来的某个任意时间才能完成处理 GCM 消息,这不是您想要的。

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

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


4
在Google Play服务v8.4.0 (com.google.android.gms:play-services-gcm:8.4.0)中,GcmReceiver只要没有唤醒锁权限就可以正常工作(如@RobMeeuwisse所提到的)。在v8.4.0之前,如果没有唤醒锁权限使用GcmReceiver会导致崩溃。在没有唤醒锁权限时,v8.4.0会显示警告:"缺少唤醒锁权限,服务启动可能会延迟"。 - user1652110
1个回答

5

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

不会。只有当整个小于等于4K的数据有效下载并可用时,您才能获得控制权。

但是,onReceive()在主应用程序线程上调用,因此如果您的工作需要花费一毫秒以上的时间,则应使用WakefulBroadcastReceiverIntentService进行该项工作。或者,如果您愿意,可以使用我的WakefulIntentService和常规的BroadcastReceiver


2
它只会显示一个通知,但我认为即使这样也需要超过一毫秒的时间。如果已启动的意图在显示通知之前被休眠,会发生什么呢?它会永远消失还是在手机再次唤醒时继续工作? - Johann Bauer
1
@jreuab:“好吧,它只会显示一个通知,但我认为即使这样也需要超过一毫秒的时间”——除非您正在执行某些磁盘I/O以检索要在“通知”中显示的数据,否则您的代码部分不应该需要那么长时间。“它会永远消失还是在手机再次唤醒时继续工作?”——它应该会在手机再次唤醒时立即继续工作。虽然无法保证这将持续多长时间,特别是在设置了相当激进的省电模式的设备上。 - CommonsWare
所以,如果我们正在使用GCM的广播接收器,即com.google.android.gcm.GCMBroadcastReceiver,那么我们不需要这个唤醒锁权限,因为我们在onRecieve中没有做任何事情。 - varun bhardwaj
1
@varunbhardwajпјҡGCMеңЁе…¶ж–ҮжЎЈдёӯжІЎжңүеҲ—еҮәcom.google.android.gcm.GCMBroadcastReceiverгҖӮ他们确е®һжңүдёҖдёӘGcmListenerServiceе’ҢдёҖдёӘGcmReceiverпјҢдҪҶе®ғ们似д№ҺжҳҜж–°зҡ„пјҢжҲ‘иҝҳжІЎжңүдҪҝз”ЁиҝҮе®ғ们гҖӮ - CommonsWare
2
GcmReceiver 可以使用和不使用 wake lock。它会检查应用是否具有 WAKE_LOCK 权限,以决定在启动服务之前是否获取 wake lock。当 GcmListenerService 完成后,会调用 GcmReceiver.completeWakefulIntent(),如果已经获取了 wake lock,则会释放它。 - Rob Meeuwisse
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接