【发布时间】:2025-12-14 16:15:03
【问题描述】:
有没有办法检测用户何时解锁手机?我知道ACTION_SCREEN_ON 和ACTION_SCREEN_OFF,但它们似乎是在按下电源按钮时屏幕打开/关闭时触发的,但实际上不是在按下菜单按钮时手机解锁时...
我正在尝试在活动运行时检测解锁/锁定,并且我想在解锁后恢复活动。
【问题讨论】:
标签: android
有没有办法检测用户何时解锁手机?我知道ACTION_SCREEN_ON 和ACTION_SCREEN_OFF,但它们似乎是在按下电源按钮时屏幕打开/关闭时触发的,但实际上不是在按下菜单按钮时手机解锁时...
我正在尝试在活动运行时检测解锁/锁定,并且我想在解锁后恢复活动。
【问题讨论】:
标签: android
这是怎么做的:
假设您想在手机解锁时检测解锁事件并在您的活动中执行某些操作。有一个 ACTION_SCREEN_ON、ACTION_SCREEN_OFF 和 ACTION_USER_PRESENT 的广播接收器。
在触发 ACTION_SCREEN_ON 时将调用活动的 onResume。创建一个处理程序并等待 ACTION_USER_PRESENT。当它被触发时,实现你想要的活动。
这里归功于 CommonsWare 的回答:Android -- What happens when device is unlocked?
【讨论】:
BroadcastReceiver,因为这些事件只能从 Android O (API 26) 开始动态注册(通过在 Activity 中调用 registerReceiver)。在AndroidManifest.xml 中注册这些事件不再有效,因此当应用程序未运行时(之前已被 Android 杀死或强制关闭),应用程序不再能够接收这些事件(至少 ACTION_SCREEN_ON 和 ACTION_SCREEN_OFF用户)。
经过一段时间的努力,我发现最好的方法是在“android.intent.action.USER_PRESENT”操作上注册一个 BroadcastReceiver。
“广播动作:当设备唤醒后用户在场时发送(例如,当键盘保护消失时)。”
要区分用户在手机屏幕未锁定时打开手机屏幕和实际解锁手机屏幕的情况,请使用 KeyguardManager 检查安全设置。
代码示例:
将此添加到您的活动中:
registerReceiver(new PhoneUnlockedReceiver(), new IntentFilter("android.intent.action.USER_PRESENT"));
然后使用这个类:
public class PhoneUnlockedReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
KeyguardManager keyguardManager = (KeyguardManager)context.getSystemService(Context.KEYGUARD_SERVICE);
if (keyguardManager.isKeyguardSecure()) {
//phone was unlocked, do stuff here
}
}
}
【讨论】:
if(!keyguardManager.isKeyguardLocked()) 和 !isDeviceSecure() 吗?
isDeviceLocked 以验证实际状态,而不仅仅是在“设置”中启用了安全锁。您还可以检查 KeyguardManager 的 inKeyguardRestrictedInputMode 的 API
public class PhoneUnlockedReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(Intent.ACTION_USER_PRESENT)){
Log.d(TAG, "Phone unlocked");
}else if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)){
Log.d(TAG, "Phone locked");
}
}
}
通过此语句注册接收者
receiver = new PhoneUnlockedReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_USER_PRESENT);
filter.addAction(Intent.ACTION_SCREEN_OFF);
registerReceiver(receiver, filter);
【讨论】:
没有测试,但尝试以下:
ACTION_SCREEN_ON。第一步需要过滤掉常规的 HOME 按键。
【讨论】: