¿Patrón de diseño para acción alternativa si la aplicación está en primer plano?

StackOverflow https://stackoverflow.com//questions/22001844

  •  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?

¿Fue útil?

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()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...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top