Desarrollo de Android: ¿debo usar GCM o abrir constantemente SocketIO para mi aplicación?

Esperemos que esta pregunta no sea demasiado amplia ni demasiado pedir …

Estoy creando una aplicación de Android para mi oficina. La aplicación se utiliza para enviar alertas de mensajes (como una clase de objeto “mensaje” personalizada) a todos los usuarios con la aplicación (solo en mi oficina). Una vez que se recibe el mensaje, todos los nombres de los destinatarios se enumeran en la parte inferior con un icono de estado que muestra su respuesta al mensaje (pulgares arriba o abajo básicamente).

Tengo un servidor Node / Express que se utiliza para rastrear, almacenar y distribuir los mensajes y registrar su historial. Cuando un usuario envía un mensaje de alerta, irá al servidor de Nodos que se encargará de la distribución.

Requerimientos de la aplicación

  1. Es para el personal de emergencia. La aplicación SIEMPRE debe poder recibir una alerta. Si no tienen servicio, está bien, se enviará un SMS como respaldo. Pero todos los teléfonos Android SIEMPRE deben estar escuchando mi servidor Node para actualizaciones.
  2. La aplicación DEBE iniciarse en el arranque, o al menos un servicio o algo para escuchar al servidor. Esto se basa en el último requisito de que siempre debe estar escuchando al servidor.
  3. Una vez que se recibe el mensaje, el usuario lo verá en una actividad específica. Esta actividad enumera todos los destinatarios y su estado (pulgares arriba o abajo). Esta pantalla deberá estar conectada al websocket en todo momento y actualizar el estado en tiempo real a medida que los demás usuarios envíen su estado.

Aqui esta mi pregunta

Hay algunas formas que he visto recomendadas, pero no sé cuál usar.

  1. Cree un servicio en segundo plano (servicio o servicio intente … ¿no tiene idea?) Que se iniciará en el arranque y se conectará al servidor Node. Esto plantea algunas preguntas: a. ¿Está bien tener una conexión de socket TCP como esta en el teléfono 24/7? si. Solo intercambiará datos algunas veces al día. ¿La conexión abierta matará la batería? do. ¿Puedo usar este servicio ‘siempre en ejecución’ para iniciar la actividad de mi aplicación en caso de que el servicio reciba un mensaje del servidor? Además, ¿puedo enviar fácilmente el mensaje del servicio en segundo plano a la aplicación? (No sé enhebrar muy bien … esa es la parte difícil para mí aquí).
  2. Use GCM para “activar” el teléfono para iniciar la aplicación, y una vez que la aplicación se inicie, use el hilo principal de la interfaz de usuario para crear la conexión con el servidor y desplegar el mensaje que se envió. a. Nunca he usado GCM y solo me enteré ayer. ¿Es este el tipo de cosa para la que se usa? si. Si uso GCM, ¿ todavía necesito crear un servicio en segundo plano ‘siempre en ejecución’ que se inicie en el arranque de todos modos? ¿O GCM tiene algo integrado para escuchar siempre?

No entiendo completamente cómo usar hilos, mi conocimiento de Java está por debajo del promedio (aunque no diría principiante), y esta es mi primera aplicación de Android. La aplicación se ve hermosa y realmente viene genial, pero no sé cómo debo manejar esta red siempre conectada .

Según sus requisitos y dado que ya tiene un backend, le sugiero que use GCM por los siguientes motivos:

  1. Será más fácil administrar el tipo de mensaje que envía a los dispositivos porque GCM tiene un sistema de prioridad de mensajes que es perfecto para su caso de uso de emergencia
  2. GCM maneja eficientemente la conexión al servidor para minimizar el uso de la batería.
  3. No tendrá que implementar su propio servicio para iniciar su aplicación porque GCM ‘reactivará’ su aplicación si es necesario (por ejemplo: cuando se ha enviado un mensaje ‘urgente’ y debe procesarse de inmediato) o demora la activación arriba. GCM toma esas decisiones en función del estado del dispositivo y la prioridad del mensaje que mencioné anteriormente

Si mis 3 razones te convencieron de usar GCM, ¡es genial! Sin embargo, tendrás que tener en cuenta algunas cosas

  • GCM no envía mensajes directamente a su servidor. GCM usó algo llamado un servidor de conexión GCM eso es proporcionado por Google. Su servidor NodeJS enviará mensajes a través del servidor de conexión GCM que luego los enviará a los dispositivos apropiados (Más información aquí)
  • GCM no sabe qué tipo de datos está enviando. Eso significa que el dispositivo receptor (el dispositivo Android) analizará la respuesta de GCM y tomará las medidas apropiadas (como mostrar una notificación o ejecutar un trabajo en segundo plano)

Si esas dos advertencias no son un problema para usted, entonces no debería tener problemas con GCM

Puede encontrar más información sobre la implementación del Cliente / Servidor en el sitio web de Google Developers

Una cosa más: si aún no ha implementado completamente la lógica de su servicio en tiempo real, le sugiero que revise Firebase Proporciona un back-end y maneja la comunicación de actualización de datos en tiempo real a través de múltiples plataformas. Le facilitará las cosas: su nodeJS solo tendrá que mirar su base de datos de Firebase y enviar mensajes al servidor de conexión GCM que luego notificará a sus dispositivos.

Acerca de su situación de subprocesamiento, también le sugiero que verifique RxJava. Es una biblioteca para escribir programas basados ​​en eventos. También tienen una extensión para Android.

¡Buena suerte con tu implementación!