我正在创建一个Service
,设置为开始使用AlarmManager
(使用ELAPSED_REALTIME_WAKEUP
)。我在onStartCommand
方法中进行所有处理主要是因为:
NotificationManager
推送通知)在这种情况下,我还需要获取WakeLock吗?
据我所知,只有在创建单独的线程时才需要获取WakeLock(因为操作系统会将主线程视为空闲并进入休眠状态)。是真的还是我还有被操作系统打断的风险......打瞌睡?
答案 0 :(得分:5)
当心 - 目前您不应该将唤醒警报直接发送到服务。交付到服务不同于交付给接收者;警报管理器无法知道服务何时执行完毕,因此即使调用onStartCommand(),它也无法确保它为您保持唤醒锁定。
因此,对此,您需要有一个发送警报的接收器,在该接收器中获取唤醒锁,然后调用startService()以使服务执行并确保您不释放唤醒锁定直到服务完成。对不起这太糟糕了。 :(我认为马克或其他人可能有此帮助代码。
如果您只关心服务已经运行时会发生什么,那么您可以简化此操作的一种方法。可以在onReceiveIntent()中使用Context.peekService()来获取当前正在运行的服务,您可以在接收器中调用它以在执行唤醒锁定时执行关键代码。此外,如果您在同一过程中使用这些运行的常见情况,您可以使用服务文档中显示的相同技巧直接调用它而无需编写aidl文件。