2016-04-11 26 views
6

Nella mia domanda ho una funzionalità per far scattare l'allarme in 4 senerios:Ripetendo allarme per giorni specifici della settimana Android

  • solo una volta per una data e ora utente scelto
  • giornaliere per tempo scelto
  • settimanali in base alla data e l'ora scelti
  • scelto dall'utente giorni personalizzati della settimana

ho implementare con successo i primi 3 senerios utilizzando il seguente:

Solo una volta:

Calendar calendar = Calendar.getInstance(); 

     calendar.set(Calendar.YEAR, Integer.parseInt(date[0])); 
     calendar.set(Calendar.MONTH, (Integer.parseInt(date[1])) - 1); 
     calendar.set(Calendar.DAY_OF_MONTH, Integer.parseInt(date[2])); 
     calendar.set(Calendar.HOUR_OF_DAY, Integer.parseInt(time[0])); 
     calendar.set(Calendar.MINUTE, Integer.parseInt(time[1])); 
     calendar.set(Calendar.SECOND, 0); 

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

Per programmazione giornaliera:

Calendar calendar = Calendar.getInstance(); 
      calendar.setTimeInMillis(System.currentTimeMillis()); 
      calendar.set(Calendar.HOUR_OF_DAY, Integer.parseInt(time[0])); 
      calendar.set(Calendar.MINUTE, Integer.parseInt(time[1])); 
      calendar.set(Calendar.SECOND, 0); 

      alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntent); 

Per la programmazione settimanale (come da data di sistema):

Calendar calendar = Calendar.getInstance(); 
     calendar.setTimeInMillis(System.currentTimeMillis()); 

     calendar.set(Calendar.DAY_OF_WEEK, dayOfWeek); 
     calendar.set(Calendar.HOUR_OF_DAY, Integer.parseInt(time[0])); 
     calendar.set(Calendar.MINUTE, Integer.parseInt(time[1])); 
     calendar.set(Calendar.SECOND, 0); 
     //long interval = calendar.getTimeInMillis() + 604800000L; 
     alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY * 7, pendingIntent); 

Per i giorni della settimana personalizzati scelti dall'utente (ad es. solo per lunedì e venerdì, ripetuti settimanalmente) Sto usando lo stesso codice che ho usato per la programmazione settimanale per iterazione. Ma non funziona per lunedì (che è fissato prima di venerdì) e lavora per venerdì. Inoltre, non attiva l'allarme per oggi se oggi (data del sistema) è un lunedì o un venerdì.

Quindi, come posso implementare la pianificazione settimanale degli allarmi per i giorni della settimana personalizzati?

+0

Non so molto su questo, ma è possibile avviare/arrestare gli allarmi all'interno dell'Intento che si sta attivando? In tal caso, dopo l'attivazione dell'allarme, ad esempio lunedì, puoi interrompere l'allarme e avviare quello del venerdì? –

risposta

8

Non esiste un modo per comunicare a Alarm manager quali giorni si desidera attivare.

Una soluzione sarebbe avere un allarme per ogni giorno della settimana in cui si desidera che si attivi ripetendo ogni settimana.

Quindi, per lo scenario del lunedì e del venerdì, è necessario impostare un promemoria ripetitivo settimanale il lunedì e un promemoria ripetuto settimanale il venerdì.

codice Esempio:

private void scheduleAlarm(int dayOfWeek) { 

    Calendar calendar = Calendar.getInstance(); 
    calendar.set(Calendar.DAY_OF_WEEK, dayOfWeek); 

    // Check we aren't setting it in the past which would trigger it to fire instantly 
    if(calendar.getTimeInMillis() < System.currentTimeMillis()) { 
     calendar.add(Calendar.DAY_OF_YEAR, 7); 
    } 

    // Set this to whatever you were planning to do at the given time 
    PendingIntent yourIntent; 

    AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 
    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY * 7, yourIntent); 
} 

private void setUpAlarms() { 

    scheduleAlarm(Calendar.MONDAY); 
    scheduleAlarm(Calendar.FRIDAY); 
} 
+0

Grazie per la risposta. Sì, sto facendo la stessa cosa che hai suggerito. Tuttavia, il gestore degli allarmi sta saltando l'allarme di oggi (o della settimana corrente). –

+0

Ehi @DhruvilPatel hai risolto il tuo problema? Sto riscontrando lo stesso problema con il manager che ha saltato l'allarme di oggi. – Oiproks

0

Lei ha detto che si è utilizzato lo stesso codice della vostra programmazione settimanale, "per iterazione". Se capisco che stai tentando di impostare più sveglie (due nel tuo esempio) con lo stesso PendingIntent.

Il problema è che, come il documentation says

Quando si imposta un secondo allarme che utilizza lo stesso intento in attesa, si sostituisce l'allarme originale.

Questo è il modo in cui viene attivato solo il secondo allarme.

Quindi, per risolvere il problema, è sufficiente utilizzare un diverso PendingIntent per ciascuna pianificazione.

+0

Sì, utilizzando lo stesso PendingIntent sostituivo il mio allarme precedente, l'ho rettificato. Ma questo non ha risolto il mio altro problema: l'allarme di oggi non si sta innescando. –

+0

@DroidHive puoi mostrarmi il codice che stai usando per programmare i due allarmi? – GVillani82

1

Questo risolverà il tuo problema.

private void scheduleAlarm(int dayOfWeek) { 

     Calendar calendar = Calendar.getInstance(); 
     calendar.set(Calendar.DAY_OF_WEEK, dayOfWeek); 

     // Accept the change here at this line to avoid skipping of current week. 
     if(calendar.getTimeInMillis() < System.currentTimeMillis()) { 
      calendar.add(Calendar.DAY_OF_YEAR, new GregorianCalendar().get(Calendar.DAY_OF_WEEK)-1); 
     } 

     // Set this to whatever you were planning to do at the given time 
     PendingIntent yourIntent; 

     AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 
     alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY * 7, yourIntent); 
    } 

    private void setUpAlarms() { 

     scheduleAlarm(Calendar.MONDAY); 
     scheduleAlarm(Calendar.FRIDAY); 
    } 

Cosa mettere a fuoco qui per evitare di saltare la settimana corrente. :

calendar.add(Calendar.DAY_OF_YEAR, new GregorianCalendar().get(Calendar.DAY_OF_WEEK)-1); 
+0

hai sostanzialmente copiato la mia risposta? https://stackoverflow.com/a/36551155/1240523 – RobVoisey