Si encuentras algo que no comprendes puedes comentarlo y te ayudaremos lo más rápido posible.
Solución:
Me enfrenté exactamente al mismo problema trabajando en una aplicación de chat, así que conozco tu dolor. Nuestra conclusión fue:
no mantiene una conexión activa las 24 horas del día, los 7 días de la semana, si necesita enviar un mensaje a un usuario que no tiene una conexión activa, envíe un mensaje de inserción a través de Firebase.
Si desea mantener viva una conexión en segundo plano, se enfrentará a muchos problemas. La primera, dirigida a Oreo, es que si su aplicación está en segundo plano (la definición de “fondo” en este contexto está aquí), no se le permitirá ejecutarse, excepto en pequeñas ventanas de tiempo.
Definitivamente puedes usar JobScheduler
para ejecutar tareas periódicas, no se ejecutarán en intervalos u horarios exactos para reducir el uso de la batería (lo cual es bueno), pero no lo ayudará a mantener viva la conexión. En el mejor de los casos, puede utilizar JobScheduler
para extraer periódicamente mensajes de su servidor. Para usar JobScheduler
necesitas crear un JobService
clase.
JobIntentService
es una nueva clase introducida en la API 26 de la biblioteca de soporte. es un reemplazo para IntentService
se ejecutará como un JobService
en Android API 26+ y como Service
(Similar a IntentService
en el sentido de que ejecutará código en un subproceso en segundo plano) en API más antiguas. En Oreo, su ejecución en segundo plano seguirá siendo limitada, por lo que no te ayudará a mantener viva la conexión.
Usando un primer plano Service
realmente puede ayudarlo a reducir la probabilidad de que el proceso se elimine, pero deberá mostrar una notificación permanente. No parece una buena solución para una aplicación de chat.
Si todavía cree que tener una conexión activa las 24 horas del día, los 7 días de la semana es una opción viable, también debe considerar el modo de reposo. Puede pedirle al usuario que incluya su aplicación en la lista blanca para que se ejecute incluso en modo inactivo, pero debe tener una muy buena razón para hacerlo. De nuevo, te enfrentarías al otro límite de ejecución de bg en Oreo.
Otro problema al que te enfrentarás es otras aplicaciones. Hay aplicaciones de administración de recursos que eliminarán agresivamente otras aplicaciones en bg para reducir el uso de memoria y batería. Por ejemplo, maldije bastante a este.
Otro problema es creado por androide. Cuando el sistema se está quedando sin memoria, comenzará a eliminar procesos de aplicaciones en bg. Hay un orden en el que se eliminan, si no recuerdo mal, debería tener en cuenta la última vez que estuvo en fg y el uso actual de la memoria. No es el peor de los problemas, pero aún así, sucede.
Entonces, si todavía no te he convencido de abandonar la idea de la conexión permanente, déjame compartir contigo otro problema que enfrentarías. Algunos proveedores implementan extremadamente agresivo políticas cuando se trata de matar procesos bg, para que la batería dure más. Por ejemplo, Xiaomi.
Último consejo, no relacionado, pero nos tomó un tiempo resolverlo, así que lo compartiré. Si el usuario fuerza la configuración de su aplicación, su aplicación es muerto (es decir, “estado detenido”) hasta que el usuario lo vuelva a iniciar activamente, ni siquiera recibirá mensajes push de Firebase.
Si su servidor está configurado en XMPP, entonces sería fácil para usted. En realidad, no hay necesidad de mantener vivo el socket todo el tiempo. Esto es muy caro para la batería y estoy seguro de que no quieres eso.
Caso: está trabajando en una aplicación de mensajería.
Si su socket está roto, el cliente recibirá el mensaje en forma de notificación de Google FIREBASE. Y en el momento en que su cliente reciba una notificación de Firebase, simplemente habilite el socket y volverá a la normalidad. La razón por la que te sugerí que usaras XMPP
es porque XMPP mantiene una cola de mensajes no entregados/fuera de línea. Y cuando su socket esté conectado nuevamente, simplemente extraiga los mensajes fuera de línea del servidor.
No creo que esto te ayude, pero esto puede dejar espacio para otra idea para ti.
Reseñas y puntuaciones del post
Recuerda algo, que tienes la capacidad de añadir un criterio certero si te ayudó.