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

如何在Android Studio中用Java实现启动选中应用前显示Pattern Lock Activity

应用启动前图案锁验证实现方案(Java 环境)

核心逻辑是监听系统前台应用切换事件,匹配你预设的加锁应用列表,命中规则时拦截启动流程跳转图案锁页面,验证通过后恢复应用访问。

1. 权限配置

首先在AndroidManifest.xml中添加必要的特殊权限:

<!-- 访问应用使用情况权限,用于获取前台运行应用包名 -->
<uses-permission android:name="android.permission.PACKAGE_USAGE_STATS" tools:ignore="ProtectedPermissions" />
<!-- Android 10+ 后台弹出页面权限 -->
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

以上两个都是特殊权限,需要引导用户跳转系统设置页面手动开启,无法通过普通动态权限申请接口授予。

2. 存储加锁应用列表

你已经完成了已安装应用选择功能,只需要将用户选中的加锁应用包名通过SharedPreferences或本地Room数据库持久化存储即可,比如用Set<String>结构存储加锁包名集合,读取时直接匹配前台应用包名即可。

3. 实现应用启动监听服务

需要运行一个常驻前台服务来实时监听应用启动事件,避免被系统后台回收:

  • 新建AppLaunchMonitorService继承Service,配置为前台服务,展示常驻通知保活
  • 在服务内通过UsageStatsManager轮询当前前台应用包名,轮询间隔设置1-2秒即可,功耗极低:
private String getForegroundPackageName() {
    UsageStatsManager statsManager = (UsageStatsManager) getSystemService(Context.USAGE_STATS_SERVICE);
    long currentTime = System.currentTimeMillis();
    // 查询过去10秒的应用使用事件
    UsageEvents events = statsManager.queryEvents(currentTime - 10 * 1000, currentTime);
    UsageEvents.Event event = new UsageEvents.Event();
    String foregroundPkg = "";
    while (events.hasNextEvent()) {
        events.getNextEvent(event);
        // 捕获应用页面唤起事件
        if (event.getEventType() == UsageEvents.Event.ACTIVITY_RESUMED) {
            foregroundPkg = event.getPackageName();
        }
    }
    return foregroundPkg;
}
  • 每次获取到前台包名后做三层判断:
    • 是否是你自己的应用包名,是则跳过验证
    • 是否已经在已解锁缓存列表中,是则跳过验证
    • 是否在加锁应用列表中,是则跳转你的Pattern Lock Activity,跳转时添加Intent.FLAG_ACTIVITY_NEW_TASK标记,同时把当前要解锁的应用包名通过Intent参数传给图案锁页面
  • 如果不想用轮询方案,也可以改用AccessibilityService(无障碍服务)监听TYPE_WINDOW_STATE_CHANGED事件获取前台应用包名,不需要轮询,但需要用户单独开启无障碍权限。

4. 图案锁页面逻辑调整

对已有的Pattern Lock Activity做少量改造即可:

  • 页面启动时先读取传入的待解锁应用包名
  • 图案验证成功后,把该包名加入已解锁缓存,直接关闭当前图案锁页面,用户即可正常访问目标应用
  • 图案验证失败时,直接跳转系统桌面,拦截应用访问:
// 验证失败跳转桌面逻辑
Intent homeIntent = new Intent(Intent.ACTION_MAIN);
homeIntent.addCategory(Intent.CATEGORY_HOME);
homeIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(homeIntent);
finish();

5. 边界场景处理

  • 已解锁缓存可以设置有效期,或者监听应用退后台事件时清除对应包名的解锁标记,避免用户退出应用后其他人再打开不需要验证
  • 每次打开你的应用时都检测权限是否正常授予,缺失时引导用户开启
  • 增加标记位判断当前图案锁页面是否已经在前台,避免重复弹出多个验证页面

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 11:27:04