如何在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
相关产品推荐
相关产品推荐

