Flutter开发Android Launcher如何设置唤醒时显示系统默认锁屏
Android Launcher息屏唤醒显示系统锁屏解决方案
方案一:优先调起系统默认锁屏
你当前遇到的跳过锁屏问题,本质是Launcher的主Activity配置了锁屏可展示的相关属性,系统判定可以跳过锁屏直接进入应用。按以下步骤修改即可:
- 移除
AndroidManifest.xml中主Activity节点下的锁屏相关属性,包括android:showWhenLocked="true"、android:turnScreenOn="true"等 - 不要在主Activity的
onCreate、onResume生命周期中动态添加以下Window标记:// 以下标记全部删除 getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED); getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD); getWindow().addFlags(WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON); - 取消
android.permission.SHOW_ON_LOCK_SCREEN权限申请,不要让应用获得锁屏展示权限
完成以上修改后,绝大部分原生系统和第三方定制ROM都会在息屏唤醒时优先展示系统默认锁屏,解锁后才会进入你的Launcher。
方案二:自行实现拦截页面
如果部分定制ROM对默认Launcher做了特殊处理,方案一无法生效,可以自己开发拦截页面,首先需要获取设备解锁状态:
解锁状态获取方法
使用系统KeyguardManager类即可获取状态,不需要额外申请权限(Android 10及以上通用):
val keyguardManager = getSystemService(Context.KEYGUARD_SERVICE) as KeyguardManager // 设备是否设置了密码/指纹/人脸等锁屏验证方式 val hasLockMethod = keyguardManager.isKeyguardSecure // 当前设备是否处于锁屏状态 val isLocked = keyguardManager.isKeyguardLocked
拦截逻辑实现
- 注册
ACTION_SCREEN_ON系统广播,接收到屏幕点亮的广播时,立刻调用上述代码判断解锁状态 - 如果当前处于锁屏状态,直接跳转你开发的拦截页面,给拦截页的Window添加
FLAG_SHOW_WHEN_LOCKED标记,保证页面可以在锁屏上展示,拦截用户对Launcher的操作 - 监听系统解锁广播
ACTION_USER_PRESENT,收到广播后自动关闭拦截页面,回到Launcher主界面
内容的提问来源于stack exchange,提问作者Patrick Schick
相关产品推荐
相关产品推荐

