2014-09-25 3 views
0

У меня есть приложение, которое устанавливает аварийные сигналы в определенное время, указанное в TimePicker (24-часовой режим).Android AlarmManager устанавливает будильник на следующий день

Я заметил, что если это время, например. 23:00, и вы установите будильник на 01:00, AlarmManager интерпретирует это как уже прошедшую дату. В настоящее время я поставил мои тревоги, как следующее:

private void setUpAlarm(int hour, int minute){ 
    long timeInMs = 0; 
    long currentTimeInMs = 0; 
    long timeDifference = 0; 

    // Set up a calendar to calculate when the alarm should go off 
    Calendar customCalendar = new GregorianCalendar(); 
    customCalendar.set(Calendar.HOUR_OF_DAY, hour); 
    customCalendar.set(Calendar.MINUTE, minute); 
    customCalendar.set(Calendar.SECOND, 0); 
    customCalendar.set(Calendar.MILLISECOND, 0); 

    Date customDate = customCalendar.getTime(); 

    timeInMs = customDate.getTime(); 
    currentTimeInMs = System.currentTimeMillis(); 
    timeDifference = timeInMs - currentTimeInMs; 

    /* 
    * If the user has entered a date that has passed (time difference is negative) 
    * add 24 hours to the alarm time. 
    */ 
    if(timeDifference < 0){ 
     timeInMs += 86400000; 
    } 

    //set the alarm 
    Intent intent = new Intent(this, AlarmClockRingRing.class); 
    action = PendingIntent.getActivity(this, (int)timeInMs, 
      intent, 0); 
    AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE); 
    am.set(AlarmManager.RTC_WAKEUP, timeInMs, action); 
    Toast.makeText(this, "One shot alarm set at " + alarmTime, Toast.LENGTH_LONG).show(); 
} 

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

С уважением,

Маркус

ответ

0

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

customCalendar.set(Calendar.HOUR_OF_DAY, hour); 
customCalendar.set(Calendar.MINUTE, minute); 
customCalendar.set(Calendar.SECOND, 0); 
customCalendar.set(Calendar.MILLISECOND, 0); 

Я изменил его

customCalendar.setTimeInMillis(System.currentTimeMillis()); 
customCalendar.add(Calendar.HOUR_OF_DAY, diffHours); 
customCalendar.add(Calendar.MINUTE, diffMinutes); 
customCalendar.set(Calendar.SECOND, 0); 
customCalendar.set(Calendar.MILLISECOND, 0); 

получить diffHours и diffMinutes вот так

diffHours = timeDifference/(60 * 60 * 1000) % 24; 
diffMinutes = timeDifference/(60 * 1000) % 60; 

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

if (timeDifference == 0) { 
    diffHours = 24; 
} 

Что делать, если я хотите управлять днями? делают это

diffDays = timeDifference/(24 * 60 * 60 * 1000); 

затем преобразовать дней до нескольких часов, как этот

if (diffDays != 0) { 
    diffHours = diffHours + (diffDays * 24); 
} 

также изменить ваш:

if (timeDifference < 0) { 
    timeInMs += 86400000; 
} 

к:

if (timeDifference < 0) { 
    timeDifference += 86400000; 
} 

И ваш:

am.set(AlarmManager.RTC_WAKEUP, timeInMs, action); 

To:

am.set(AlarmManager.RTC_WAKEUP, customCalendar.getTimeInMillis(), action); 
Смежные вопросы