繁体   English   中英

接收器中的AlarmManager唤醒锁和goAsync

[英]AlarmManager wakelock and goAsync in receiver

介绍

根据AlarmManager文档

只要警报接收器的onReceive()方法正在执行,警报管理器就会保持CPU唤醒锁。 这样可以确保手机在完成广播处理之前不会进入睡眠状态。 一旦onReceive()返回,警报管理器将释放此唤醒锁。 这意味着在某些情况下,一旦onReceive()方法完成,电话就会进入休眠状态。 如果您的警报接收器称为Context.startService(),则手机可能会在启动请求的服务之前进入睡眠状态。 为避免这种情况,您的BroadcastReceiver和服务将需要实施单独的唤醒锁定策略,以确保电话继续运行,直到服务可用为止。

Android还提供了WakefulBroadcastReceiver来解决此问题:

实现广播对象的通用模式的帮助程序,该方法接收设备唤醒事件,然后将工作传递给服务,同时确保设备在过渡期间不会重新进入睡眠状态。

此类负责为您创建和管理部分唤醒锁。 您必须请求WAKE_LOCK权限才能使用它。

从api级别11开始,BroadcastReceiver提供了goAsync方法,该方法可以使接收器运行超过10秒,并将耗时的代码移动到后台线程。

如果在警报管理器的接收器(继承自BroadcastReceiver,而不是WakefulBroadcastReceiver)的接收器中,我调用goAsync并启动新线程进行耗时的代码,则警报管理器将保持唤醒锁定,直到我对从goAsync返回的pendingResult调用完成为止,还是我还是需要在新线程上运行的代码中获取唤醒锁?

“从api级别11开始,BroadcastReceiver提供了goAsync方法,该方法可以使接收器保持运行时间超过10秒,并将耗时的代码移动到后台线程。”

根据文档,情况并非如此。 要引用goAsync文档:

这不会改变对广播做出相对响应的期望(在10秒内完成)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM