Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/201.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 调用BroadcastReceiver时是否需要获取唤醒锁_Android_Broadcastreceiver_Android Broadcast_Android Wake Lock_Android Geofence - Fatal编程技术网

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

Android 调用BroadcastReceiver时是否需要获取唤醒锁,android,broadcastreceiver,android-broadcast,android-wake-lock,android-geofence,Android,Broadcastreceiver,Android Broadcast,Android Wake Lock,Android Geofence,我在书中发现: Android在调用广播服务时获得部分唤醒锁,并在从主线程中的服务返回时释放该锁 这是否意味着Android操作系统将确保设备在经历BroadcastReceiver的onReceive时醒来?在我的情况下,BroadcastReceiver应该从Google Play Services(准确地说是Google LocationServices)获得一个意图 记录在哪里? 编辑:我还找到了: 因为可以保证BroadcastReceiver.onReceive()在CPU进入睡眠状

我在书中发现:

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

这是否意味着Android操作系统将确保设备在经历
BroadcastReceiver
onReceive
时醒来?
在我的情况下,
BroadcastReceiver
应该从Google Play Services(准确地说是Google LocationServices)获得一个意图

记录在哪里?

编辑:我还找到了:

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


没有所谓的“广播服务”

此外,您还需要阅读包含第二条引语的整篇文章,因为对于由
AlarmManager
触发的广播,这是唯一的。持有唤醒锁的是
AlarmManager
,而不是广播
Intent
机制。此外,正如在那篇博文中所指出的,黛安娜·哈克伯恩证实了这一行为,她是安卓系统的核心工程师

这是否意味着Adnroid OS可确保设备在通过BroadcastReceive时唤醒

不一般

在我的例子中,BroadcastReceiver应该从GooglePlay服务(GoogleLocationServices,确切地说是Geofences api)获得意图

如果Google Play Services文档没有对您的接收器在唤醒方面的行为做出任何声明,您应该假设您不在
唤醒锁
内。如果工作需要1-2毫秒,因此在
onReceive()
中可能是安全的,欢迎您冒险跳过
WakeLock
,并希望一切顺利

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

记录在哪里

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