为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

qq_笑_17 2022-11-30 16:43:14
我正在编写警报应用程序。当响铃时间到了,我希望设备唤醒并显示允许用户禁用闹钟的活动。它工作正常,除非设备被锁定(也就是在锁屏上)。我已经尝试了很多我找到的关于这个的答案,但几乎所有的东西似乎都被弃用了,我显然想避免使用这些方法。使用我当前的代码(我试图将我找到的答案结合起来)它会振动很短的时间(我的闹钟应该在响铃时这样做,但通常它会持续到闹钟被禁用) ,但不会更多。之后解锁设备时,不会显示禁用警报的活动并且警报不会响起(由该活动完成)。但是,我已经检查并确保 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 开始并且用户必须解锁他们的手机才能看到它就足够了,而 Activity 一直在振动并使手机响铃。注意:我正在 Android 7.1 上测试我的应用程序,我当前的最低 API 级别是 21。
查看完整描述

1 回答

?
慕姐8265434

TA贡献1813条经验 获得超2个赞

我已经弄清楚了,唤醒锁实际上并不是什么问题。问题是我还在活动的 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 中的活动设置选项。


查看完整回答
反对 回复 2022-11-30
  • 1 回答
  • 0 关注
  • 55 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信