7

我正在开发一个小型实用程序,它可以扫描二维条码,然后将每个条码提交给执行更长任务的 IntentService。

当显示活动时,它应该阻止设备休眠,直到在服务中处理条形码。如果服务完成处理,它会自行停止,但活动应该仍然可见。

我想在活动生命周期中持有一个 SCREEN_DIM_WAKE_LOCK WakeLock,但由于这种类型不会阻止 CPU 睡眠,我还需要在扫描新的二维码时在活动中获取一个 PARTIAL_WAKE_LOCK,然后释放它处理后在意图服务中。

SCREEN_DIM_WAKE_LOCK 的目的是避免用户每隔几秒钟按下电源按钮以唤醒设备并能够读取新条形码的不便。用户将不得不一个接一个地阅读大量代码,即使在没有用户交互的短时间间隔内,活动也应该存在。

我知道在 Android 中,由于我的应用程序无法控制的几种情况,无法 100% 保证应用程序处于顶部、未关闭或前台,但我想尽我所能。

那么可以持有多个WakeLocks吗?可以在哪里声明它们可以被活动和服务访问?(单例,扩展应用程序?)

4

1 回答 1

10

可以持有多个 WakeLock。实际上,当屏幕关闭时多个应用程序同时同步时,它一直都在完成。(想象一下,当屏幕锁定时,您的 GMail 和 Facebook 应用程序同时同步。他们不知道彼此会有不同的 WakeLocks。可能是也可能不是不同类型的 WakeLocks)

Android 将确保满足每个人的期望(换句话说,最大限度地消耗电池电量。)

在我看来,我认为您过度考虑了您需要 SCREEN_DIM_WAKE_LOCK 的事实,因为这可能会意外耗尽大量电池,但根据您的用例,我可能是错误的。

所以简短的回答是肯定的。您可以持有多个 WakeLock,Android 将(应该)按预期运行。唯一要记住的是你正确地释放了两个唤醒锁。

在进入屏幕顶部的问题上,我认为你应该在你的活动进入暂停状态时释放它的唤醒锁(当另一个活动在顶部时,或者故意按下电源按钮)。因为此时用户正在与另一个应用程序交互,你应该尊重它并让它控制自己的行为。在完成之前,您不必放弃服务的部分唤醒锁定。

希望这可以帮助。

于 2012-09-18T11:17:05.157 回答