¿Patrón de diseño para acción alternativa si la aplicación está en primer plano?
-
20-12-2019 - |
Pregunta
Estoy creando una acción que utiliza Google Cloud Messaging para recibir notificaciones automáticas.
Esto implica un par de componentes notables, a saber:
- A
WakefulBroadcastReceiver
para recibir el mensaje de GCM. - Un
IntentService
para recibir una notificación cuando se reciba un evento de GCM.
Como estoy seguro de que es el caso de muchas aplicaciones, me gustaría adoptar un enfoque diferente cuando la aplicación tiene una actividad en primer plano o cuando la aplicación tiene una actividad en primer plano.cuando la aplicación lo hace no tener una aplicación en primer plano.
Me gustaría publicar una notificación en el cajón de notificaciones si la aplicación no está activa y simplemente reenviar el evento a la actividad de primer plano si la aplicación está activa.
¿Existe un patrón de diseño para esto?¿Cómo debo determinar si la aplicación está en primer plano o en primer plano?¿el fondo?
Solución
Puede seguir un enfoque como se describe en esta publicación de blog donde creas un BroadcastReceiver
en tus Activity
con una prioridad positiva (es decir, mayor que el valor predeterminado de 0
) que intercepta una acción específica y luego llama abortBroadcast
- esto maneja el caso abierto de la aplicación.Luego también registras un BroadcastReceiver
en su Manifiesto que maneja la misma acción pero con la prioridad predeterminada; esta es la alternativa si la aplicación no está abierta y crea la notificación del sistema.
Luego usas sendOrderedBroadcast()
para enviar su transmisión a todos los receptores registrados en orden de prioridad.Si la actividad está abierta, la primera se encargará de ella.De lo contrario, se utilizará el otro de forma predeterminada y creará una notificación.
Otros consejos
La forma en que sugiero hacerlo es la siguiente.
Tener toda la lógica respecto a GCM en un Servicio (nunca he usado IntentService
, así que no sé sobre sus agallas, pero veo que hereda de Service
).
En tu actividad probablemente tengas una forma de iniciar el servicio (quizás el usuario lo activa mediante un botón), nada nuevo aquí.
Aquí viene la parte divertida.En tu actividad manejas onPause()
y onResume()
.En onResume()
tú unir al servicio.Con el mecanismo de vinculación puede obtener un puntero a su servicio y hacerle saber que está allí "Hola servicio, soy una actividad y estoy aquí...por favor guarde un puntero hacia mí en algún lugar", y el servicio almacena un puntero a la actividad (llamémoslo mActivity
).En tus onPause()
usted notifica al servicio que se va, por lo que el servicio establece mActivity = null
, y luego tu desatar del servicio.
Con este mecanismo, cada vez que el Servicio recibe una notificación push, prueba la mActivity
variable para ver si hay una actividad vinculada.Con un puntero a tu Actividad puedes invocar cualquiera de sus métodos, reenviar información...