我正在创建一个警报,并选择了一些特定日期。我希望在某个时间段的某个工作日重复闹钟。 但是,当我选择过去和未来的工作日时,我会立即触发警报。
例如,今天考虑周三'如果我选择星期二和星期四,则会在创建它时触发警报。但它应分别在即将到来的星期二和明天开火。 我无法在以下代码中找到错误。
我无法找到我正在做的错误。
//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);
}
}
}
请帮帮我。提前谢谢。
答案 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);
您可能仍需要检查警报所需的时间是否已经过去,并使用类似的算法将其设置为将来某个日期。希望你明白了。