从锁屏唤醒设备并显示 Activity
Waking up the Device from a Lockscreen and showing an Activity
我正在编写警报应用程序。当响铃时间到了,我希望设备唤醒并显示我的 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 显示 "above" 锁屏,但这不是我的主要优先事项。如果 activity 启动并且用户必须解锁他们的 phone 才能看到它就足够了,而 activity 一直在振动并响起 phone。
注意:我正在 Android 7.1 上测试我的应用程序,我当前的最低 API 级别是 21.
我已经弄明白了,实际上唤醒锁没有问题。问题是我还在 activity 的 onStop() 方法中取消了警报(并调用了 finish() )。当屏幕被锁定时 onStop() 被立即调用,所以它也关闭了 activity 并停止响铃。
我通过检查以下布尔值(信用: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 设置选项。
我正在编写警报应用程序。当响铃时间到了,我希望设备唤醒并显示我的 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 显示 "above" 锁屏,但这不是我的主要优先事项。如果 activity 启动并且用户必须解锁他们的 phone 才能看到它就足够了,而 activity 一直在振动并响起 phone。 注意:我正在 Android 7.1 上测试我的应用程序,我当前的最低 API 级别是 21.
我已经弄明白了,实际上唤醒锁没有问题。问题是我还在 activity 的 onStop() 方法中取消了警报(并调用了 finish() )。当屏幕被锁定时 onStop() 被立即调用,所以它也关闭了 activity 并停止响铃。
我通过检查以下布尔值(信用: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 设置选项。