2016-04-10 32 views
6

odniesienie dla Alarm Manager mówi, żeandroid zapobiec natychmiastowe spust obsługi alarmu, jeśli alarm czas upłynął na dzień

Jeśli czas wyzwalania zaznaczono to w przeszłości, alarm zostanie wyzwolony natychmiast.

Mam do czynienia z tym problemem w mojej aplikacji. Oto mój kod menedżera alarmów:

Intent myIntent = new Intent(getActivity(), DinnerAlarmReceiver.class); 
       pendingDinnerIntent = PendingIntent.getBroadcast(getActivity(), 0, myIntent, 0); 

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

       alarmManager.set(AlarmManager.RTC_WAKEUP, 
         calendar.getTimeInMillis(), pendingDinnerIntent); 

Czy istnieje obejście tego problemu?

----- EDIT ------

Pisałem jakiś kod, aby ocenić, czy ustawiony czas alarmu jest przed obecnym czasie. Oto część z wyżej odpowiednich zmian:

Calendar calendar = Calendar.getInstance(); 
       long currentTime = calendar.getTimeInMillis(); 
       calendar.set(Calendar.HOUR_OF_DAY, hourOfDay); 
       calendar.set(Calendar.MINUTE, minute); 
       long setTime = calendar.getTimeInMillis(); 
       Timestamp setTimestamp = new Timestamp(setTime); 
       Timestamp currentTimestamp = new Timestamp(currentTime); 
       if (setTimestamp.after(currentTimestamp)) 
       { 
        alarmManager.set(AlarmManager.RTC_WAKEUP, 
          calendar.getTimeInMillis(), pendingDinnerIntent); 
       } 
       else 
       { 
       } 

Co powinno I alarmManager w przypadku setTimestamp jest przed currentTimestamp?

Odpowiedz

14

Nie trzeba tworzyć Timestamp s. Możesz to zrobić za pomocą swojego Calendar.

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

if(calendar.before(Calendar.getInstance())) { 
    calendar.add(Calendar.DATE, 1); 
} 

alarmManager.set(AlarmManager.RTC_WAKEUP, 
    calendar.getTimeInMillis(), pendingDinnerIntent); 

Chciałbym również wspomnieć, że od KitKat, jeśli targetSdkVersion wynosi 19 lub powyżej, sposób AlarmManager#set() nie jest dokładna. Jeśli chcesz, aby alarm uruchamiał się dokładnie w tym samym czasie, musisz użyć metody setExact*().