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

如何用Awesome Notifications实现每日重复祈祷时间通知?

解决Awesome Notifications每日重复通知不生效的问题

问题分析

你当前的代码用NotificationCalendar.fromDate设置repeats: true,但这种方式没法触发每日重复——fromDate生成的日历对象只绑定了具体日期,没明确指定每日重复规则,系统只会在指定日期触发一次,不会自动循环。

解决方案

直接构造NotificationCalendar对象,明确指定小时、分钟并开启每日重复规则,同时处理当前时间已过目标时间的情况(避免刚设置就触发通知):

修改后的代码

void scheduleNotification(int id) async {
  DateTime now = DateTime.now();
  List<int> timeParts = prayerTimes[id].split(':').map(int.parse).toList();
  int targetHour = timeParts[0];
  int targetMinute = timeParts[1];

  // 计算首次触发时间:如果当前时间已过目标时间,就设为第二天的同一时间
  DateTime scheduledDate = DateTime(now.year, now.month, now.day, targetHour, targetMinute);
  if (scheduledDate.isBefore(now)) {
    scheduledDate = scheduledDate.add(const Duration(days: 1));
  }

  String localTimeZone = await AwesomeNotifications().getLocalTimeZoneIdentifier();

  await AwesomeNotifications().createNotification(
    content: NotificationContent(
      id: id,
      channelKey: 'basic key',
      title: 'Prayer Time Notification${Emojis.clothing_prayer_beads}',
      body: 'It\'s time for prayer!',
      bigPicture: 'asset://assets/adhan.png',
      notificationLayout: NotificationLayout.BigPicture,
      wakeUpScreen: true,
      locked: true,
      autoDismissible: false,
    ),
    schedule: NotificationCalendar(
      hour: targetHour,
      minute: targetMinute,
      second: 0,
      repeats: true, // 开启每日重复
      preciseAlarm: true,
      allowWhileIdle: true,
      timeZone: localTimeZone, // 指定本地时区,避免时间偏移
    ),
  );
}

关键修改点

  • 替换fromDate为显式日历参数:直接指定hour、minute,让系统明确识别每日同一时间重复触发的规则。
  • 处理时间过期场景:若当前时间已过当日祈祷时间,将首次触发时间延后至次日,避免误触发。
  • 指定时区:添加timeZone参数,确保通知在用户本地时区的正确时间触发。

额外注意事项

  • 在AndroidManifest.xml中配置必要权限:
    <uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM" />
    <uses-permission android:name="android.permission.USE_EXACT_ALARM" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    
  • 运行时请求用户授权精确闹钟权限(Android 12+要求):
    await AwesomeNotifications().requestPermissionToSendNotifications(
      permissions: [
        NotificationPermission.Alert,
        NotificationPermission.Sound,
        NotificationPermission.Badge,
        NotificationPermission.LockScreen,
        NotificationPermission.PreciseAlarm,
      ],
    );
    

内容的提问来源于stack exchange,提问作者Mohamed Reda

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 12:10:28