You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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方法才能完成解锁。
  • 废弃APIdisableKeyguard()的问题:该方法从API 26开始被标记为废弃,需要申请特殊权限,调用后会永久禁用设备锁屏直到手动调用恢复方法,在Android 12及以上版本会被系统直接拦截,无实际兼容价值。
  • 安全锁屏场景限制:对于设置了密码、指纹、人脸验证的设备,系统出于安全机制不允许任何第三方应用绕过验证流程直接解锁,上述方案会在用户完成验证后自动跳转至目标Activity,符合系统安全规范。

内容的提问来源于stack exchange,提问作者sgm

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 23:06:06