从锁定屏幕唤醒设备并显示活动

时间:2019-05-17 10:59:01

标签: java android android-activity lockscreen wakelock

我正在编写警报应用程序。当该响起时,我希望设备唤醒并显示允许用户禁用警报的活动。除了设备锁定时(锁定屏幕上又称为锁定时间),它都可以正常工作。

我已经尝试过许多有关此问题的答案,但是几乎所有内容似乎都已弃用,我显然想避免使用这些方法。使用我拥有的当前代码(尝试结合找到的答案),它会在很短的时间内振动(我的闹钟响时应该这样做,但通常会一直持续到禁用闹钟为止) ,但不更多。之后解锁设备时,未显示禁用警报的活动,并且警报没有响起(由该活动完成)。但是,我已经检查并确保onCreate()方法已完全执行,并且直到最后都没有任何错误。

在我的BroadcastReceiver中(我使用AlarmManager在必要的时间执行我的代码):


    @Override
    public void onReceive(Context context, Intent intent)
    {
        PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
        PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "myalarmapp:alarm.");
        wl.acquire(600000);

        Intent startAlarmActivity = new Intent(context, AlarmActivity.class);

        context.startActivity(startAlarmActivity);

        wl.release();
    }

在我的活动的onCreate()方法中:

        setContentView(R.layout.activity_alarm);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) {

            setShowWhenLocked(true);
            setTurnScreenOn(true);
            KeyguardManager keyguardManager = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);
            keyguardManager.requestDismissKeyguard(this, null);
        }
        else {

            getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD |
                    WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED |
                    WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON |
                    WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
        }

在我的AndroidManifest.xml中:

    <uses-permission android:name="android.permission.VIBRATE" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />

...

        <activity
            android:name=".view.AlarmActivity"
            android:excludeFromRecents="true"
            android:showOnLockScreen="true"
            android:showWhenLocked="true"
            android:turnScreenOn="true"
            android:showForAllUsers="true">
        </activity>

最好,我希望活动显示在锁屏“上方”,但这不是我的主要任务。如果活动开始并且用户必须解锁手机才能看到它,那么在活动振动和振铃的整个过程中就足够了。 注意:我正在Android 7.1上测试我的应用程序,我当前的最低API级别是21。

1 个答案:

答案 0 :(得分:0)

我已经弄清楚了,唤醒锁实际上没什么问题。问题在于,我还取消了活动的onStop()方法中的警报(并称为finish())。屏幕锁定后,会立即调用onStop(),因此它也关闭了活动并停止了振铃。

我通过检查以下布尔值(贷方:Detecting when screen is locked)来修复它:


        KeyguardManager keyguardManager = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);
        boolean isPhoneLocked = keyguardManager.inKeyguardRestrictedInputMode();

        PowerManager powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
        boolean isScreenAwake = powerManager.isInteractive();

借助该解决方案,我还设法将其显示在锁屏上,而无需在AndroidManifest中为活动设置选项。