2012-08-25 3 views
7

Ich mag würde dies erreichen:Everyday-Benachrichtigungen zu bestimmten Zeit

Nach dem ersten Einschalten der Anwendung empfängt Benutzerbenachrichtigungen, jeden Tag um 14.00 Uhr, wenn bestimmte Bedingung erfüllt ist. Wenn die Bedingung falsch ist, zeigen wir an diesem Tag keine Benachrichtigung an. Die Bedingung wird um 14 Uhr überprüft, es werden einige Daten aus dem Internet heruntergeladen.

Bisher habe ich AlarmManager und seine Methode setRepeating() mit 24h-Intervall verwendet. AlarmManager startet eine Service. In diesem Service lade ich die Daten herunter, überprüfe den Zustand und ob es wahr ist - zeige Notification. Da das Herunterladen mehr als 5 Sekunden dauern kann, habe ich android:process=":background" für diesen Dienst deklariert, um es in einem separaten Prozess auszuführen und meine Benutzeroberfläche nicht zu blockieren.

Dieser Ansatz hat zwei Nachteile:


1: Wenn bei Anwendung lassen Sie uns öffnet um 16.00 Uhr sagen (und die Bedingung wahr ist), wird er die Benachrichtigung erhalten sofort. Von setRepeating() Dokumentation:

Wenn die Zeit in der Vergangenheit stattfindet, wird der Alarm sofort mit einem Alarmzählwert je nachdem, wie weit in der Vergangenheit der das Wiederholungsintervall Triggerzeit ist relativ ausgelöst werden.

Ich möchte, dass Benutzer diesen Tag keine Benachrichtigung erhält, nur am nächsten Tag und so weiter.


2: Ich mache mir Sorgen, dass meine Benachrichtigungen nicht angezeigt werden, nachdem der Benutzer das Telefon ausgeschaltet hat. Von AlarmManager Dokumentation:

registrierten Alarme zurückgehalten werden, während das Gerät im Ruhezustand befindet (und das Gerät optional wecken können, wenn sie während dieser Zeit gehen), aber wird gelöscht, wenn sie ausgeschaltet ist und neu gestartet.

Ich weiß nicht, ob es möglich ist, es die ganze Zeit arbeiten zu lassen.


Wenn Sie irgendwelche Ideen haben, wie Sie es besser machen können, sind Sie willkommen.

Antwort

6

1: Ich bin mir nicht ganz sicher, ob ich Ihre Frage verstanden, aber ich denke, alles, was Sie tun müssen, ist, wenn es bereits vorbei 14.00 Uhr einen Tag, um 02.00 hinzufügen:

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: Sie könnten Registrieren Sie einen BroadcastReceiver für das Booten und starten Sie Ihren Alarm erneut dort. Werfen Sie einen Blick auf diese: Android BroadcastReceiver on startup - keep running when Activity is in Background

+0

Dies ist ein guter Vorschlag, ich benutze auch diese – slinden77

+0

Vielen Dank! Ich habe eine Frage, bist du dir sicher, dass: twopm.set (GregorianCalendar.HOUR, 2) setzt die Stunde PM, nicht AM? Vielleicht sollte ich twoPm.set (GregorianCalendar.HOUR_OF_DAY, 14) verwenden? –

+0

ja, du hast Recht – AntonS