【发布时间】:2013-03-09 08:50:04
【问题描述】:
我有一个由警报调用的广播接收器(由 AlarmManager 安排)。在这个接收器中,我只是从数据库中查询一个寄存器,并启动一个通知。我读到从广播接收器启动服务或活动时需要唤醒锁,但是,如果我只想显示通知(在通知面板中),是否需要唤醒锁?
【问题讨论】:
标签: android broadcastreceiver wakelock
我有一个由警报调用的广播接收器(由 AlarmManager 安排)。在这个接收器中,我只是从数据库中查询一个寄存器,并启动一个通知。我读到从广播接收器启动服务或活动时需要唤醒锁,但是,如果我只想显示通知(在通知面板中),是否需要唤醒锁?
【问题讨论】:
标签: android broadcastreceiver wakelock
在这个接收器中,我只是从数据库中查询一个寄存器,并启动一个通知。
不要在主应用程序线程上进行数据库 I/O。
我读到从广播接收器启动服务或活动时需要唤醒锁,但是,如果我只想显示通知(在通知面板中),是否需要唤醒锁?
一般来说,不,您不需要来自BroadcastReceiver 的WakeLock,即使是通过_WAKEUP 警报调用的WakeLock。 AlarmManager 保证在这种情况下,它将使用自己的 WakeLock 保持设备唤醒。
但是,在这种情况下,您确实不应该在主应用程序线程上执行数据库 I/O,并且在主应用程序线程上调用 onReceive()。此处的正确模式是将“从数据库中查询寄存器并启动通知”移动到由BroadcastReceiver 启动的IntentService,以便在后台线程上完成工作。这将需要WakeLock,因为您现在在onReceive() 之外工作。我有a WakefulIntentService that manages the WakeLock for you,如果你想用的话。
【讨论】:
WakefulIntentService 是专门为这种情况设计的。 “因此我建议简单地使用 WakefulBroadcastReceiver”——每种方法都有利有弊;它们中的任何一个都没有本质上的错误。
WakeLock。
是的,这是必要的。 我记得在 Kernel 级别,CPU 会保持运行大约 5 秒。 因此,如果您无法在 5 秒内完成发送通知,则必须抓住唤醒锁。完成工作后再发布。
【讨论】: