Android 警报 - Activity 键盘锁解除后有时仍然是黑色

Android Alarm - Activity Sometimes Remains Black After Keyguard Dismissal

我有一个警报 activity,它作为全屏通知 Intent 从服务启动。问题是 有时 activity 将保持黑色 直到我将其关闭并再次打开。

现在,虽然屏幕是黑色的,但是 views 响应触摸

如果我尝试截屏,我突然看到 activity,如果我关闭屏幕然后重新打开,一切正常。

我似乎无法在我的调试版本 上重现此问题,但在我的 "production" 版本中它确实时常发生。 (假设是 1/5 倍)

它会在早上小睡之间发生,但绝不会在第一次闹钟时发生。 (据我所知)

任何关于导致此问题的原因或如何重现此问题的想法都会有很大帮助。

怪异视频:

Responsive black screen

Turn off, and on again

Trying to take a screenshot

这基本上就是我启动 activity:

的方式
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 上。不是一些随机的蹩脚 phone.

一个很奇怪的问题,我找不到具体原因。但我可以想出一个非常稳定的解决方案,只需将以下参数添加到您的清单文件中,它应该可以工作。我已经尝试了 15 次,但再也没有遇到过问题,而我使用代码解决方案遇到了 5 次中的 1 次。

不要忘记删除 onCreate 中的代码行。

    <activity android:name=".AlertActivity"
        android:showWhenLocked="true"
        android:turnScreenOn="true">
    </activity>