2016-04-11 36 views
6

W mojej aplikacji mam funkcjonalność wywoła alarm w 4 senerios:Powtarzanie alarmu dla poszczególnych dni tygodnia android

  • tylko raz na datę i czas wybrany przez użytkownika
  • codziennie w wybranym czasie
  • tygodniowe zgodnie z wybraną datą i godziną
  • Użytkownik wybiera niestandardowe dni tygodnia

pomyślnie wdrożyć pierwsze 3 senerios za pomocą następująco:

tylko raz

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

Do codziennego harmonogramu:

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

Dla tygodniowego harmonogramu (wg daty systemowej):

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

Dla niestandardowych dni tygodnia wybranych przez użytkownika (np. tylko na poniedziałek i piątek, powtarzane co tydzień) Używam tego samego kodu, którego używałem do cotygodniowego planowania przez iterację. Ale nie działa na poniedziałek (który jest ustawiony przed piątkiem) i pracuje w piątek. Nie wywoła też alarmu na dziś, jeśli dzisiaj (data systemowa) jest poniedziałek lub piątek.

Jak zatem wdrożyć cotygodniowe harmonogramy alarmów dla niestandardowych dni tygodnia?

+0

Nie wiem zbyt wiele na ten temat, ale czy można uruchamiać/zatrzymywać alarmy w ramach działania, które uruchamiasz? Jeśli tak, to po uruchomieniu alarmu np. W poniedziałek, możesz zatrzymać ten alarm i rozpocząć piątek? –

Odpowiedz

8

Nie ma sposobu, aby powiedzieć Menedżerowi Alarmów, które dni ma ono wywołać.

Jednym z rozwiązań może być alarm dla każdego dnia tygodnia, w którym ma się uruchamiać powtarzanie co tydzień.

Tak więc w przypadku scenariusza w poniedziałek i piątek, ustawisz cotygodniowe przypomnienie w poniedziałek i cotygodniowe przypomnienie w piątek.

Przykładowy kod:

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

Dzięki za odpowiedź. Tak, robię to samo, co sugerujesz. Ale nadal menedżer alarmów pomija dzisiejszy (lub bieżący tydzień) alarm. –

+0

Hey @DhruvilPatel czy rozwiązałeś swój problem? Mam ten sam problem z menadżerem, który omija dzisiejszy alarm. – Oiproks

0

Powiedział pan, że został użyty ten sam kod swojego tygodniowego harmonogramu „przez iteracji”. Jeśli rozumiem, że próbujesz ustawić alarm wielokrotny (dwa w twoim przykładzie) z tym samym PendingIntent.

Problemem jest to, że jako documentation says

Po ustawieniu drugi alarm, który używa tego samego toku intencję, to zastępuje oryginalny alarm.

W ten sposób wyzwalany jest tylko drugi alarm.

Aby rozwiązać problem, należy po prostu użyć innego PendingIntent dla każdego harmonogramu.

+0

Tak, używając tego samego PendingIntent, zastępowałem mój poprzedni alarm, poprawiłem to. Ale to nie rozwiązało mojego drugiego problemu: dzisiejszy alarm nie uruchamia się. –

+0

@DroidHive możesz pokazać mi kod, którego używasz do planowania dwóch alarmów? – GVillani82

1

To rozwiąże twój problem.

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

Thing to focus tutaj, aby uniknąć pominięcia bieżącego tygodnia. :

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

zasadniczo skopiowałeś moją odpowiedź? https://stackoverflow.com/a/36551155/1240523 – RobVoisey