Тревога не повторяется в выходные дни.

99
11

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

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

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

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

}
}

}

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

спросил(а) 2015-03-05T08:23:00+03:00 5 лет, 7 месяцев назад
1
Решение
91

Вы пытаетесь установить календарь, манипулируя 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);

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

ответил(а) 2015-03-08T20:30:00+03:00 5 лет, 7 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема