如果我不创建线程,是否需要获取WakeLock?

时间:2011-05-30 16:43:54

标签: android multithreading service wakelock

我正在创建一个Service,设置为开始使用AlarmManager(使用ELAPSED_REALTIME_WAKEUP)。我在onStartCommand方法中进行所有处理主要是因为:

  1. 不需要很长时间(从磁盘读取小文件,可能通过NotificationManager推送通知)
  2. 如果需要,我可以轻松地将其设置为在单独的过程中启动。
  3. 在这种情况下,我还需要获取WakeLock吗?

    据我所知,只有在创建单独的线程时才需要获取WakeLock(因为操作系统会将主线程视为空闲并进入休眠状态)。是真的还是我还有被操作系统打断的风险......打瞌睡?

1 个答案:

答案 0 :(得分:5)

当心 - 目前您不应该将唤醒警报直接发送到服务。交付到服务不同于交付给接收者;警报管理器无法知道服务何时执行完毕,因此即使调用onStartCommand(),它也无法确保它为您保持唤醒锁定。

因此,对此,您需要有一个发送警报的接收器,在该接收器中获取唤醒锁,然后调用startService()以使服务执行并确保您不释放唤醒锁定直到服务完成。对不起这太糟糕了。 :(我认为马克或其他人可能有此帮助代码。

如果您只关心服务已经运行时会发生什么,那么您可以简化此操作的一种方法。可以在onReceiveIntent()中使用Context.peekService()来获取当前正在运行的服务,您可以在接收器中调用它以在执行唤醒锁定时执行关键代码。此外,如果您在同一过程中使用这些运行的常见情况,您可以使用服务文档中显示的相同技巧直接调用它而无需编写aidl文件。