繁体   English   中英

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

[英]Waking up the Device from a Lockscreen and showing an Activity

我正在编写一个警报应用程序。 当需要响铃时,我希望设备唤醒并显示我的活动,允许用户禁用警报。 除了设备被锁定(也就是在锁定屏幕上)之外,它工作正常。

我已经尝试了很多关于这个的答案,但几乎所有的东西似乎都被弃用了,我显然想避免使用这些方法。 使用我当前的代码(我试图将我找到的答案组合在一起)它将振动很短的时间(我的警报应该在它响起时发生,但通常会一直持续到警报被禁用)但不是更多。 之后解锁设备时,不会显示禁用警报的活动,并且警报未响铃(由该活动完成)。 但是我已经检查并确保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。

我已经弄清楚了,它实际上与唤醒锁没有问题。 问题是我还在活动的onStop()方法中取消了警报(并调用了finish())。 当屏幕被锁定onStop()被立即调用时,它也关闭了活动并停止响铃。

我通过检查以下布尔值来修复它(信用: 检测屏幕被锁定时 ):


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

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

通过该解决方案,我还设法在锁屏上显示它,而无需为AndroidManifest中的活动设置选项。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM