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

问题描述 投票:0回答:4

正如这里提到的,当屏幕关闭时,当前Activity的

onStop()
将被调用。当我的
onStop()
Activity
被调用时,我需要检查屏幕开/关状态。所以我为这些操作注册了一个
BroadcastReceiver
ACTION_SCREEN_ON
ACTION_SCREEN_OFF
)来记录当前的开/关状态(并且它们工作正常,我已经记录了!)。
但是当我关闭屏幕并检查
onStop
中的开/关状态时,它说屏幕已打开。为什么?我认为接收者必须在调用
ACTION_SCREEN_OFF
之前接收到
onStop
,所以出了什么问题?

android android-activity android-broadcast
4个回答
79
投票

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

PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
boolean isScreenOn = pm.isScreenOn();

编辑:

isScreenOn() 方法已在 API 级别 21 中弃用。您应该使用 isInteractive 来代替:

Java:

PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
boolean isScreenOn = pm.isInteractive();

科特林:

val pm = applicationContext.getSystemService(Context.POWER_SERVICE) as PowerManager
var isScreenOn = pm.isInteractive

http://developer.android.com/reference/android/os/PowerManager.html#isInteractive()


3
投票

此答案中提到的类似问题。 在 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

1
投票

如果您想手动检查屏幕状态而不是广播接收器,则应该考虑一些情况。

  • 屏幕可能会在打瞌睡模式下处于活动状态(三星的始终显示功能)
  • VR 模式可能已启用

为了检查屏幕是否未关闭且用户正在主动使用手机,屏幕状态不得为 Display.STATE_OFF 且不得处于 keyguardManager.isKeyguardLocked() 状态。

public static boolean isDeviceActive(
        @NonNull DisplayManager displayManager,
        @NonNull KeyguardManager keyguardManager
) {
    for (Display display : displayManager.getDisplays()) {
        if (display.getState() != Display.STATE_OFF) {
            return !keyguardManager.isKeyguardLocked();
        }
    }
    return false;
}

0
投票
PowerManager pm = (PowerManager) mMainActivity.getSystemService(Context.POWER_SERVICE);
boolean isScreenOn = Utils.hasLollipop() ? pm.isInteractive() : pm.isScreenOn();
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.