You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 10:00:13