Android点击锁屏通知启动Activity并解锁手机实现方案
Android 点击锁屏通知唤起指定Activity并自动解锁实现方案
前置配置
先完成清单文件的权限与Activity属性配置,适配全版本系统:
- 在
AndroidManifest.xml中声明必要权限:
<!-- Android 8.0及以上允许锁屏状态下启动全屏Activity --> <uses-permission android:name="android.permission.USE_FULL_SCREEN_INTENT" /> <!-- 点亮屏幕所需权限,可选 --> <uses-permission android:name="android.permission.WAKE_LOCK" />
- 给需要唤起的目标Activity配置窗口属性,在对应
<activity>标签下添加:
android:showWhenLocked="true" android:turnScreenOn="true"
上述两个属性是Android 8.0(API 26)正式提供的标准API,替代旧版本的窗口标记,无需额外申请运行时权限,配置后Activity会自动悬浮在锁屏层之上,同时支持安全锁屏(密码/指纹/人脸)的验证透传。
启动Intent配置
原有启动代码缺少锁屏场景必须的Flag,调整后代码如下:
Intent intent = new Intent(APP.getINSTANCE(), MainActivity.class) .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP) .addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT) .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) // 非Activity上下文启动必须添加 .addFlags(Intent.FLAG_ACTIVITY_NO_USER_ACTION) // 兼容API 26以下旧版本 .addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED) .addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD) .addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON) .setAction(Intent.ACTION_MAIN); APP.getINSTANCE().startActivity(intent);
注意:如果是通过通知点击触发启动,构建PendingIntent时需要在Android 12及以上版本添加
PendingIntent.FLAG_IMMUTABLE标记,否则会触发系统拦截:PendingIntent pendingIntent = PendingIntent.getActivity( context, requestCode, intent, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE );
主动解锁逻辑(适配无密码锁屏场景)
如果设备为无密码的滑动锁屏,需要在Activity启动后直接关闭锁屏层,不要使用已废弃的KeyguardManager.disableKeyguard()方法,在目标Activity的onCreate生命周期中添加如下代码即可:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { KeyguardManager keyguardManager = getSystemService(KeyguardManager.class); // 仅对无安全密码的锁屏生效,有密码/生物验证的场景遵循系统安全规则 if (keyguardManager != null && !keyguardManager.isKeyguardSecure()) { setShowWhenLocked(true); setTurnScreenOn(true); keyguardManager.requestDismissKeyguard(this, new KeyguardManager.KeyguardDismissCallback() { @Override public void onDismissSucceeded() { // 锁屏解锁完成回调 } }); } } setContentView(R.layout.activity_main); }
常见问题说明
- 单独添加
FLAG_DISMISS_KEYGUARD无效的原因:Android 8.0开始该标记仅支持将Activity显示在锁屏上层,不会主动触发锁屏关闭流程,必须配合showWhenLocked属性或requestDismissKeyguard方法才能完成解锁。 - 废弃API
disableKeyguard()的问题:该方法从API 26开始被标记为废弃,需要申请特殊权限,调用后会永久禁用设备锁屏直到手动调用恢复方法,在Android 12及以上版本会被系统直接拦截,无实际兼容价值。 - 安全锁屏场景限制:对于设置了密码、指纹、人脸验证的设备,系统出于安全机制不允许任何第三方应用绕过验证流程直接解锁,上述方案会在用户完成验证后自动跳转至目标Activity,符合系统安全规范。
内容的提问来源于stack exchange,提问作者sgm
相关产品推荐
相关产品推荐

