正如这里提到的,当屏幕关闭时,当前Activity的
onStop()
将被调用。当我的onStop()
的Activity
被调用时,我需要检查屏幕开/关状态。所以我为这些操作注册了一个BroadcastReceiver
(ACTION_SCREEN_ON
和ACTION_SCREEN_OFF
)来记录当前的开/关状态(并且它们工作正常,我已经记录了!)。onStop
中的开/关状态时,它说屏幕已打开。为什么?我认为接收者必须在调用 ACTION_SCREEN_OFF
之前接收到 onStop
,所以出了什么问题?
您可以尝试使用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()
如此答案中提到的类似问题。 在 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
如果您想手动检查屏幕状态而不是广播接收器,则应该考虑一些情况。
为了检查屏幕是否未关闭且用户正在主动使用手机,屏幕状态不得为 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;
}
PowerManager pm = (PowerManager) mMainActivity.getSystemService(Context.POWER_SERVICE);
boolean isScreenOn = Utils.hasLollipop() ? pm.isInteractive() : pm.isScreenOn();