我有一个由警报调用的广播接收器(与 AlarmManager 一起安排)。在这个接收器中,我只是从数据库中查询一个寄存器,并启动一个通知。我读到从广播接收器启动服务或活动时需要唤醒锁,但是,如果我只想显示通知(在通知面板中),是否需要唤醒锁?
问问题
5854 次
2 回答
17
在这个接收器中,我只是从数据库中查询一个寄存器,并启动一个通知。
不要在主应用程序线程上执行数据库 I/O。
我读到从广播接收器启动服务或活动时需要唤醒锁,但是,如果我只想显示通知(在通知面板中),是否需要唤醒锁?
一般来说,不,您不需要 a WakeLock
,BroadcastReceiver
甚至不需要通过_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 回答