在选定的工作日,警报不会重复。

时间:2015-03-05 05:23:55

标签: android calendar alarmmanager android-pendingintent repeatingalarm

我正在创建一个警报,并选择了一些特定日期。我希望在某个时间段的某个工作日重复闹钟。 但是,当我选择过去和未来的工作日时,我会立即触发警报。

例如,今天考虑周三'如果我选择星期二和星期四,则会在创建它时触发警报。但它应分别在即将到来的星期二和明天开火。 我无法在以下代码中找到错误。

我无法找到我正在做的错误。

//scheduling the alarm for repeating on selected days
public void scheduleDay(int request_code_value, String alarm_title) 
{

   Calendar calendar = Calendar.getInstance();


   for(int i = 1; days.size() >= i; i++)
   {
       if ((days.get("" + i)) == 1)
       {
           // for creating different alarms adding i to request_code_value  for uniqueness
           request_code_value = request_code_value +i;

           String filter_action = "com.ibkr.yowakeup" + request_code_value +"_time";


            IntentFilter filter = new IntentFilter(filter_action);

            registerReceiver(new AlarmReciever(), filter);


            Intent intent = new Intent(filter_action);
            intent.putExtra(getString(R.string.get_current_intent_value), request_code_value);
            intent.putExtra(getString(R.string.alarmtext), alarm_title);
            intent.putExtra(getString(R.string.alarm_time), newAlarm_Choose_Alarm_Value.getText().toString());


            Log.d(TAG,"Scheduled on " + i + " = " + days.get("" + i));

            calendar.set(Calendar.DAY_OF_WEEK, i);
            calendar.set(Calendar.HOUR_OF_DAY, selected_hour);// cal.get(Calendar.HOUR_OF_DAY);
            calendar.set(Calendar.MINUTE, selected_min);// cal.get(Calendar.MINUTE);
            calendar.set(Calendar.SECOND, 0);// cal.get(Calendar.SECOND);
            calendar.set(Calendar.MILLISECOND, 0);


            PendingIntent pendingIntent = PendingIntent.getBroadcast(this, request_code_value , intent, 0);

            alarmManager.setRepeating(AlarmManager.RTC, calendar.getTimeInMillis(), 
                    AlarmManager.INTERVAL_DAY * 7,
                    pendingIntent);

        }
   }

}

请帮帮我。提前谢谢。

1 个答案:

答案 0 :(得分:0)

您正在尝试通过操纵DAY_OF_WEEK来设置日历。 Calendar实例始终表示特定时间点。当您致电Calendar.getInstance()时,您将获得一个初始化为当前日期和时间的Calendar实例。我们来举个例子:

我今天在2015年3月8日星期日08:00运行此代码。我从调用Calendar获得的Calendar.getInstance()被初始化为此日期/时间。由于今天是星期日,如果您致电DAY_OF_WEEK,则calendar.get(Calender.DAY_OF_WEEK)的价值为Calendar.SUNDAY,即{1}。

我们现在想要为星期二设置闹钟。在这种情况下,您的代码将调用:

calendar.set(Calendar.DAY_OF_WEEK, i);

其中i设置为Calendar.TUESDAY,其值为3.

现在应该怎么办?对于日期/时间的所有这些部分,Calendar实例实际上没有单独的字段。它只包含表示特定日期/时间的单个值。否则,如果您尝试将DAY_OF_WEEK设置为SUNDAY并将DAY_OF_MONTH设置为9(3月为星期一),则可能会产生不一致。此外,无法告诉Calendar是否应将日期调整为上一个SUNDAY或下一个SUNDAY。可能有一种方法可以确定这一点,但我不会这样做。

出于这个原因,您绝不应该尝试设置 Calendar字段,例如DAY_OF_WEEK。相反,您应该通过致电calendar.get(Calendar.DAY_OF_WEEK)确定当前的某一天,然后通过添加正确的天数来调整日历实例,以达到您想要的那一天。像这样:

int desiredDay = // the day of the week you want to set the alarm for
int today = calendar.get(Calendar.DAY_OF_WEEK);
int numberOfDaysToAdd = desiredDay - today;
if (desiredDay < today) {
    // Desired day is earlier in the week than today, add 7 days to
    //  ensure it is in the future
    numberOfDaysToAdd += 7;
}
calendar.add(Calendar.DAY, numberOfDaysToAdd);

您可能仍需要检查警报所需的时间是否已经过去,并使用类似的算法将其设置为将来某个日期。希望你明白了。