1

介绍

根据AlarmManager 文档

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

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

实现广播接收器的常见模式的助手,它接收设备唤醒事件,然后将工作传递给服务,同时确保设备在转换期间不会重新进入睡眠状态。

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

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

问题

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

4

1 回答 1

0

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

根据文档,这是不正确的。引用goAsync文档:

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

于 2013-10-29T20:09:07.513 回答