Android 21及以上版本锁屏禁用异常:屏幕熄灭后锁屏自动恢复求助
解决方案:解决屏幕熄灭后锁屏自动恢复的问题
我之前也碰到过一模一样的问题!本质原因是屏幕熄灭再点亮时,系统会重置锁屏状态,你之前设置的禁用锁屏标记会被系统自动清除。下面分Android版本给你整理可行的修复方案:
一、Android 10(API 29)及以上版本
从Android 10开始,KeyguardLock和旧版的FLAG_DISMISS_KEYGUARD行为被限制,官方推荐用KeyguardManager.requestDismissKeyguard()配合窗口标记来处理:
// 初始化KeyguardManager KeyguardManager keyguardManager = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE); // 请求解除锁屏并处理回调 if (keyguardManager.isKeyguardLocked()) { keyguardManager.requestDismissKeyguard(this, new KeyguardManager.KeyguardDismissCallback() { @Override public void onDismissSucceeded() { // 锁屏解除成功后的逻辑 } @Override public void onDismissFailed() { // 锁屏解除失败后的逻辑 } }); } // 添加窗口标记,确保屏幕点亮时直接显示Activity,跳过锁屏 Window window = getWindow(); window.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED); window.addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
二、Android 5.0(API 21)到Android 9(API 28)版本
这部分版本可以继续使用FLAG_DISMISS_KEYGUARD,但必须配合屏幕广播监听,在屏幕点亮时重新设置标记,避免系统重置:
1. 先在Manifest中添加权限
<uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
2. 核心代码实现
// 封装设置锁屏标记的方法 private void setupLockScreenFlags() { Window window = getWindow(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { window.addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD); window.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED); window.addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON); } else { KeyguardManager km = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE); KeyguardManager.KeyguardLock kl = km.newKeyguardLock("MyAppLockTag"); kl.disableKeyguard(); } } // 监听屏幕点亮广播,重新设置标记 private BroadcastReceiver screenOnReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if (Intent.ACTION_SCREEN_ON.equals(intent.getAction())) { setupLockScreenFlags(); } } }; // 在Activity生命周期中注册/注销广播 @Override protected void onResume() { super.onResume(); IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON); registerReceiver(screenOnReceiver, filter); setupLockScreenFlags(); } @Override protected void onPause() { super.onPause(); unregisterReceiver(screenOnReceiver); }
三、关键注意点
FLAG_SHOW_WHEN_LOCKED是核心:这个标记能让你的Activity在锁屏状态下直接显示,从根源上避免系统触发锁屏界面。- 广播监听不可少:屏幕每次点亮时系统都会重置锁屏状态,必须重新设置禁用标记才能维持效果。
- 权限适配:Android 9及以下需要
DISABLE_KEYGUARD权限,Android 10及以上无需此权限,但要保证Activity能正常前台显示。
内容的提问来源于stack exchange,提问作者Prakhar Gupta




