Flutter中如何使用Alarm Manager设置每日无间断重复闹钟?
实现Android每日无间断重复闹钟(Flutter android_alarm_manager)
你的代码目前是通过循环为每个选中的星期设置单次闹钟,这些闹钟只会触发一次,一周后自然就停了。要实现每日无间断重复,得用android_alarm_manager的周期性闹钟API,而不是手动创建一堆单次闹钟。
修改后的代码(纯每日重复)
static Future scheduleDailyRepeatable(Alarm alarm) async { // 计算最近的触发时间:如果今天的指定时间还没到就用今天的,过了就用明天的 final DateTime firstTriggerTime = _getNextDailyTriggerTime(alarm.timeOfDay); // 设置24小时间隔的周期性闹钟 await AndroidAlarmManager.periodic( const Duration(hours: 24), alarm.callbackId, // 用同一个callbackId就行,不用按星期拆分 _alarmCallback, // 你的闹钟回调逻辑 startAt: firstTriggerTime, wakeup: true, // 需要唤醒设备就开这个 exact: true, // 要精确触发就开 allowWhileIdle: true, // 低电量待机时也能触发 ); } // 辅助方法:获取下一次触发的时间 static DateTime _getNextDailyTriggerTime(TimeOfDay time) { final now = DateTime.now(); final todayTrigger = DateTime(now.year, now.month, now.day, time.hour, time.minute); return todayTrigger.isAfter(now) ? todayTrigger : todayTrigger.add(const Duration(days: 1)); }
如果需要指定星期重复(比如仅工作日)
如果不是每天都要响,而是特定星期几响,可以保留每日重复的闹钟,在回调里判断当天是否符合条件:
// 闹钟回调函数 static void _alarmCallback() { final now = DateTime.now(); // 注意:DateTime.weekday返回1=周一,7=周日,要和你原代码的weekday数组索引对应(比如原数组0=周日的话,这里要转成now.weekday%7) final int weekdayIndex = now.weekday % 7; // 如果今天不在设定的星期范围内,直接跳过 if (!alarm.weekday[weekdayIndex]) { return; } // 执行你的闹钟提醒逻辑(比如弹通知、响铃) _triggerAlarmAction(); }
关键说明
- 用
periodic方法替代oneShot,系统会自动按24小时间隔重复触发,不用手动续期 startAt确保闹钟从最近的指定时间开始触发,不会错过当天的时间- 根据需求调整
wakeup、exact、allowWhileIdle参数,保证闹钟在锁屏、低电量等场景下正常工作
内容的提问来源于stack exchange,提问作者Mehar
相关产品推荐
相关产品推荐

