如何判断屏幕是否在android中?

van*_*ude 30 android

在Android 2.2(Level 7)中,该函数PowerManager.IsScreenOn()返回一个布尔值,如果屏幕打开则为true,如果屏幕关闭则为false.我正在为Android 1.5(Level 3)开发代码.如何在旧版Android中完成相同的任务?

我不想在我的代码中打开或关闭屏幕.我只是想知道它是什么.

Jor*_*lez 65

有一种比使用BroadcastReceivers更好的方法:

// If you use API20 or more:
DisplayManager dm = (DisplayManager) context.getSystemService(Context.DISPLAY_SERVICE);
for (Display display : dm.getDisplays()) {
    if (display.getState() != Display.STATE_OFF) {
        return true;
    }
}
return false;

// If you use less than API20:
PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);
if (powerManager.isScreenOn()){ return true; }
Run Code Online (Sandbox Code Playgroud)

请注意,Display.getState()也可以返回STATE_DOZE,STATE_DOZE_SUSPEND这意味着屏幕以特殊方式打开.有关更多信息Display.getState()及其返回值:http://developer.android.com/reference/android/view/Display.html#getState()

另请注意,虽然官方文档建议使用isInteractive()而不是isScreenOn(),如果您真的想知道屏幕的状态,Display.getState()是一个更好的选择,因为在设备不是交互式时设置屏幕的"特殊"条件.

  • return powerManager.isScreenOn(); (12认同)
  • 在新的三星S7中有一个状态称为"永远在线"功能 - 它们在屏幕上显示一个时钟 - 必须添加Disaply.FLAG_PRIVATE以忽略这种情况,否则你将返回true (3认同)
  • @GalRom 你能提供使用 Display.FLAG_PRIVATE 的代码片段吗? (2认同)

and*_*per 26

这是你应该这样做的:

PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);
boolean result= VERSION.SDK_INT>=VERSION_CODES.KITKAT_WATCH&&powerManager.isInteractive()||VERSION.SDK_INT<VERSION_CODES.KITKAT_WATCH&&powerManager.isScreenOn();
return result;
Run Code Online (Sandbox Code Playgroud)


sro*_*oes 9

我正在使用以下功能:

public boolean isInteractive() {
    PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);
    return Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT_WATCH 
        ? powerManager.isInteractive() 
        : powerManager.isScreenOn();
}
Run Code Online (Sandbox Code Playgroud)


Rom*_*rik 8

您可以通过为ACTION_SCREEN_ON和设置广播接收器来实现此目的ACTION_SCREEN_OFF.

  • 这实际上是不正确的,如文档“当设备变为交互式时发送此广播,这可能与屏幕打开无关”中所述。 (2认同)