6

我有一个由警报调用的广播接收器(与 AlarmManager 一起安排)。在这个接收器中,我只是从数据库中查询一个寄存器,并启动一个通知。我读到从广播接收器启动服务或活动时需要唤醒锁,但是,如果我只想显示通知(在通知面板中),是否需要唤醒锁?

4

2 回答 2

17

在这个接收器中,我只是从数据库中查询一个寄存器,并启动一个通知。

不要在主应用程序线程上执行数据库 I/O。

我读到从广播接收器启动服务或活动时需要唤醒锁,但是,如果我只想显示通知(在通知面板中),是否需要唤醒锁?

一般来说,不,您不需要 a WakeLockBroadcastReceiver甚至不需要通过_WAKEUP警报调用的 a 。AlarmManager保证在这种情况下,它将使用自己的WakeLock.

但是,同样,在这种情况下,您真的不应该在主应用程序线程上执行数据库 I/O,onReceive()而是在主应用程序线程上调用。此处的正确模式是您将“从数据库中查询寄存器并启动通知”移动到IntentService由您启动的BroadcastReceiver,以便在后台线程上完成工作。这需要一个WakeLock,因为您现在在onReceive(). 我有一个为你WakefulIntentService管理的WakeLock,如果你想使用它。

于 2013-03-20T12:44:23.437 回答
-1

是的,这是必要的。我记得在 Kernel 级别,CPU 会保持运行大约 5 秒。因此,如果您无法在 5 秒内完成发送通知,则必须抓住唤醒锁。并在完成工作后发布。

于 2013-03-20T10:24:59.283 回答