屏幕关闭时识别音量按钮按下 Android

Posted

技术标签:

【中文标题】屏幕关闭时识别音量按钮按下 Android【英文标题】:Recognize volume button presses when screen is off Android 【发布时间】:2014-01-14 16:44:12 【问题描述】:

我正在尝试识别用户何时在屏幕关闭时按下音量键来更新活动。根据我的阅读,BroadcastReceivers(我认为)在手机处于睡眠状态时不起作用,因此唯一的方法是使用 PARTIAL_WAKE_LOCK 保持活动运行。我的应用程序是一个基本的应用程序,不应该使用太多电池,但我担心使用 PARTIAL_WAKE_LOCK 可能会耗尽电池(这违背了在屏幕关闭时识别按钮按下的目的)。

PARTIAL_WAKE_LOCK 实际上会成为基本应用程序的问题吗?如果是这样,最好的方法是什么?如果不是,使用 PARTIAL_WAKE_LOCK 的最佳方法是什么(即我应该何时获取/释放它)?

提前致谢。

【问题讨论】:

Detect Volume Button Press when Screen off 的可能重复项 是的,但该帖子是关于服务的,不包含示例代码或回答如何使用锁。 @husam 请不要为此一直保持唤醒锁,它会使手机保持唤醒和 CPU 运行,不允许它进入睡眠状态,从而消耗用户的电池。 【参考方案1】:

这里有两个问题;我将专注于其中的“WAKELOCK”部分。

唤醒锁因消耗移动设备的电池而臭名昭著。了解设备会使屏幕变暗,然后在关闭 CPU 并进入“睡眠”模式之前关闭屏幕。这对您的手机来说是极其重要的一步,因为它可以节省电池电量。

唤醒锁非常危险,因为完成后很容易忘记释放锁。

一般来说,您不应该在设备尝试睡眠时尝试保持其处于唤醒状态;当您耗尽他们的电池时,这会激怒您的用户。

这里有一些技巧可以更好地处理唤醒锁:

1) 仅当用户已对接/充电时才允许此操作

2) 使用接受超时参数的 WakeLock.aquire(..) 版本。这样,您可以醒来,检查某些状态,然后如果没有发生任何事情,则自动重新进入睡眠状态。 (见http://goo.gl/FkrO8)

3) 使用 AlarmManager 创建不精确的计时器;这将允许您的应用在其他应用也被唤醒以进行工作时被唤醒。

4) 使用 JobScheduler API(在 L 中发布),它允许您从单个 API 处理这种类型的调度和工作延迟。 (见http://goo.gl/Z1AqSn)

【讨论】:

对于第 4 种选择,您可以在您的活动/片段收到 onResume 回调时检查当前设备状态的变化。这样,您将完全跳过唤醒锁的使用:)。这仅解决活动移至前台时的初始状态。对于实时更新,请继续使用广播接收器。【参考方案2】:

这几乎是不可能的,因为这是在窗口管理器层处理的。有关从操作系统方面启用它的示例,请参阅此补丁。它需要修改您作为第三方开发人员无权访问的内容。否则,您将不得不持有唤醒锁。您将在处理该问题的提交中看到有关停靠/收费的内容。

http://review.cyanogenmod.org/#/c/80351/

【讨论】:

以上是关于屏幕关闭时识别音量按钮按下 Android的主要内容,如果未能解决你的问题,请参考以下文章

如何检测音量上下是不是被按下

按下音量按钮时更改音量滑块位置

音量未更改时检测硬件音量按钮按下

检测音量按钮即使在音量最大时按下

如何隐藏按下音量增大/减小按钮时弹出的消息

按下电源按钮关闭屏幕正在重新启动活动