2016-04-11 6 views
6

In meiner Anwendung ich eine Funktionalität Alarm auszulösen in 4 senerios:Wiederholung Alarm für bestimmte Tage der Woche android

  • nur einmal für einen Benutzer gewählten Datum und die Uhrzeit
  • täglich für gewählte Zeit
  • wöchentlich nach gewähltem Datum und Uhrzeit
  • Benutzer gewählten individuelle Tage der Woche

ich erfolgreich umzusetzen die erste 3 senerios durch die Folge mit:

Nur einmal:

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

Für tägliche Disposition:

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

Für Wochenzeitschaltpro- (nach Systemdatum):

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

Für benutzerdefinierte Wochentage, die vom Benutzer ausgewählt wurden (z. nur für Montag und Freitag, wiederholt wöchentlich) Ich verwende den gleichen Code, den ich für die wöchentliche Planung durch Iteration verwendet habe. Aber es funktioniert nicht für Montag (der vor Freitag eingestellt wird) und arbeitet für Freitag. Außerdem wird der Alarm für heute nicht ausgelöst, wenn heute (Systemdatum) ein Montag oder Freitag ist.

Wie kann ich die wöchentliche Alarmplanung für benutzerdefinierte Wochentage implementieren?

+0

Ich weiß nicht viel darüber, aber können Sie Alarme in der Absicht, die Sie auslösen, starten/stoppen? Wenn dies der Fall ist, nachdem der Alarm beispielsweise am Montag ausgelöst wurde, können Sie diesen Alarm stoppen und den Freitag starten? –

Antwort

8

Es gibt keine Möglichkeit für Sie, dem Alarmmanager mitzuteilen, an welchen Tagen er ausgelöst werden soll.

Eine Lösung wäre, einen Alarm für jeden Wochentag zu haben, den Sie wöchentlich wiederholen möchten.

Für Ihr Montag- und Freitag-Szenario würden Sie eine wöchentliche Wiederholungserinnerung am Montag und eine wöchentliche Wiederholungserinnerung am Freitag festlegen.

Beispielcode:

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

Danke für die Antwort. Ja, ich mache dasselbe, was Sie vorgeschlagen haben. Der Alarmmanager überspringt jedoch den heutigen Alarm (oder die aktuelle Woche). –

+0

Hey @DhruvilPatel hast du dein Problem gelöst? Ich habe das gleiche Problem mit dem Manager, der den heutigen Alarm auslässt. – Oiproks

0

Sie haben gesagt, dass Sie den gleichen Code Ihrer Wochenzeitschaltpro- verwendet, "durch Iteration". Wenn ich verstehe, dass Sie versuchen, mehrere Alarme (zwei in Ihrem Beispiel) mit der gleichen PendingIntent zu setzen.

Das Problem ist, dass, wenn die documentation says

Wenn Sie einen zweiten Alarm einzustellen, der die gleiche anstehende Absicht verwendet, es ersetzt den ursprünglichen Alarm.

So wird nur der zweite Alarm ausgelöst.

Also, um Ihr Problem zu lösen, müssen Sie einfach eine andere PendingIntent für jede Planung verwenden.

+0

Ja, mit dem gleichen PendingIntent wurde mein vorheriger Alarm ersetzt, das habe ich behoben. Aber das hat mein anderes Problem nicht gelöst: Der Alarm von heute löst nicht aus. –

+0

@DroidHive können Sie mir den Code zeigen, den Sie für die Planung der beiden Alarme verwenden? – GVillani82

1

Dies wird Ihr Problem lösen.

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

Hier konzentrieren, um zu vermeiden, aktuelle Woche zu überspringen. :

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

Sie haben meine Antwort im Wesentlichen kopiert? https://stackoverflow.com/a/36551155/1240523 – RobVoisey

Verwandte Themen