Android – 检测手机解锁事件,而不是屏幕上

有没有办法检测用户何时解锁手机? 我知道关于ACTION_SCREEN_ONACTION_SCREEN_OFF ,但是当按下电源button时屏幕开启/closures时,它们似乎被触发,但实际上当按下菜单button时手机没有被解锁时,它们被触发。

我正在尝试在活动正在运行时检测到解锁/locking,并且我想要在解锁后恢复活动。

这是做什么:

假设您想要检测解锁事件并在手机解锁时在您的活动中执行某些操作。 有一个广播接收器ACTION_SCREEN_ON,ACTION_SCREEN_OFF和ACTION_USER_PRESENT。

当ACTION_SCREEN_ON被触发时,activity的onResume将被调用。 创build一个处理程序并等待ACTION_USER_PRESENT。 当它被解雇时,实施你想要的活动。

在这里可以findCommonsWare的答案: Android – 设备解锁后会发生什么?

经过这一段时间,我发现最好的办法是在“android.intent.action.USER_PRESENT”操作上注册一个BroadcastReceiver。

“广播动作:当设备醒来后用户在场时发送(例如键盘保护不在时)”。

要区分用户在未locking时打开其屏幕的情况,可以使用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 } } } 
 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); 

没有testing,但尝试以下操作:

  • 等待ACTION_SCREEN_ON
  • (屏幕打开后)等待CATEGORY_HOME(启动主屏幕)的ACTION_MAIN – 这可能是手机解锁后发送的内容。

第一步需要过滤掉常规的HOME按键。