纯 Kotlin 安卓应用。给选定应用加一段打开前的等待,默认 60 秒。
- 安装 APK,打开「稍等」。
- 选择需要等待的应用,按需调整等待时长(1~600 秒)及返回免等待时长(1~60 分钟,默认 5 分钟)。
- 在应用的「使用说明」中前往系统无障碍设置,开启「稍等」。
- 打开选定应用,等倒计时结束后点击「继续打开」。随时可以选择「先不打开了」返回桌面。
侧载 APK 后,如果 Android 提示「受限设置」,在系统应用信息页按系统提示允许受限设置,再开启无障碍服务。部分系统还需要手动允许后台运行。首页显示实际服务连接状态。
- 同一次前台会话只等待一次,应用内跳转和键盘事件不重新计时。
- 每个应用完成等待并点击继续后,离开不超过设定的免等待时长再回来可直接使用;超过则重新等待。默认 5 分钟,可在首页「返回免等待」中设为 1~60 分钟。回桌面、切换应用和锁屏都从实际离开时开始计算,持续使用期间不会到期拦截。
- 各应用独立保留放行记录,共用免等待时长设置;每次返回后再离开,重新计算。修改时长会按原离开时间重新判断仍保留的放行记录,不恢复已经清除的记录。尚未点击继续就离开,不获得免等待资格,下次重新计时。服务重启或取消应用选择会清除对应放行记录。
- 下拉通知中心或打开系统遮挡窗口只临时隐藏等待页,倒计时继续;收起后恢复剩余时间,已放行的会话也不重置。通过通知切换到其他应用仍按应用切换处理。
- 倒计时到零后仍需点击继续,不自动放行。
- 所选应用共用一个等待时长;修改时长会影响下一次等待。
- 桌面、系统设置、权限管理、拨号和本应用不能加入拦截名单。
- 应用内提供等待页预览,不需要先授予权限。
这是一款自我约束工具。无障碍服务在目标应用进入前台后覆盖等待页,无法保证应用未启动、未短暂显示画面或未播放音频。关闭服务、卸载、画中画等不在第一版的强制防绕过保证范围内。
- Kotlin + Jetpack Compose:应用列表与设置。
- AccessibilityService + TYPE_ACCESSIBILITY_OVERLAY:识别应用窗口、显示原生等待页。
- DataStore:只保存包名集合和统一等待秒数。
- 纯 Kotlin 状态机:计时使用 elapsedRealtime,重复事件不重置,过期回调不能放行新会话。
- 密集窗口事件最多每 100 毫秒触发一次合并查询,不因持续事件无限延后;单独的窗口标题、边界和无障碍焦点变化不触发查询。只读取候选前台应用的根节点,未选择应用时停订窗口事件,倒计时按整秒更新,空闲时不轮询。运行诊断提供本进程工作次数,不能当作耗电测量。
- 无网络权限、无广告 SDK、无统计、无后台服务器。无障碍仅读取窗口类型及根节点的包名,不遍历页面、不读取文字、不执行手势、不截图。
- 不申请使用情况访问、普通悬浮窗、设备管理员或通知权限;不运行轮询应用使用记录的前台服务。
- 首页分别读取系统无障碍开关和本进程的服务连接状态。服务掉线时可在「运行诊断」查看本应用最近 5 次系统退出记录、最多 24 条生命周期记录及最近一次捕获的未处理异常;仅保存在本机,由用户主动复制分享,不记录其他应用、页面或输入内容。系统记录可能缺失,终止原因也不等于无障碍开关被关闭的原因。
界面参考 ScreenZen 的圆角卡片、留白与紫色强调色,所有代码和资源独立编写,未复制 ScreenZen 或 Mindful 的源码、商标或素材。
使用 JDK 17、Android SDK 36、Build Tools 35.0.0。最低 Android 12(API 31),目标 Android 16(API 36)。
./gradlew :app:assembleDebug :app:testDebugUnitTest :app:lintDebug本机在 local.properties 中填写 sdk.dir,该文件不提交。调试 APK 位于 app/build/outputs/apk/debug/app-debug.apk。发布版需要配置自己的签名密钥;密钥不应放进仓库。
自动化测试覆盖会话状态与原生等待页按钮行为。Robolectric 使用 API 35 绘制实际等待页,输出在 app/build/reports/ui/;这不能替代 Android 16 真机对无障碍服务、手势和厂商后台管理的验证。
安装后依次检查:桌面打开、通知打开、最近任务切回、应用内跳转、键盘、锁屏解锁、系统通知栏、两个受限应用互相切换、横竖屏、深色模式、大字体、重启与撤销无障碍权限。重点观察是否重复等待、是否出现提前放行、是否阻挡系统操作。
初版不发布应用商店,暂不支持应用分身、工作资料跨用户识别和强制防卸载。