Foro de elhacker.net

Programación => Java => Mensaje iniciado por: @XSStringManolo en 7 Noviembre 2019, 19:11 pm



Título: [Android]Evitar que el sistema cierre la aplicación cuando pasa a segundo plano.
Publicado por: @XSStringManolo en 7 Noviembre 2019, 19:11 pm
Resumen análisis del problema: Estoy haciendo una App, en concreto un navegador para Android y tengo un problema. Cuando el usuario se va a otro programa/app o minimiza la mía... Mi programa se va al background/segundo plano poniendo la actividad en pausa y finalmente en onstop de forma batante arbitraria según la decición tomada por el Android Garbage Collector del sistema que cierra aplicaciones en background para liberar memoria, ahorrar batería...
Cuando el usuario trae la app al frente/foreground desgraciadamente se "reinicia" mi app, o si manejo programaticamente los estados de mi actividad en el mejor de los casos recargo la pagina.

Estoy mirando soluciones y encontré
https://developer.android.com/training/scheduling/wakelock.html pero no encaja en absoluto con el fincionamiento de mi aplicación. Entonces no sé como afrontar este problema correctamente.

Problemática en el funcionamiento actual: El usuario utiliza mi aplicación para navegar por internet. Se loggea en alguna página y por ejemplo escribe un documento online. Mientras escribe este documento online, decide ir a la calculadora de su móvil para realizar un par de operaciones y añadirlas al documento, por lo que mi aplicación se minimiza. Tras hacer las operaciones vuelve a mi aplicación, la página se recarga o la aplicación se reinicia y pierde todo el documento que estaba escribiendo. Esto debido a que el Garbage Colector de Android decide finalizar mi aplicación porque cree que es conveniente para el usuario.

También si el usuario decide acceder a la cámara o cualquier otra funcionalidad del dispositivo para subir contenido online mediante mi aplicación, como sacarse una foto con la cámara del sistema para ponerla como foto de perfil de una red social, es posible y frecuente que el Garbage Colector finalice mi aplicación o la recarge, haciendo imposible para el usuario subir la imagen.

Funcionamiento deseado: La aplicación debería permanecer activa en el background, quizás en pausa, y a la vez no debería de recargarse la página al volver a traerla al frente tras acceder a otra aplicación del sistema. Si simplemente manejo el estado de la actividad seteándolo en onpause, el Garbage Colector sigue pudiendo finalizar la aplicación cuando quiera.

Qué puedo hacer al respecto?


Título: Re: [Android]Evitar que el sistema cierre la aplicación cuando pasa a segundo plano.
Publicado por: Serapis en 8 Noviembre 2019, 03:40 am
Lo primero es que la respuesta de Android me parece acertada, aunque quizás exagerada a veces.. quiero decir que el usuario puede elegir que aplicaciones tratar de modo privilegiadas para que se mantengan en segundo plano sin cerrarse. Aunque esto, eviendentemente no soluciona tu caso, ya que lo deja en manos del usuario... si la considera lo suficientemente importante la marcaría y si no, no.

Otra opción más interesante aún por parte de Android, sería tener alguna casilla que al marcarla permitiera mantenerla en segundo plano, debería ser preferiblemente una acción hardware, porque si no cualquiera se la saltaría a la torera... así que no va hacer el caso. La diferencia del caso previo, es en el previo, el usuario elegiría las aplicaciones desde 'Ajustes', por lo que sería ianlterable hasta que el usuario de nuevo las cambiara... este otro modelo, sería al instante (sin necesidad de ir a ajustes) y solo tendría efecto hasta que el usuario cerrase él mismo la aplicación.

Si no recuerdo mal, una aplicación declarada como servicio, se mantiene en segundo plano, salvo que el propio usuario la cierre. Declarar una aplicación como servicio, tiene sus requisitos... si no los cumples es mejor que tampoco lo fuerces.

Una solución mejor sería prever por tu parte la posibilidad de que Android la cierre, así que lo adecuado sería guardar correctamente TODO el estado actual, salvo que el estado, sea un estado crítico de seguridad, que en tal caso, no conviene guardar, si no tener un punto anterior guardado para acometer ese proceso de una sola pasada o rechazarlo...

Una opción intermedia, aunque indeseable, sería guardar cada cierto tiempo el  estado del programa, ante un cierre inesperado siempre se podrá rescatar desde la última vez que guardaste y continuar desde allí. Pero sería el caso más desafortunado.