2

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

  1. 不需要很长时间(从磁盘读取小文件,也许通过推送通知NotificationManager
  2. 如果需要,我可以轻松地将其设置为在单独的进程中启动。

在这种情况下,我还需要获取 WakeLock 吗?

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

4

1 回答 1

5

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

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

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

于 2011-05-30T17:48:17.740 回答