2012-08-25 14 views
7

me gustaría lograrlo:notificaciones todos los días a tiempo determinado

Después de la primera calle a la aplicación, el usuario recibe notificaciones, cada día a las 14:00, si cierta condición es verdadera. Si la condición es falsa, no mostramos una notificación este día. La condición se verifica a las 2 p.m., descarga algunos datos de Internet.

Hasta ahora he usado AlarmManager y su método setRepeating() con un intervalo de 24h. AlarmManager activa un Service. En este Servicio, estoy descargando los datos, comprobando las condiciones y si es verdadero, mostrando Notification. Como la descarga puede durar más de 5 segundos, he declarado android:process=":background" para este Servicio, para ejecutarlo en un proceso separado y no para bloquear mi UI.

Este enfoque tiene dos inconvenientes:


1: Si el usuario abre la aplicación digamos que a las 4 pm (y la condición es verdadera), que va a recibir la notificación de inmediato . De setRepeating() Documentación:

Si se produce el momento en el pasado, la alarma se disparará de inmediato, con un recuento de alarma dependiendo de lo lejos en el pasado el tiempo de disparo es en relación con el intervalo de repetición.

Me gustaría que ese usuario no reciba una notificación este día, solo al día siguiente y así sucesivamente.


2: Me preocupa que mis notificaciones no se muestren después de que el usuario apague el teléfono. De AlarmManager documentación:

alarmas registrados son retenidos mientras el dispositivo está dormido (y opcionalmente puede despertar el dispositivo hacia arriba si se apagan durante ese tiempo), pero se borrará si se apaga y se reinicia.

No sé si es posible hacerlo funcionar todo el tiempo.


Si tiene alguna idea de cómo hacerlo mejor, de nada.

Respuesta

6

1: No estoy muy segura de haber entendido su pregunta, pero creo que todo lo que tiene que hacer es si ya está pasado 14:00 añadir un día 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: Usted podría Registre un BroadcastReceiver para arrancar y vuelva a encender su alarma allí. Eche un vistazo a esto: Android BroadcastReceiver on startup - keep running when Activity is in Background

+0

esta es una buena sugerencia, también uso este – slinden77

+0

¡Muchas gracias! Tengo una pregunta, ¿está seguro de que: twopm.set (GregorianCalendar.HOUR, 2) está configurando la hora PM, no AM? Tal vez debería usar twoPm.set (GregorianCalendar.HOUR_OF_DAY, 14)? –

+0

sí, tienes razón – AntonS

Cuestiones relacionadas