2012-08-25 14 views
7

Vorrei raggiungere questo obiettivo:notifiche quotidiane ad una certa ora

Dopo la prima svolta sulla domanda, l'utente riceve le notifiche, ogni giorno alle 02:00, se certa condizione è vera. Se la condizione è falsa, non stiamo mostrando una notifica questo giorno. La condizione è verificata alle 14:00, scarica alcuni dati da Internet.

Finora ho utilizzato AlarmManager e il suo metodo setRepeating() con intervallo di 24 ore. AlarmManager attiva un Service. In questo servizio sto scaricando i dati, controllando le condizioni e se è vero - mostrando Notification. Poiché il download può durare più di 5 secondi, ho dichiarato android:process=":background" per questo servizio, per eseguirlo in un processo separato e non bloccare l'interfaccia utente.

Questo approccio presenta due inconvenienti:


1: Se l'utente apre l'applicazione diciamo a 4pm (e la condizione è vera), riceverà la notifica immediatamente. Da setRepeating() documentazione:

Se si verifica il tempo nel passato, l'allarme verrà attivato immediatamente, con un conteggio di allarme a seconda di quanto in passato il tempo di attivazione è relativo al l'intervallo di ripetizione.

Mi piacerebbe che quell'utente non ricevesse una notifica questo giorno, solo il giorno successivo e così via.


2: Mi preoccupo che le mie notifiche non vengano visualizzate dopo che l'utente ha spento il telefono. Da AlarmManager documentazione:

allarmi registrati vengono mantenuti mentre il dispositivo è addormentato (e può opzionalmente svegliare il dispositivo su se se ne vanno in quel periodo), ma verrà cancellata se viene spento e riavviato.

Non so se è possibile farlo funzionare tutto il tempo.


Se avete qualche idea su come migliorarlo, siete i benvenuti.

risposta

6

1: Io non sono molto sicuro se ho capito la tua domanda, ma penso che tutto quello che dovete fare è se lo sia già passato 2:00 aggiungere un giorno a 14:00:

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: Si potrebbe registrare un BroadcastReceiver per l'avvio e avviare nuovamente la sveglia lì. Date un'occhiata a questo: Android BroadcastReceiver on startup - keep running when Activity is in Background

+0

questo è un buon suggerimento, io uso anche questo – slinden77

+0

Grazie mille! Ho una domanda, sei sicuro che: twopm.set (GregorianCalendar.HOUR, 2) sta impostando l'ora PM, non AM? Forse dovrei usare twoPm.set (GregorianCalendar.HOUR_OF_DAY, 14)? –

+0

sì, hai ragione – AntonS

Problemi correlati