【问题标题】:How to tell if device is sleeping如何判断设备是否处于睡眠状态
【发布时间】:2020-06-08 21:39:40
【问题描述】:

这是我的场景。我有一个正在播放背景声音的应用程序。使用 BroadcastReceiver 我可以知道显示器何时关闭,然后消除声音。我还可以判断屏幕是否重新打开。但是,如果设备处于锁定状态,我不希望音频开始。因此,我等待 ACTION_USER_PRESENT 意图发出信号。这一切都有效,除了如果用户在关闭屏幕后快速重新打开屏幕,您不会收到锁定屏幕或 ACTION_USER_PRESENT 消息。那么,有没有办法判断屏幕何时重新打开,设备是否被锁定,我猜这也意味着睡眠?

【问题讨论】:

  • 如果设备实际上处于睡眠状态,则应用处理器没有执行代码。屏幕锁定完全是另一回事。
  • 很公平。那么如何判断屏幕是否被锁定呢?
  • 感谢您的提问,10 年后我一直在寻找答案,并被指出了正确的方向。我会发布我发现的内容。

标签: android


【解决方案1】:
((PowerManager) getSystemService(Context.POWER_SERVICE)).isScreenOn()

【讨论】:

  • isScreenOn() 已弃用。您应该改用 isInteractive()。
【解决方案2】:

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

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

祝你好运!

【讨论】:

  • 我试过了,但是无论屏幕是否被锁定,“显示”都返回 false。
  • 10 年前的伟大解决方案,遗憾的是它已被弃用。发布了更新的答案。
【解决方案3】:

Satur9nine 的解决方案当时是正确的,但从那时起,isKeyguardRestricatedInputMode() 就被弃用了。一些与 powerManager 相关的功能现在也已弃用。

有一个更新,更准确的解决方案:isKeyguardLocked() 用于设备是否被锁定,以及一个不同的方法来获取screen is interactive;您正在寻找两者的结合。

KeyguardManager appKeyguard = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);
PowerManager appPowerManager = (PowerManager) getSystemService(Context,POWER_SERVICE);
boolean showing = !appKeyguard.isKeyguardLocked() && appPowerManager.isInteractive();

【讨论】:

    【解决方案4】:
    ((PowerManager) getSystemService(Context.POWER_SERVICE)).isScreenOn()
    

    判断屏幕是否开启。因此,如果屏幕打开但设备已锁定,则为真。 相反,

    inKeyguardRestrictedInputMode()
    

    仅当设备被锁定时才为真。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-21
      • 1970-01-01
      • 1970-01-01
      • 2017-06-30
      • 1970-01-01
      • 1970-01-01
      • 2015-06-01
      • 2011-04-16
      相关资源
      最近更新 更多