因此,我在服务内注册了 ACTION_USER_PRESENT
、ACTION_SCREEN_ON
和 ACTION_SCREEN_OFF
。
IntentFilter screenStateFilter = new IntentFilter();
screenStateFilter.addAction(Intent.ACTION_USER_PRESENT);
screenStateFilter.addAction(Intent.ACTION_SCREEN_ON);
screenStateFilter.addAction(Intent.ACTION_SCREEN_OFF);
mReceiver = new ScreenReceiver();
registerReceiver(mReceiver, screenStateFilter);
以下是一些情况:
[正确] 用户的“屏幕锁定”= 无:当我按下电源按钮时,
ACTION_SCREEN_ON
和ACTION_SCREEN_OFF
都会收到。[正确] 用户的“屏幕锁定”= 滑动:当我按下电源按钮时,会显示锁定屏幕并收到
ACTION_SCREEN_ON
。解锁后收到ACTION_USER_PRESENT
。[正确] 用户的“屏幕锁定”= 图案/PIN/密码 & 自动锁定 = 立即:当我按下电源按钮时,会显示锁定屏幕并收到
ACTION_SCREEN_ON
。解锁后收到ACTION_USER_PRESENT
。[错误] 用户的“屏幕锁定”= 图案/PIN/密码 & 自动锁定 = 15 秒:当我锁定屏幕并在 15 秒后解锁时,会显示锁定屏幕并收到
ACTION_SCREEN_ON
。解锁后收到ACTION_USER_PRESENT
。 但是当我锁定屏幕并在 15 秒之前解锁时,不会显示锁定屏幕(如预期),但仅收到ACTION_SCREEN_ON
。未收到 ACTION_USER_PRESENT。
那么,如何确保在(用户解锁屏幕)/(屏幕仍处于解锁状态时ACTION_SCREEN_ON
)时调用方法。
我已经尝试过
KeyguardManager mKeyguard = (KeyguardManager) context.getSystemService(Context.KEYGUARD_SERVICE);
if (!mKeyguard.inKeyguardRestrictedInputMode()) {
if (action.equals(Intent.ACTION_SCREEN_ON)) {
// Call method
}
}
if (action.equals(Intent.ACTION_USER_PRESENT)) {
// Call method
}
但在上述 3 种[正确]情况下,该方法将被调用两次。
<小时/>注意:这是“n秒后自动锁定”的屏幕截图:
最佳答案
您可以使用KeyGuardManager
监听 ACTION_SCREEN_ON,然后检查设备是否已锁定,如果是,则等待 ACTION_USER_PRESENT,否则立即运行您的代码。
关于java - "Automatically lock after n seconds"时未收到 ACTION_USER_PRESENT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38810866/