Android 如何在onStop()中检查屏幕开/关状态?

Android 如何在onStop()中检查屏幕开/关状态?,android,android-activity,android-broadcast,Android,Android Activity,Android Broadcast,如上所述,当屏幕关闭时,将调用当前活动的onStop()。调用我的活动的onStop()时,我需要检查屏幕的开/关状态。因此,我为这些操作注册了一个BroadcastReceiver(ACTION\u SCREEN\u ON和ACTION\u SCREEN\u OFF)来记录当前的开/关状态(它们工作正常,我已记录!)。 但是,当我关闭屏幕并在顶部的中检查开/关状态时,它表示屏幕已打开。为什么?我认为在调用onStop之前,接收器必须接收ACTION\u SCREEN\u OFF,所以有什么问题

如上所述,当屏幕关闭时,将调用当前活动的
onStop()
。调用我的
活动
onStop()
时,我需要检查屏幕的开/关状态。因此,我为这些操作注册了一个
BroadcastReceiver
ACTION\u SCREEN\u ON
ACTION\u SCREEN\u OFF
)来记录当前的开/关状态(它们工作正常,我已记录!)。

但是,当我关闭屏幕并在顶部的
中检查开/关状态时,它表示屏幕已打开。为什么?我认为在调用
onStop
之前,接收器必须接收
ACTION\u SCREEN\u OFF
,所以有什么问题吗?

您可以尝试使用PowerManager系统服务来实现此目的,下面是示例和(注意此方法是在API级别7中添加的):

编辑:

isScreenOn()方法是不推荐使用的API级别21。您应该改用isInteractive:

boolean isScreenOn = pm.isInteractive();

如中所述,请回答类似问题。 在API 21及以上版本中,我们可以使用
DisplayManager
来确定显示器的状态。其优点是支持查询多个显示:

DisplayManager dm = (DisplayManager) 
context.getSystemService(Context.DISPLAY_SERVICE);
for (Display display : dm.getDisplays()) {
    if (display.getState() != Display.STATE_OFF) {
        return true;
    }
}
return false;
根据您的情况,查询特定视图显示的显示器可能更合适:

myView.getDisplay().getState() != Display.STATE_OFF

“我认为在调用onStop之前,接收者必须先接收到关闭屏幕的动作,所以有什么不对?”--我不知道你为什么会这样认为。使用
Log
语句或断点,查看首先调用哪个。更好的是,重新设计你的应用程序,使其不在乎是否因为屏幕关闭而调用了
onStop()
,与其他原因相比。@commonware应用程序必须能够在调用
onStop
的不同情况下有所不同,因此,我必须知道关闭屏幕是否导致调用
onStop
,或者其他事情。有更好的解决方案吗?“该应用程序必须能够在不同的情况下区分onStop被调用的情况”——为什么?屏幕关闭、用户按下HOME键、用户按下BACK键、用户接听来电、用户点击通知或用户做了其他任何导致您的活动不再可见的事情,这对您的应用程序有什么影响?屏幕关闭通常不是特例。因为我正在开发一个解锁应用程序,任何导致调用
onStop
的事情都应该在我的应用程序中处理,所以我尝试定义调用
onStop
的任何情况,以便我可以区分按home按钮和其他按钮。无论如何让我们回到我的第一个问题!你知道吗?当屏幕打开或关闭时,你想在
onStop
中做什么?也许有一种更简单的方法来完成这项工作。太棒了,亚历山大!
BroadcastReceiver
在我想要的时候没有收到操作,但这一个成功了:)
pm.isScreenOn()
被弃用。@SuperThomasLab应该用什么来代替?Samsungs总是在屏幕上显示这样的东西会影响
isInteractive()
功能吗?@Ruchirboronia发现了:什么是Utils.hasloplipop?这是如何更好地回答这个问题的?@Jaward
public static boolean haslopop(){return Build.VERSION.SDK_INT>=21;}
isScreenOn()已被弃用,但isInteractive()不能低于21。它可以工作,但我有一个问题。我在onStop()中使用了这段代码。当我离开应用程序时(并没有完全杀死它),它会像我预期的那样返回true。但是当我关闭设备时,它不会返回false。只有当我返回应用程序并在应用程序处于前台时关闭设备时,它才会返回false。我想要的是,当应用程序处于后台状态时,我想检查状态。@AbdulsametKılınçarslan,因此当您将应用程序发送到后台时,会调用此代码。但是,当你关闭设备时,它没有收到呼叫?我相信如果这段代码在onStop()中,那是因为onStop()只有在活动被销毁时才会被调用。这只会发生一次。你可能需要做这篇文章的OP正在做的事情,并使用广播接收器来收听屏幕关闭事件。
DisplayManager dm = (DisplayManager) 
context.getSystemService(Context.DISPLAY_SERVICE);
for (Display display : dm.getDisplays()) {
    if (display.getState() != Display.STATE_OFF) {
        return true;
    }
}
return false;
myView.getDisplay().getState() != Display.STATE_OFF