2016-04-10 8 views
6

La domanda di Alarm Manager dice cheAndroid impediscono di attivazione immediata del servizio di allarme se il tempo lo hanno fatto scattare per il giorno

Se il tempo di attivazione dichiarato è nel passato, l'allarme verrà attivato immediatamente.

Sono di fronte a questo problema nella mia domanda. Ecco il mio codice gestore allarmi:

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

C'è qualche soluzione per questo problema?

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

Ho scritto il codice per valutare se il tempo impostato per l'allarme è prima dell'ora corrente. Ecco la parte di sopra con le modifiche corrispondenti:

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 
       { 
       } 

Cosa devo il alarmManager al caso setTimestamp è prima currentTimestamp?

risposta

14

Non è necessario creare Timestamp s. Puoi farlo con il tuo 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); 

Vorrei anche ricordare che a partire dal KitKat, se il vostro targetSdkVersion è 19 o superiore, il metodo AlarmManager#set() non è esatto. Se si desidera che l'allarme si attivi in ​​un momento preciso, sarà necessario utilizzare un metodo setExact*().

Problemi correlati