【问题标题】:do I need a wake lock in my broadcastreceiver if I'm not starting a service or an activity?如果我没有启动服务或活动,是否需要在我的广播接收器中设置唤醒锁?
【发布时间】:2013-03-09 08:50:04
【问题描述】:

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

【问题讨论】:

标签: android broadcastreceiver wakelock


【解决方案1】:

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

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

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

一般来说,不,您不需要来自BroadcastReceiverWakeLock,即使是通过_WAKEUP 警报调用的WakeLockAlarmManager 保证在这种情况下,它将使用自己的 WakeLock 保持设备唤醒。

但是,在这种情况下,您确实不应该在主应用程序线程上执行数据库 I/O,并且在主应用程序线程上调用 onReceive()。此处的正确模式是将“从数据库中查询寄存器并启动通知”移动到由BroadcastReceiver 启动的IntentService,以便在后台线程上完成工作。这需要WakeLock,因为您现在在onReceive() 之外工作。我有a WakefulIntentService that manages the WakeLock for you,如果你想用的话。

【讨论】:

  • 谢谢!你回答了我所有关于它的问题:) 我会看看你的 WakefulIntentService 来完成 IntentService 中的所有工作,并使用 WakeLock。
  • 如果我错了,请纠正我,但我认为设备有可能在 BroadCastReceiver 的 onReceive() 完成时重新进入睡眠状态,但您的 WakefulIntentService 尚未启动或尚未启动t 获得了唤醒锁,因此我建议简单地使用 WakefulBroadcastReceiver (在接受答案后添加到支持库中):developer.android.com/reference/android/support/v4/content/…
  • @Su-AuHwang:“如果我错了,请纠正我”——你错了。 WakefulIntentService 是专门为这种情况设计的。 “因此我建议简单地使用 WakefulBroadcastReceiver”——每种方法都有利有弊;它们中的任何一个都没有本质上的错误。
  • @CommonsWare,当我启动服务时,不应该在每种情况下都需要 WAKE_LOCK 吗?为什么只在某些特殊情况下? CPU 在任何情况下都可以进入睡眠状态。
  • @Diffy:“在我启动服务时,是否应该在每种情况下都需要 WAKE_LOCK?” -- 仅当您需要 CPU 保持清醒时。 “CPU 在任何情况下都可以进入睡眠状态”——正确。并非每个服务都需要 CPU 保持清醒。而且由于保持 CPU 处于唤醒状态会耗尽电池电量,导致用户考虑使用火炬和干草叉攻击冒犯的开发人员,因此我们仅在绝对需要时使用WakeLock
【解决方案2】:

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

【讨论】:

  • 感谢您的回答。只有一个问题:我需要启动服务吗?或者我可以在接收器上做这项工作吗?
  • 投反对票,因为 BroadcastReceiver 不能做艰苦的工作(只有几秒钟,所以 5 秒真的很好)。如果你想努力工作,就开始一个服务。
猜你喜欢
  • 2011-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-05
相关资源
最近更新 更多