如何处理API27废弃的FLAG_SHOW_WHEN_LOCKED?兼容minSdk21与targetSdk33
解决FLAG_SHOW_WHEN_LOCKED等API废弃警告的兼容方案
你遇到的警告是因为else分支里的FLAG_DISMISS_KEYGUARD、FLAG_SHOW_WHEN_LOCKED、FLAG_TURN_SCREEN_ON在API27及以上已被标记为废弃,哪怕加了版本判断,编译器还是会提示这些常量已废弃。下面是两种可行的解决办法:
方法一:用注解忽略废弃警告
直接在包含废弃代码的代码块或函数上添加@Suppress("DEPRECATION")注解,让编译器跳过该部分的废弃警告。修改后的代码示例:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) { // O_MR1对应API27,用常量更易读 setShowWhenLocked(true) setTurnScreenOn(true) } else { @Suppress("DEPRECATION") window.addFlags( WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD or WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED or WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON ) }
如果这段代码是在单独的函数里,也可以把注解加在函数上:
@Suppress("DEPRECATION") fun setupWindowForLockScreen() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) { setShowWhenLocked(true) setTurnScreenOn(true) } else { window.addFlags( WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD or WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED or WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON ) } }
方法二:使用AndroidX的WindowCompat工具类(推荐)
AndroidX提供了WindowCompat类,已经封装好了版本兼容逻辑,不用自己写if-else判断,也不会出现废弃警告。只要你的项目依赖了AndroidX核心库(一般新建项目默认包含),就可以直接用:
import androidx.core.view.WindowCompat // 在Activity的onCreate方法中调用 WindowCompat.setShowWhenLocked(window, true) WindowCompat.setTurnScreenOn(window, true) // 如果需要自动解锁屏幕,补充以下逻辑: if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { val keyguardManager = getSystemService(KeyguardManager::class.java) keyguardManager.requestDismissKeyguard(this, null) } else { @Suppress("DEPRECATION") window.addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD) }
WindowCompat的方法内部会自动根据系统版本选择调用新API还是旧FLAG,代码更简洁,也不用自己维护版本判断逻辑,是官方推荐的兼容方案。
内容的提问来源于stack exchange,提问作者FreePhoenix888
相关产品推荐
相关产品推荐

