Android: ставить будильник каждый день, кроме выходных

Я прочитал много статей, однако я не нашел/или просто пропустил ответ на свой конкретный вопрос, это странно, потому что я думаю, что пытаюсь реализовать общий случай. Что я хочу, так это ставить будильник на каждый день, кроме выходных, то есть с понедельника по пятницу в определенное время.

В настоящее время я делаю следующее:

Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, hour);
calendar.set(Calendar.MINUTE, minute);

Intent intent = creating an Intent here
PendingIntent pendingIntent = PendingIntent.getService(context, 0, intent, 0);

am.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntent);

насколько я понимаю, следующий код будет запускать сигнал тревоги в указанное мной время и делать это каждый день из-за AlarmManager.INTERVAL_DAY.

Я думал о следующем, чтобы выполнить мою задачу:

  for(int i = 1; i < 6; i++) {
    calendar.add(Calendar.DAY_OF_WEEK, i);
  }

Но я не уверен в правильности этой логики. Не могли бы вы 1. поправить меня, если я что-то упустил 2. предложить какое-то правильное решение или просто ваши мысли для выполнения моей задачи

Обновление:

Ну, я подумал о следующем: что, если бы я

calendar.set(Calendar.DAY_OF_WEEK, 1);

а потом

am.setRepeating(AlarmManager.RTC_WAKEUP, date.getTimeInMillis(), AlarmManager.INTERVAL_DAY * 5, pendingIntent);

поэтому в результате я установлю начальный день на понедельник и повторю его 5 раз, поэтому с понедельника по пятницу, независимо от текущей даты, когда пользователь устанавливает будильник, это правильно или я что-то упускаю? Кстати, как я могу обновить setRepeating, чтобы он повторялся каждую неделю, а не только одну?

Обновление 1:

Думаю, я понял свою ошибку, используя приведенный выше код, я буду делать некоторые странные вещи, поэтому день инициализации - понедельник, однако интервал повторения - один раз в 5 дней, а не каждый день с понедельника по пятницу.


person tratto    schedule 07.11.2013    source источник
comment
Вы можете проверить, является ли день SATURDAY или SUNDAY после добавления времени к calendar, а затем принять решение не устанавливать будильник. Однако вы не можете использовать setRepeating(), так как он не может проверить день.   -  person Andrew T.    schedule 07.11.2013
comment
Привет спасибо. Ну, я не понимаю, как я могу установить начальный день в понедельник и повторять будильник каждый день, кроме выходных, независимо от того, какой текущий день, когда пользователь устанавливает будильник   -  person tratto    schedule 07.11.2013
comment
Извините, я только что увидел вашу правку (Update1) и кажется, что она намного проще, чем моя идея. Я думал использовать .set() с Calendar, установленным на дни недели вручную, но это очень хлопотно. Кстати, я рекомендую вам опубликовать свою находку в качестве ответа на этот пост. Это нормально (и рекомендуется!) для спрашивающего ответить на свой вопрос здесь :)   -  person Andrew T.    schedule 07.11.2013
comment
Спасибо :) переместил обновления в раздел ответов   -  person tratto    schedule 07.11.2013
comment
ваш цикл for неверен for(int i = 1; i ‹ 6; i++) { calendar.add(Calendar.DAY_OF_WEEK, i); } ...это цикл только от 1 до 5..Это должно быть for(int i = 1; i ‹= 7; i++)   -  person Shakeeb Ayaz    schedule 07.11.2013
comment
@ShakeebShaheen, вы упускаете из виду, что я пытался избегать субботы и воскресенья, поэтому я использовал 1->5, а не 1->7   -  person tratto    schedule 07.11.2013
comment
Кстати, может быть вы знаете, использование for(int i = 1; i ‹ 6; i++) { calendar.add(Calendar.DAY_OF_WEEK, i); } а использование isWeekend - это то же самое, говоря об обработке только понедельника-пятницы или нет?   -  person tratto    schedule 07.11.2013


Ответы (1)


Кажется, что единственным решением является установка

am.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntent);

и в обработчике огня, который я указал в конструкторе Intent, проверить текущий день и избежать уведомления, если это суббота или воскресенье.

...
  if(intent.getBooleanExtra(INTENT_NOTIFY, false) && !isWeekend())
    showNotification();
...

  private boolean isWeekend() {
    Calendar calendar = Calendar.getInstance();
    int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
    return (dayOfWeek == Calendar.SATURDAY || dayOfWeek == Calendar.SUNDAY);
  }

Кстати, подскажите пожалуйста, я поставил будильник в режим повтора, в первый раз он сработал, потом открываю настройки эмулятора и вручную сдвигаю дату на завтра и время назад, но будильник не срабатывает, это что-то с эмулятором или у меня какие-то ошибки в коде?

person tratto    schedule 07.11.2013