在Pro Android 4 By Satya Komatineni , Dave MacLean书中我找到了:
Android在调用广播服务时获取部分唤醒锁定,并在从主线程中的服务返回时释放它
这是否意味着Android操作系统可以确保设备在onReceive
BroadcastReceiver
的{{1}}之间醒来?在我的情况下{{1}应该从Google Play服务中获取一个意图(GoogleLocationServices,准确地说是Geofences api)。
哪里有记录?
编辑:我也发现了here:因为可以保证在CPU进入休眠状态之前总是完全执行BroadcastReceiver.onReceive()
答案 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,它不是。习惯于复杂的系统,通常只有很小一部分系统的行为被记录下来。