调用BroadcastReceiver时是否需要获取唤醒锁定

时间:2014-12-10 08:55:04

标签: android broadcastreceiver android-broadcast android-wake-lock android-geofence

Pro Android 4 By Satya Komatineni , Dave MacLean书中我找到了:

  

Android在调用广播服务时获取部分唤醒锁定,并在从主线程中的服务返回时释放它

这是否意味着Android操作系统可以确保设备在onReceive BroadcastReceiver的{​​{1}}之间醒来?在我的情况下{{1}应该从Google Play服务中获取一个意图(GoogleLocationServices,准确地说是Geofences api)。

哪里有记录?

编辑:我也发现了here

  

因为可以保证在CPU进入休眠状态之前总是完全执行BroadcastReceiver.onReceive()

1 个答案:

答案 0 :(得分:2)

没有"广播服务"。

此外,您需要阅读包含第二个引用的整个帖子,因为AlarmManager触发的广播。持有AlarmManager的是Intent,而不是广播WakeLock机制。此外,正如该博客文章中所述,Dianne Hackborn已经证实了这种行为,并且她是一名核心Android工程师。

  

这是否意味着Adnroid OS确保设备在通过接收BroadcastReceive时醒来?

不一般。

  

在我的情况下,BroadcastReceiver应该从Google Play服务(GoogleLocationServices和精确的Geofences api)获得意图。

如果Google Play服务文档没有就接收器关于觉醒的行为提出任何声明,则应假设您不在WakeLock内。如果工作需要1-2毫秒,因此无论如何都可以安全地进行onReceive(),我们欢迎您冒险并跳过WakeLock并希望获得最佳效果

但通常像这样的广播会触发更多的工作,包括磁盘I / O和/或网络I / O,并且您需要从主应用程序线程中完成这项工作。通常,您通过委派给IntentService来做到这一点,因为它为您提供了一个带有标记服务的后台线程,让操作系统知道您仍然在这里做一些工作。并且,为了确保设备保持清醒以完成该工作,请使用WakefulBroadcastReceiver或我的WakefulIntentService,在WakeLock之前保留onReceive(),直到完成onHandleIntent()中的工作。

  

它在哪里记录?

AFAIK,它不是。习惯于复杂的系统,通常只有很小一部分系统的行为被记录下来。