设备如何进入睡眠状态的判断方法

12

这是我的情景。我有一个播放背景音乐的应用程序。使用BroadcastReceiver可以告诉我显示屏何时关闭,然后停止播放声音。我还可以知道屏幕何时重新点亮。但是,如果设备处于锁定状态,则不希望音频开始。因此,我等待ACTION_USER_PRESENT意图发出信号。所有这些都有效,除非用户在关闭屏幕后很快就重新打开它,您将无法获得锁定屏幕或ACTION_USER_PRESENT消息。那么,在屏幕重新打开时,是否有办法判断设备是否已锁定,也就是是否休眠?


如果设备正在睡眠,应用处理器将不会执行代码。屏幕锁定是完全不同的事情。 - Chris Stratton
1
好的。那么如何判断屏幕是否已锁定? - iterator
https://dev59.com/GXA75IYBdhLWcg3wqLD_ - Jared Burrows
谢谢你的问题,10年后我正在寻找答案,并被引导到了正确的方向。我会发布我所发现的内容。 - A. Abramov
4个回答

12
((PowerManager) getSystemService(Context.POWER_SERVICE)).isScreenOn()

isScreenOn()已被弃用。您应该使用isInteractive()代替。 - Manuel Domínguez

10

你可以尝试使用KeyguardManager来检查设备是否被锁定。这是一些代码(我自己还没有尝试过):

KeyguardManager kgMgr = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);
boolean showing = kgMgr.inKeyguardRestrictedInputMode();

祝你好运!


1
我尝试了,但无论屏幕是否锁定,“showing”都返回false。 - iterator
很棒的解决方案在10年前,可惜现在已经过时了。我发布了一个更新后的答案。 - A. Abramov

1
Satur9nine的解决方案在当时是正确的,但此后isKeyguardRestricatedInputMode()已被弃用。一些与powerManager相关的功能现在也已被弃用。
有一个更新、更准确的解决方案:使用isKeyguardLocked()来判断设备是否锁定,并采用不同的方法获取屏幕是否可交互;您需要结合两者。
(注:link1和link2为超链接,请保留原文)
KeyguardManager appKeyguard = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);
PowerManager appPowerManager = (PowerManager) getSystemService(Context,POWER_SERVICE);
boolean showing = !appKeyguard.isKeyguardLocked() && appPowerManager.isInteractive();

0
((PowerManager) getSystemService(Context.POWER_SERVICE)).isScreenOn()

判断屏幕是否开启。如果屏幕开启但设备被锁定,则返回true。

inKeyguardRestrictedInputMode()

只有设备被锁定时才返回真。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接