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

Chr*_*ris 54 android

有没有办法检测用户何时解锁手机?我知道ACTION_SCREEN_ON并且ACTION_SCREEN_OFF,但是当按下电源按钮时屏幕打开/关闭时这些似乎被触发,但实际上当按下菜单按钮时电话解锁时实际上没有...

我正在尝试在活动运行时检测解锁/锁定,并且我想在解锁后恢复活动.

小智 61

这是做什么的:

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

触发ACTION_SCREEN_ON时将调用onResume活动.创建一个处理程序并等待ACTION_USER_PRESENT.触发后,实施您想要的活动.

感谢CommonsWare的答案:Android - 设备解锁后会发生什么?

  • 我想指出这些事件的 `BroadcastReceiver` 只能从 Android O(API 26)开始动态注册(通过从 `Activity` 中调用 `registerReceiver`)。在“AndroidManifest.xml”中注册这些事件不再有效,因此当应用程序未运行(之前已被 Android 杀死或强制执行)时,应用程序不再能够接收这些事件(至少是“ACTION_SCREEN_ON”和“ACTION_SCREEN_OFF”)由用户关闭)。 (2认同)

小智 23

经过一段时间的分散后,我发现最好的方法是在"android.intent.action.USER_PRESENT"动作上注册BroadcastReceiver.

"广播操作:设备唤醒后用户在场时发送(例如当键盘消失时)."

为了区分用户在未锁定到实际解锁时打开屏幕的情况,请使用KeyguardManager检查安全设置.

代码示例:

将此添加到您的活动中:

registerReceiver(new PhoneUnlockedReceiver(), new IntentFilter("android.intent.action.USER_PRESENT"));
Run Code Online (Sandbox Code Playgroud)

然后使用这个类:

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            

        }
    }
}
Run Code Online (Sandbox Code Playgroud)


Kar*_*pal 8

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");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

通过此语句注册接收者

receiver = new PhoneUnlockedReceiver();
        IntentFilter filter = new IntentFilter();
        filter.addAction(Intent.ACTION_USER_PRESENT);
        filter.addAction(Intent.ACTION_SCREEN_OFF);
        registerReceiver(receiver, filter);
Run Code Online (Sandbox Code Playgroud)


ada*_*amk 1

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

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

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

  • 来自 Google“ACTION_MAIN,类别为 CATEGORY_HOME - 启动主屏幕。” 当您解锁手机时,它不会进入主屏幕,而是会显示上次使用的应用程序(恢复)。 (2认同)