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