我有Activity1
,它是项目列表屏幕。每个项目都可以在单独的 Activity2
中查看,该 Activity 显示为弹出窗口。 Activity1
可以从后台启动并在屏幕锁定时显示。 Activity1
还可以选择通过启动 Activity2
自动在列表屏幕中显示项目的内容。我们可以绕过锁定屏幕,因为这两个 Activity 都在 OnCreate
方法中启用了 WindowManagerFlags.DismissKeyguard
。
在 Android Lollipop 之前,一切都按预期运行。但现在除非手动解锁设备,否则弹出的 Activity2
不可见。如果我将 Activity2
更改为全屏 Activity
,那么一切似乎都可以正常工作(除了从一个 Activity 转换到另一个 Activity 会短暂显示锁定屏幕)。关于如何彻底解决这个问题有什么想法吗?
此外,我只尝试过具有新的 Knox 安全功能的 Galaxy S6/S6 Edge 设备。
编辑 我已将 Activity2
更改为 DialogFragment
而不是 Activity
。这对我来说效果最好,因为建议的答案使用了已弃用或过时的代码,具体取决于目标 sdk。 Activity1
使用以下标志在需要时绕过锁定屏幕。
getWindow().addFlags(LayoutParams.FLAG_DISMISS_KEYGUARD);
getWindow().addFlags(LayoutParams.FLAG_SHOW_WHEN_LOCKED);
由于 Activity2
现在只是一个 DialogFragment
,因此它使用父 Activity1
的窗口标志。我还删除了“android.intent.action.SCREEN_OFF”操作上的这些标志,以便 Activity 仅在作为通知启动时绕过锁定屏幕,而不是每次 Activity 位于顶部时堆。需要答案中提到的权限。
最佳答案
这个 fragment 肯定会对您有所帮助(适用于 Lollipop):
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
wl = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "My Tag");
wl.acquire();
KeyguardManager keyguardManager = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);
keyguardLock = keyguardManager.newKeyguardLock("TAG");
keyguardLock.disableKeyguard();
以及离开您的 Activity 时(即 onStop()、onPause() 和 onDestroy()):
keyguardLock.reenableKeyguard();
另外,不要忘记权限:
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
关于Android Lollipop - 绕过弹出 Activity 的锁屏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29995138/