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

如何彻底禁用Android锁屏?解决生物指南App切换Activity的锁屏弹窗问题

彻底解决Android App二级Activity锁屏弹窗问题

问题描述

我开发了一款生物野外指南App,具备野生动物录音等功能,设计为单次充电可全天运行。由于无法全程保持亮屏,屏幕熄灭后锁屏会弹出,导致错过珍贵录音,而用户在野外使用时被盗风险极低。因此我在App偏好设置中添加了使用时禁用锁屏的选项,目前代码已实现部分效果,但切换至二级Activity时仍会出现类似锁屏的弹窗(按返回键可消失),切回主Activity则无此问题。需要彻底禁用锁屏。

当前已实现的代码(在每个Activity act 中执行):

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) {
    act.setShowWhenLocked(true);
    act.setTurnScreenOn(true);
    ((KeyguardManager) act.getSystemService(Context.KEYGUARD_SERVICE)).requestDismissKeyguard(act, null);
    //if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) 
    //     act.setInheritShowWhenLocked(true);  // makes no difference?
} else {
    Window window = act.getWindow();
    window.addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
    window.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
}

已在Manifest中添加权限:

<uses-permission android:name="android.permission.DISABLE_KEYGUARD"/>

解决方案

1. 用基类统一处理锁屏逻辑

创建一个BaseActivity,让所有Activity继承它,在基类的onCreate中统一执行禁用锁屏的逻辑,避免每个Activity重复写代码,同时确保状态一致性。

2. 启用Android Q+的setInheritShowWhenLocked

之前注释掉的setInheritShowWhenLocked(true)是解决二级Activity问题的关键——它允许子Activity继承父Activity的showWhenLocked状态,必须在Android Q及以上版本开启,且要在setContentView之前调用窗口相关方法。

3. 修改后的完整代码示例

BaseActivity代码

public class BaseActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 先处理锁屏禁用,再加载布局
        handleKeyguardDisabling();
    }

    private void handleKeyguardDisabling() {
        // 替换为你的偏好设置判断,比如从SharedPreferences读取用户是否开启禁用锁屏
        boolean isDisableKeyguardEnabled = true;

        if (!isDisableKeyguardEnabled) return;

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) {
            setShowWhenLocked(true);
            setTurnScreenOn(true);
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
                setInheritShowWhenLocked(true); // 核心:让二级Activity继承锁屏禁用状态
            }
            KeyguardManager keyguardManager = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);
            keyguardManager.requestDismissKeyguard(this, null);
        } else {
            Window window = getWindow();
            window.addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
            window.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
        }
    }
}

所有Activity继承BaseActivity

// 主Activity
public class MainActivity extends BaseActivity {
    // ... 你的业务代码
}

// 二级Activity
public class SecondaryActivity extends BaseActivity {
    // ... 你的业务代码
}

4. 额外注意事项

  • 确保只在用户开启偏好设置中的“禁用锁屏”选项时执行上述逻辑,避免强制修改用户系统设置。
  • Android 10及以上版本不再需要DISABLE_KEYGUARD权限,但保留该权限不会影响功能。
  • 如果弹窗仍偶尔出现,可以在Activity的onResume方法中再次调用handleKeyguardDisabling(),确保页面恢复时状态正确。

内容的提问来源于stack exchange,提问作者Luis A. Florit

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 23:57:21