Будильник не повторяется в выбранные дни недели.

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

Например, считайте сегодня «средой», если я выберу вторник и четверг, будильник сработает при его создании. но он должен сработать в ближайший вторник и завтра соответственно. Я не могу найти ошибку в следующем коде.

Я не могу найти, какую ошибку я делаю.

//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);

        }
   }

}

Помогите мне, пожалуйста. Заранее спасибо.


person Ravitheja    schedule 05.03.2015    source источник


Ответы (1)


Вы пытаетесь установить календарь, манипулируя DAY_OF_WEEK. Экземпляр Calendar всегда представляет определенный момент времени. Когда вы вызываете Calendar.getInstance(), вам предоставляется экземпляр Calendar, инициализированный текущей датой и временем. Давайте использовать пример:

Я запускаю этот код сегодня, в воскресенье, 8 марта 2015 г., в 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 (что в марте является понедельником). Кроме того, нет никакого способа сообщить 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);

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

person David Wasser    schedule 08.03.2015
comment
См. stackoverflow.com/questions/1319473/ - person David Wasser; 09.03.2015