mocelet
16/04/16, 14:42:08
Pensaba que era una pregunta tonta, pero no hay consenso en las redes...
Básicamente quiero que aparezca una notificación a cierta hora para recordar al usuario que tiene que entrar a la app y hacer algo, pero si el usuario ya está en la app en vez de notificación quiero avisar por otros medios (vistas propias de la app, vaya).
Opción 1. En SO sugieren tener una variable estática en plan "visible" que en el onResume lo pongas a true y en el onPause lo pongas a false, para que en el onReceive puedas saber si la app está en background y mostrar la notificación o si está en primer plano (y enviarle un Intent a la app para que se abra la actividad correspondiente o lo que sea).
Opción 2. Lo que tenía pensado inicialmente es, al pausar la app, programar la alarma. Y el onReceive simplemente muestra la notificación. Si se reanuda la app, quito la alarma y uso el postDelayed del Handler para mostrar lo que tenga que mostrar. Si salgo de la app otra vez pues otra vez programo la alarma.
Opción mixta. La alarma no la quito nunca, pero sí que pongo un flag para que la notificación no salga si la app está visible. Y en la app siempre tengo el Handler con la tarea programada, al fin y al cabo ya estoy dentro de la app y me parece más limpio y menos propenso a errores que el aviso venga de un handler y no del servicio de alarmas de Android que tiene otras cosas más importantes que hacer.
¿Votaciones?
EDIT: También en SO (http://stackoverflow.com/questions/18038399/how-to-check-if-activity-is-in-foreground-or-in-visible-background) hablan de los ActivityLifecycleCallbacks... pero no he seguido leyendo porque necesito algo que funcione en Android 2.2 xD
EDIT 2: El AlarmManager cada vez es más surrealista, no había visto el setExactAndAllowWhileIdle, se ve que el setExact de KitKat ya no es tan exacto gracias a Doze. Y resulta que ese método no te asegura que la alarma avise si hay dos ejecuciones programadas con menos de un minuto de antelación (en la documentación pone 15 minutos pero salió un desarrollador diciendo que estaba mal el javadoc, menos mal...)
Básicamente quiero que aparezca una notificación a cierta hora para recordar al usuario que tiene que entrar a la app y hacer algo, pero si el usuario ya está en la app en vez de notificación quiero avisar por otros medios (vistas propias de la app, vaya).
Opción 1. En SO sugieren tener una variable estática en plan "visible" que en el onResume lo pongas a true y en el onPause lo pongas a false, para que en el onReceive puedas saber si la app está en background y mostrar la notificación o si está en primer plano (y enviarle un Intent a la app para que se abra la actividad correspondiente o lo que sea).
Opción 2. Lo que tenía pensado inicialmente es, al pausar la app, programar la alarma. Y el onReceive simplemente muestra la notificación. Si se reanuda la app, quito la alarma y uso el postDelayed del Handler para mostrar lo que tenga que mostrar. Si salgo de la app otra vez pues otra vez programo la alarma.
Opción mixta. La alarma no la quito nunca, pero sí que pongo un flag para que la notificación no salga si la app está visible. Y en la app siempre tengo el Handler con la tarea programada, al fin y al cabo ya estoy dentro de la app y me parece más limpio y menos propenso a errores que el aviso venga de un handler y no del servicio de alarmas de Android que tiene otras cosas más importantes que hacer.
¿Votaciones?
EDIT: También en SO (http://stackoverflow.com/questions/18038399/how-to-check-if-activity-is-in-foreground-or-in-visible-background) hablan de los ActivityLifecycleCallbacks... pero no he seguido leyendo porque necesito algo que funcione en Android 2.2 xD
EDIT 2: El AlarmManager cada vez es más surrealista, no había visto el setExactAndAllowWhileIdle, se ve que el setExact de KitKat ya no es tan exacto gracias a Doze. Y resulta que ese método no te asegura que la alarma avise si hay dos ejecuciones programadas con menos de un minuto de antelación (en la documentación pone 15 minutos pero salió un desarrollador diciendo que estaba mal el javadoc, menos mal...)