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

如何开发可阻止其他解锁应用解锁屏幕的Android锁屏应用

阻止第三方锁屏应用解锁设备的实现方案

1. 抢占高优先级锁屏窗口

要让你的锁屏应用优先于第三方锁屏显示,核心是给锁屏窗口配置高优先级参数并获取必要权限:

  • 在AndroidManifest.xml中添加权限:
    <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
    
  • 创建锁屏窗口时适配不同Android版本的WindowManager参数:
    WindowManager.LayoutParams params = new WindowManager.LayoutParams(
        WindowManager.LayoutParams.MATCH_PARENT,
        WindowManager.LayoutParams.MATCH_PARENT,
        Build.VERSION.SDK_INT >= Build.VERSION_CODES.O ? 
            WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY : 
            WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG,
        WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED |
            WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD |
            WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON |
            WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL,
        PixelFormat.TRANSLUCENT
    );
    // 将自定义锁屏View添加到WindowManager
    windowManager.addView(lockScreenView, params);
    
    Android 8.0+用TYPE_APPLICATION_OVERLAY,低版本用TYPE_KEYGUARD_DIALOG,确保窗口能覆盖系统及第三方锁屏。

2. 监听并拦截解锁相关事件

  • 动态注册锁屏广播(Android 8.0+静态广播失效):

    IntentFilter filter = new IntentFilter();
    filter.addAction(Intent.ACTION_SCREEN_OFF);
    filter.addAction(Intent.ACTION_USER_PRESENT);
    registerReceiver(new LockScreenReceiver(), filter);
    

    在广播接收器中,一旦检测到ACTION_USER_PRESENT(系统解锁完成),立即重新显示你的锁屏窗口,覆盖第三方应用的解锁结果。

  • 拦截物理按键与触摸事件:
    在锁屏Activity中重写事件方法,阻止用户退出锁屏:

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        // 拦截返回键、Home键(Home键部分机型需结合无障碍服务)
        if (keyCode == KeyEvent.KEYCODE_BACK || keyCode == KeyEvent.KEYCODE_HOME) {
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }
    
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        // 拦截非解锁区域的触摸操作
        if (!isUnlockArea(event)) {
            return true;
        }
        return super.onTouchEvent(event);
    }
    

3. 设置为系统默认锁屏应用(Android 7.0+)

请求系统将你的应用设为默认锁屏,直接接管系统解锁流程:

Intent intent = new Intent(Settings.ACTION_SETTINGS);
intent.putExtra(Settings.EXTRA_SETTINGS_LOCK_SCREEN, true);
startActivity(intent);

也可通过DevicePolicyManager申请锁屏控制权:

DevicePolicyManager dpm = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
ComponentName adminComponent = new ComponentName(this, DeviceAdminReceiver.class);
if (!dpm.isAdminActive(adminComponent)) {
    Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
    intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, adminComponent);
    intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION, "需要获取锁屏控制权");
    startActivityForResult(intent, REQUEST_CODE_ADMIN);
}

成为默认锁屏后,系统会优先调用你的应用处理解锁,第三方锁屏很难抢占控制权。

4. 用无障碍服务监控第三方应用

通过无障碍服务监听所有应用的窗口变化,检测到第三方锁屏窗口弹出时立即显示你的锁屏:

public class LockAccessibilityService extends AccessibilityService {
    @Override
    public void onAccessibilityEvent(AccessibilityEvent event) {
        if (event.getEventType() == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED) {
            String packageName = event.getPackageName().toString();
            // 判断是否为第三方锁屏应用
            if (isThirdPartyLockApp(packageName)) {
                // 显示自定义锁屏窗口
                showLockScreen();
            }
        }
    }

    @Override
    public void onInterrupt() {}
}

记得在AndroidManifest.xml中注册无障碍服务,并引导用户开启对应权限。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 23:03:15