残り時間はドリフトしない計算方法
カウントダウンの残り時間は、実装上「開始時刻+長さ-現在時刻」という引き算で毎回計算されている。1秒ごとに残り時間を引いていく方式だと、画面描画の遅延やアプリのスリープでカウントが少しずつずれる(ドリフトする)ことがあるが、終了予定時刻を基準に毎回計算し直す方式では、途中でtickを取りこぼしても、次に計算したときに正しい残り時間へ復帰する。
消音中でも鳴るアラームの実装
Android版の実際のソースコード(AlarmPlugin.java・AlarmService.java)を確認すると、終了時刻の通知には AlarmManager の setAlarmClock が使われている。これは「ユーザーに見えるアラーム」として登録する方式で、スマホが省電力モード(Doze)に入っていても指定時刻ぴったりに発火し、かつAndroid 12以降で必要な「正確なアラーム」権限(exact-alarm permission)が不要という特徴がある。
鳴動時の音声再生には AudioAttributes の USAGE_ALARM というストリーム種別が指定されている。これは着信音や通知音とは別の音量チャンネルで、端末をマナーモード(消音)にしていても、この音量チャンネル自体をミュートしていない限り鳴動する。フォアグラウンドサービスとして起動するため、アプリを閉じていても鳴動処理自体は継続する。