[英]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.