循环倒计时 · Android

专注一圈 再来一圈

把「接下来 N 分钟」变成一轮倒计时。锁屏直接开始,暂停就是真的停住,时间到了自己响。

  • Android 8.0+
  • 无需账号
  • 没有联网权限
  • 无广告无统计
进行中 Lap
15:30
本轮 25 分钟
5152545
开始 25 分钟

Lap · 25 分钟

计时进行中

now

特性

按你真正的用法来做

就那么几个常用时长,一天要用很多次:不打开应用就能开始,一下就能结束。

后台一键启动

通知栏和锁屏上的媒体卡片直接开始新一轮,不用先打开应用。

真暂停

暂停会取消系统闹钟并冻结剩余时间,继续时从冻结的那一刻接着走。

响铃、振动、亮屏

前台服务循环播放闹钟铃声、振动并点亮屏幕;没人处理时 5 分钟后自动停下。

档位自己定

默认 5 / 15 / 25 / 45 分钟,从微休息到深度专注;可自由增删自定义档位。

不自动循环

每一轮都由你亲手触发,没有任何东西会在背后自己开始。

天生不联网

应用没有声明 INTERNET 权限,从技术上就没有把数据传出去的可能。

试用

整个应用就是一张卡片

下面是主界面与媒体卡的实时复刻:同样的状态、同样的按钮。全部跑在浏览器里,不发任何请求。

准备开始
25:00
25 分钟

媒体卡片

Lap · 25 分钟

点播放键开始计时

now

拖动进度条可以调整剩余时间。

原理

为什么 Lap 自己计时

最早一版把计时交给系统时钟应用。在小米 HyperOS 上它撞得很具体:应用处于后台时,系统时钟的界面根本不让打开。

  1. 01

    媒体卡按钮是进程内回调

    在通知栏点播放键,调用的是 Lap 自己;系统不会代为发起跳转。于是 Lap 必须以后台应用的身份去拉起另一个应用的 Activity。

  2. 02

    MIUI 在 AOSP 之上又加了一层

    悬浮窗权限、系统「链式启动」开关、提升进程优先级、PendingIntent 后台启动模式,全部无效。系统日志把拒绝记成 MIUI 自己的权限拦截。

  3. 03

    自己计时,就不用跨应用

    改用 AlarmManager.setAlarmClock() 加前台响铃服务后,全程不跨应用边界:问题消失,连带不再需要悬浮窗权限。

对系统时钟尝试过的方案

尝试结果
授予 SYSTEM_ALERT_WINDOW(Android 后台启动豁免)Android 层放行,MIUI 再加一层
系统设置里打开「链式启动」已开启,仍被拒绝
先拉起前台服务提升进程优先级日志没有任何变化
setPendingIntentBackgroundStartMode被系统丢弃
用 cmd appops 改 MIUI 策略没有对应开关

两个值得知道的副作用:setAlarmClock 会在状态栏显示闹钟图标;它不受省电模式和待机分组限制。

权限

权限与已知限制

六个权限,每个都对应一个看得见的行为。通知权限在第一次点开始时才申请,不是一打开应用就弹窗。

权限

POST_NOTIFICATIONS
在通知栏和锁屏显示媒体卡片
SCHEDULE_EXACT_ALARM · USE_EXACT_ALARM
在本轮结束的那一分钟准时响铃
VIBRATE
到点时振动
WAKE_LOCK
响铃时点亮屏幕
FOREGROUND_SERVICE · SPECIAL_USE
响铃的几分钟里保持前台服务运行

拒绝通知权限,计时控件就无法显示;除此之外没有任何变化,也不涉及你的个人数据。

已知限制

  • 不做全屏响铃页

    目标机型拒绝 fullScreenIntent,所以响铃表现为通知 + 铃声 + 亮屏。

  • 静音不会让它安静

    铃声走闹钟音量(USAGE_ALARM)。要静音请调低闹钟音量或开启勿扰。

  • 切换档位不影响当前轮

    已开始的这一轮保持原时长,新档位从下一轮开始生效。

隐私

条款很短,因为没有什么可交代的

没有账号、没有统计、没有崩溃上报、没有广告标识符。设置只留在本机的应用私有存储里,而应用本身连不上网。

阅读隐私条款