我有一个由闹钟调用的广播接收器(使用AlarmManager安排)。在这个接收器中,我只是从数据库中查询寄存器,并启动通知。我认为当从广播接收器启动服务或活动时需要唤醒锁定,但是,如果我只想显示通知(在通知面板中),是否需要唤醒锁定?
答案 0 :(得分:17)
在这个接收器中,我只是从数据库中查询寄存器,并启动通知。
不要在主应用程序线程上执行数据库I / O.
我认为当从广播接收器启动服务或活动时需要唤醒锁定,但是,如果我只想显示通知(在通知面板中),是否需要唤醒锁定?
一般情况下,不,您不需要WakeLock
中的BroadcastReceiver
,即使是通过_WAKEUP
警报调用的AlarmManager
。 WakeLock
在这种情况下保证它会使用自己的onReceive()
保持设备唤醒。
但是,在这种情况下,您确实不应该在主应用程序线程上执行数据库I / O,并且在主应用程序线程上调用IntentService
。这里适当的模式是您将“从数据库中查询寄存器,并启动通知”移动到由BroadcastReceiver
启动的WakeLock
,以便在后台线程上完成工作。这个将需要onReceive()
,因为您现在正在{{1}}之外工作。我有a WakefulIntentService
that manages the WakeLock
for you,如果你想使用它。
答案 1 :(得分:-1)
是的,这是必要的。 我记得在内核级别,CPU将保持运行大约5秒钟。 因此,如果您无法在5秒内完成发送通知,则必须掌握唤醒锁定。并在完成工作后释放它。