android - Android 警报 - 键盘锁解除后,活动有时仍为黑色
问题描述
我有一个警报活动,它作为全屏通知意图从服务启动。问题是有时,活动将保持黑色,直到我将其关闭并再次打开。
现在,虽然屏幕是黑色的,但视图会响应触摸
如果我尝试截屏,我会突然看到活动,如果我关闭屏幕再打开,一切都按预期工作。
我似乎无法在我的调试版本中重现这一点,但它确实会不时发生在我的“生产”版本中。(假设是 1/5 次)
它会发生在早上的小睡之间,但绝不会发生在第一个闹钟上。(据我所知)
任何关于造成这种情况或如何重现这种情况的想法都会有很大帮助。
奇怪的视频:
这基本上是我启动活动的方式:
val builder = NotificationCompat.Builder(context, NotificationChannels.CHANNEL_ALARM_SERVICE)
...
// set intent
val alarmIntent = Intent(context, AlarmActivity::class.java)
alarmIntent.putExtra(IntentExtras.KEY_ID, alarm.id)
builder.setFullScreenIntent(PendingIntent.getActivity(context, RequestCodes.REQUEST_CODE_ALARM_ACTIVITY, alarmIntent, PendingIntent.FLAG_UPDATE_CURRENT), true)
...
startForeground(...)
这就是我在 Activity 的onCreate()
方法中解锁屏幕的方式
public class ScreenUnlockerUtil {
public static void unlockScreen(BaseActivity activity) {
activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON | WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) {
// in addition to flags
activity.setShowWhenLocked(true);
activity.setTurnScreenOn(true);
} else {
activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
KeyguardManager keyguardManager = (KeyguardManager) activity.getSystemService(KEYGUARD_SERVICE);
if (keyguardManager != null) {
keyguardManager.requestDismissKeyguard(activity, new KeyguardManager.KeyguardDismissCallback() {
@Override
public void onDismissError() {
super.onDismissError();
ExceptionHandlerWrapper.reportException(new Exception("Keyguard Dismiss Error"));
}
@Override
public void onDismissSucceeded() {
super.onDismissSucceeded();
Timber.d("Keyguard Dismiss Success");
}
@Override
public void onDismissCancelled() {
super.onDismissCancelled();
ExceptionHandlerWrapper.reportException(new Exception("Keyguard Dismiss Cancelled"));
}
});
}
} else {
activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
}
}
}
编辑 1:我没有从我的设备中看到任何关于取消键盘锁取消或错误的报告。
编辑 2:这一切都发生在 Pixel 2 XL 上。不是一些随机的蹩脚电话。
解决方案
一个非常奇怪的问题,我找不到它的确切原因。但我可以想出一个非常稳定的解决方案,只需将以下参数添加到您的清单文件中,它应该可以工作。我已经尝试了 15 次,并且再也没有遇到过问题,而我使用代码解决方案的 5 次中有 1 次。
不要忘记删除 onCreate 中的代码行。
<activity android:name=".AlertActivity"
android:showWhenLocked="true"
android:turnScreenOn="true">
</activity>
推荐阅读
- scala - 同时处理具有重复项的序列
- javascript - 使用 react-hooks-testing-library 在 React Hooks 中模拟 Axios
- loops - 迭代 multiindex - groupby.value_counts() 对象仅通过值而不是通过原始日期索引
- javascript - 比较 div A 到 div B 的高度 & 仅当 A 更高时才将高度添加到 div b
- c - 我可以从 Linux 中的 C 代码获取 SSID 和 MAC 地址吗?
- r - 使用变量的列名直接创建 data.tables,并使用 := 的列名变量
- javascript - Tensorflow.js,未定义函数预测
- python - 在数据框 Pandas 中的正则表达式之后替换数据框中的单元格
- c - Bison:$ 变量($1 $2 等)如何与非代币一起使用?
- java - 在 FileWriter 中附加“true”时,项目会从列表中删除