2012-08-25 12 views
7

Chciałbym osiągnąć to:Codzienne powiadomienia w określonym czasie

Po pierwszym włączeniu aplikacji, użytkownik otrzymuje powiadomienia, codziennie o godzinie 14.00, jeśli spełniony jest pewien warunek. Jeśli warunek jest fałszywy, nie wyświetlamy powiadomienia w tym dniu. Warunek jest sprawdzany o godzinie 14:00, pobiera niektóre dane z Internetu.

Do tej pory użyłem AlarmManager i jego metody setRepeating() z interwałem 24h. AlarmManager uruchamia się pod numerem Service. W tej usłudze pobieram dane, sprawdzam warunek i jeśli to prawda - pokazując Notification. Ponieważ pobieranie może trwać dłużej niż 5 sekund, zadeklarowałem android:process=":background" dla tej usługi, aby uruchomić ją w oddzielnym procesie i nie blokować mojego interfejsu użytkownika.

Podejście to ma dwie wady:


1: Jeśli użytkownik otworzy aplikację powiedzmy na 4pm (a warunek jest prawdą), otrzyma powiadomienie natychmiast. Od setRepeating() dokumentacji:

Jeśli wystąpi razem w przeszłości, alarm zostanie wyzwolony natychmiast, z liczby alarmów w zależności od tego, jak daleko w przeszłość czas wyzwalania jest w stosunku do powtarzania przedziału.

Chciałbym, aby ten użytkownik nie otrzymał powiadomienia w tym dniu, tylko następnego dnia i tak dalej.


2: Obawiam się, że moje powiadomienia nie będą wyświetlane po wyłączeniu telefonu przez użytkownika. Od AlarmManager dokumentacji:

Zarejestrowane alarmy są zatrzymywane, gdy urządzenie jest w trybie uśpienia (i ewentualnie może obudzić urządzenie w górę, jeśli zgaśnie w tym czasie), ale zostaną usunięte, jeśli jest wyłączony i ponownie uruchomiony.

Nie wiem, czy to możliwe, aby działało przez cały czas.


Jeśli masz jakieś pomysły, jak je poprawić, nie ma za co.

Odpowiedz

6

1: Nie jestem pewien, czy zrozumiałem pytanie, ale myślę, że wszystko, co musisz zrobić, to jeśli już jest przeszłość godzina czternasta dodać dzień do 2pm:

GregorianCalendar twopm = new GregorianCalendar(); 
twopm.set(GregorianCalendar.HOUR_OF_DAY, 14); 
twopm.set(GregorianCalendar.MINUTE, 0); 
twopm.set(GregorianCalendar.SECOND, 0); 
twopm.set(GregorianCalendar.MILLISECOND, 0); 
if(twopm.before(new GregorianCalendar())){ 
    twopm.add(GregorianCalendar.DAY_OF_MONTH, 1); 
} 
alarmManager.setRepeating(type, twopm.getTimeInMillis(), 1000*60*60*24, intent); 

2: Mogłabyś zarejestruj BroadcastReceiver do startu i uruchom ponownie swój alarm. Spójrz na to: Android BroadcastReceiver on startup - keep running when Activity is in Background

+0

Jest to dobra sugestia, ja też używam tego – slinden77

+0

Dziękuję bardzo! Mam pytanie, czy jesteś pewien, że: twopm.set (GregorianCalendar.HOUR, 2) ustawia godzinę PM, a nie AM? Może powinienem użyć twoPm.set (GregorianCalendar.HOUR_OF_DAY, 14)? –

+0

tak, masz rację – AntonS

Powiązane problemy