将闹钟设置为在不同时间重复工作日

时间:2016-06-18 14:14:46

标签: java android calendar alarmmanager

所以我正在为Android创建一个警报应用程序,但我在设置警报时遇到了一些麻烦。如果今天是星期六,我在今天和明天的17:15发出警报,它应该响两次,但它根本不响。此外,如果没有选择日期,则闹钟应在下次时钟与之匹配时响铃,然后关闭。我在这里搜索了这个问题并找到了许多解决方案,但它们似乎都不适合我。这是AlarmReceiver代码。

 public void setAlarmSpecificDay(int dayOfWeek, AlarmManager am, PendingIntent pi, Date time) {
    Calendar cal1 = Calendar.getInstance();
    int today = cal1.get(Calendar.DAY_OF_WEEK);
    int numberOfDaysToAdd = dayOfWeek - today;
    if (dayOfWeek < today) {
        // Desired day is earlier in the week than today, add 7 days to
        //  ensure it is in the future
        numberOfDaysToAdd += 7;
    }
    cal1.setTime(time);
    cal1.set(Calendar.DAY_OF_WEEK, numberOfDaysToAdd);

    Long alarmTime = cal1.getTimeInMillis();
    am.setRepeating(AlarmManager.RTC_WAKEUP, alarmTime,( 7 * 24 * 60 * 60 * 1000), pi);
    Log.d("Alarm Service", "Alarm set for day " + dayOfWeek + " at ms: " + alarmTime +" " + cal1 );
}

如果我使用此代码并将闹钟设置为星期五,星期六和星期日响铃,最后一个日志会说:

然后警报响起约1分钟后。这必须与我从日历中获取时间的方式有关,但我无法弄明白。一直在这,并谷歌搜索几个小时。

 Alarm set for day 5 at ms: 1466789400000
Alarm set for day 6 at ms: 1466875800000
Alarm set for day 7 at ms: 1466357400000

当我将时钟安排到19:30 FSS并且现在时钟是19:38时,这是警报应该触发的MS,如果我将MS转换为网站上的日期数字是正确的!

1466789400000 = Fri Jun 24 2016 19:30:00 GMT+0200
1466875800000 = Sat Jun 25 2016 19:30:00 GMT+0200
1466357400000 = Sun Jun 19 2016 19:30:00 GMT+0200

1 个答案:

答案 0 :(得分:1)

您的代码中存在两个问题:

  1. 待定意图被过度使用。因此,只需设置一个警报,因为您正在通过(FLAG_UPDATE_CURRENT)更新当前设置的待定意图。
  2. 闹钟管理器中设置了错误的时间。如果您检查第7天警报的时间戳,您会看到它的过去。因此立即触发警报。
  3. 解决方案:

    1. 使用唯一的请求代码创建不同的待处理意图。

      PendingIntent getBroadcast(上下文上下文,                 int requestCode,//使用它,设置一些唯一值                 意图,                 int flags)

    2. 如果所需的日期比本周早,则将<7天添加到 DAY_OF_YEAR ,而不是星期几。

      cal1.add(Calendar.DAY_OF_YEAR,numberOfDaysToAdd);