SleepTimerManager 维护的可响应睡眠定时器——到期自动暂停播放
工作机制
SleepTimerManager 维护一个响应式的定时器状态:
timerState是StateFlow,UI 观察它来更新剩余时间显示- 倒计时到期时调用
PlayerManager.pause()暂停播放 - 应用不会被强制关闭——只是暂停当前播放
UI 交互
睡眠定时器的入口在播放页底栏按钮区域:
- 未激活时:按钮显示默认图标
- 激活时:按钮使用 MaterialTheme 主色高亮,显示剩余时间
点击按钮弹出 SleepTimerDialog,可选预设时长或自定义分钟数。
与音频焦点的配合
睡眠定时器到期后调用的是 pause() 而不是 stop():
pause()保留播放状态和进度,下次启动可以从暂停位置继续- 音频焦点会被主动释放,避免持续占用系统音频通道
- 播放服务会继续存活(显示暂停状态的媒体通知)
取消定时器
在倒计时过程中可以随时再次点击睡眠定时器按钮取消。取消后播放不受影响,定时器状态重置。
典型使用场景
- 睡前听音乐:设 30 分钟,到点自动暂停入睡
- 开车回家听播客:设 45 分钟,到家自动暂停(假设还没听完)
- 专注学习:设 90 分钟,让音乐在学习时段结束时自动停
与后台播放的关系
睡眠定时器到期后暂停的是前台播放服务。如果在睡眠倒计时过程中退出应用或锁屏,定时器仍然继续工作——后台播放服务会继续倒计时,到点自动暂停。