如何彻底禁用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
相关产品推荐
相关产品推荐

