gpt4 book ai didi

java - 从锁定屏幕唤醒设备并显示 Activity

转载 作者:行者123 更新时间:2023-12-02 05:34:13 28 4
gpt4 key购买 nike

我正在编写一个警报应用程序。当铃声响起时,我希望设备唤醒并显示我的 Activity ,允许用户禁用闹钟。除了设备锁定(即在锁定屏幕上)之外,它工作正常。

我已经尝试了许多关于此问题的答案,但几乎所有内容似乎都已被弃用,我显然想避免使用这些方法。使用我当前的代码(我尝试结合我找到的答案),它会振动很短的时间(我的闹钟应该在响起时振动,但通常会持续到闹钟被禁用为止) ,但不多了。之后解锁设备时,不会显示禁用警报的 Activity ,并且警报不会响起(这是由该 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();
}

在我的 Activity 的 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>

我希望 Activity 显示在锁屏“上方”,但这不是我的主要优先事项。如果 Activity 开始并且用户必须解锁手机才能看到它就足够了,同时 Activity 一直振动并让手机响铃。注意:我正在 Android 7.1 上测试我的应用程序,当前的最低 API 级别是 21。

最佳答案

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

我通过检查以下 boolean 值修复了这个问题(来源: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 中为 Activity 设置选项。

关于java - 从锁定屏幕唤醒设备并显示 Activity ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56185055/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com