Notificaciones diarias a ciertas horas

Me gustaría lograr esto:

Después de encender la aplicación, el usuario recibe las notificaciones, todos los días a las 2 pm, si determinada condición es verdadera. Si la condición es falsa, no estamos mostrando una notificación este día. La condición se comprueba a las 2 pm, descarga algunos datos de Internet.

Hasta ahora he utilizado AlarmManager y su método setRepeating () con intervalo de 24h. AlarmManager activa un servicio . En este servicio estoy descargando los datos, verificando la condición y si es verdad – mostrando la notificación . Dado que 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 bloquear mi interfaz de usuario.

Este enfoque tiene dos inconvenientes:


1: Si el usuario abre la aplicación digamos que a las 4 pm (y la condición es cierta), recibirá la notificación inmediatamente . De la documentación setRepeating ():

Si el tiempo se produce en el pasado, la alarma se disparará inmediatamente, con un recuento de alarmas dependiendo de hasta qué punto en el pasado el tiempo de activación es relativo al intervalo de repetición.

Quisiera que el usuario no reciba una notificación este día, solamente el 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 la documentación de AlarmManager :

Las alarmas registradas se mantienen mientras el dispositivo está dormido (y puede activar el dispositivo opcionalmente si se apagan durante ese tiempo), pero se borrará si se apaga y se reinicia.

No sé si es posible hacer que funcione todo el tiempo.


Si tienes alguna idea de cómo hacerlo mejor, eres bienvenido.

1: No estoy muy seguro si he entendido su pregunta, pero creo que todo lo que tienes que hacer es si ya es pasado 2 pm agregar un día a las 2 pm:

 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 registrar un BroadcastReceiver para el booting y comenzar su alarma otra vez allí. Echa un vistazo a esto: Android BroadcastReceiver en el inicio – seguir funcionando cuando la actividad está en segundo plano

  • No recibe devoluciones de llamada CountDownTimer en Service
  • Servicio de Android para sockets TCP
  • El oyente de ubicación funciona desde un servicio pero no es un servicio de IntentService
  • Diálogo de alerta del servicio de Android
  • Paho MQTT Actividad de activación del servicio de Android
  • Excepción de puntero nulo iniciando IntentService
  • Android Service Exchange siempre se bloquea
  • Puntero nulo en getApplicationContext ()
  • OnResult () en Awareness.SnapshotApi.getLocation NO se llama desde un servicio
  • Compartir una biblioteca nativa en dos aplicaciones
  • ¿Necesita un ejemplo de código sobre cómo ejecutar un servicio Android para siempre en segundo plano incluso cuando el dispositivo está durmiendo, como Whatsapp?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.