简介
只要警报接收器的onReceive()方法正在执行,警报管理器就会保持CPU唤醒锁定。这可以保证在您完成广播处理之后手机不会睡眠。一旦onReceive()返回,Alarm Manager就会释放此唤醒锁定。这意味着在某些情况下,只要onReceive()方法完成,手机就会休眠。如果您的警报接收器调用了Context.startService(),则手机可能会在启动所请求的服务之前休眠。为了防止这种情况,您的BroadcastReceiver和服务需要实施单独的唤醒锁定策略,以确保电话继续运行,直到服务可用。
Android还提供WakefulBroadcastReceiver来解决此问题:
帮助实现接收设备唤醒事件的BroadcastReceiver的通用模式,然后将工作传递给服务,同时确保设备在转换期间不会重新进入休眠状态。
该课程负责为您创建和管理部分唤醒锁;您必须请求WAKE_LOCK权限才能使用它。
从api级别11开始,BroadcastReceiver提供goAsync方法,该方法允许接收器运行时间超过10秒,并将耗时的代码移动到后台线程。
问题
如果在Alarm Manager接收器的接收器中(继承自BroadcastReceiver,而不是WakefulBroadcastReceiver),我调用goAsync并为耗时的代码启动新线程,警报管理器将保持唤醒锁定,直到我在goAsync返回的pendingResult上调用finish或者我是否仍然需要在新线程上运行的代码中获取唤醒锁?
答案 0 :(得分:0)
“从api级别11开始,BroadcastReceiver提供goAsync方法 哪个允许接收器运行时间超过10秒和 将耗时的代码移到后台线程。“
根据文档,这不是真的。引用goAsync doc:
这并没有改变对相对敏感的期望 广播(在10秒内完成)