Oreo (8.1) 无法在锁定屏幕上启动 activity

Oreo (8.1) cannot start activity on lock screen

我正在开发 NFC 支付应用程序。即使设备处于锁定状态,也可以在屏幕打开时进行支付。与 Android Pay 基本相同的行为。付款后我想向用户显示胜利屏幕以通知他付款结果 - 完成、错误、密码请求等。

我将其添加到清单中

<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.DISABLE_KEYGUARD" />

在 onCreate 中我设置了这个标志

getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
            | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
            | WindowManager.LayoutParams.FLAG_FULLSCREEN
            | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
            | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
            | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
            | WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON);

它在大多数设备上运行良好。但是一旦我将 Nexus 5X 更新到 Android 8.1,它就停止工作了。 NFC 交易在后台完成,没有任何问题,但是当我的 phone 处于锁定屏幕并打开屏幕时,胜利屏幕根本不显示。当 5X 解锁时,它可以毫无问题地启动 activity。 然后我发现只有当应用程序不在后台 运行 时它才不工作(当我进入设置并强制停止我的应用程序时)。当我打开应用程序并将其留在后台时,然后锁定我的 phone 并打开屏幕 - 它正在运行。但是当应用程序根本不是 运行 时 - 它不会显示我的 activity。 在 Samsung S8 和 Andorid 7.0 等其他设备上,即使我强行停止 activity 并锁定 phone,它也能正常工作。

我用 Android 8.1 测试了 Android Pay on 5X 并且它可以在锁定屏幕上运行。所以仍然可以在锁定屏幕上启动 activity,但我可能在那里遗漏了一些东西。

先谢谢你。

在 Android 8.1 (API 27) 上,WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKEDWindowManager.LayoutParams.FLAG_TURN_SCREEN_ON 已被弃用。

您现在应该将以下内容添加到清单中的 activity 条目中:

android:showWhenLocked="true"
android:turnScreenOn="true"