有没有一种方法可以检测用户何时解锁手机?我知道关于 ACTION_SCREEN_ON
和 ACTION_SCREEN_OFF
,但这些似乎只会在按下电源按钮开/关屏幕时触发,而不是在按下菜单按钮解锁时触发...
我正在尝试在活动运行时检测解锁/锁定状态,并且我希望在解锁后恢复该活动。
有没有一种方法可以检测用户何时解锁手机?我知道关于 ACTION_SCREEN_ON
和 ACTION_SCREEN_OFF
,但这些似乎只会在按下电源按钮开/关屏幕时触发,而不是在按下菜单按钮解锁时触发...
我正在尝试在活动运行时检测解锁/锁定状态,并且我希望在解锁后恢复该活动。
以下是操作步骤:
假设你想在你的Activity中检测手机解锁事件并采取相应措施。你需要为ACTION_SCREEN_ON、ACTION_SCREEN_OFF和ACTION_USER_PRESENT注册一个Broadcast Receiver。
当ACTION_SCREEN_ON被触发时,将会调用Activity的onResume方法。创建一个Handler并等待ACTION_USER_PRESENT被触发,当它被触发时,实现你想要的Activity行为。
感谢CommonsWare在这里的回答:Android – What happens when device is unlocked?
在经过一段时间的尝试后,我发现最好的方法是在"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()
吗? - PatrickisDeviceLocked
来验证实际状态,而不仅仅是在设置中启用了安全锁。你还可以检查 KeyguardManager 的 inKeyguardRestrictedInputMode
,适用于 API < 22。 - Abandoned Cartpublic 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 键的按下事件。
BroadcastReceiver
只能通过动态注册(通过在Activity
内调用registerReceiver
)进行。在AndroidManifest.xml
中注册这些事件不再起作用,因此应用程序无法在未运行时(已被Android杀死或用户强制关闭)接收这些事件(至少是ACTION_SCREEN_ON
和ACTION_SCREEN_OFF
)。 - ahasbiniACTION_USER_PRESENT
并不总是被调用。使用它并不安全。 - Michał Dobi Dobrzański