Hola, me pregunto cómo administra Android la memoria y no puedo encontrar una respuesta precisa en ninguna parte. Supongamos que tengo una aplicación con 5 actividades en la pila de actividades actual (4 se detienen y 1 se reanuda), no hay ningún servicio conectado. Presiono el botón INICIO para detener todas mis actividades. Comienzo alguna otra aplicación que consume memoria y la memoria general del dispositivo comienza a ser baja. Y la pregunta es
... ¿Qué pasará con mi aplicación?
- ¿El sistema puede destruir solo una o algunas de mis actividades para recuperar la memoria?
- ¿El sistema eliminará todo el proceso de mi aplicación? ¿Todas las actividades serán bien destruidas?
- ¿Qué pasará cuando vuelva a mi aplicación cuando se eliminó por completo? ¿Comenzará desde el principio (como el primer inicio) o intentará recuperar las actividades al estado anterior? Si es así, ¿es solo el que está en la parte superior de la pila o todos?
ACTUALIZAR:
Antes de hacer esta pregunta, he visto el ciclo de vida de la actividad varias veces, pero no tiene respuestas a mis preguntas. Hice algunas pruebas y tengo algunas respuestas. "Detener proceso" en DDMS fue una pista para la prueba.
No he probado la respuesta para la pregunta 1, pero como dice la guía:
Si una actividad se pone en pausa o se detiene, el sistema puede eliminar la actividad de la memoria pidiéndole que finalice o simplemente matando su proceso.
Parece que una o más de las actividades se pueden destruir suavemente (con el método onDestroy) sin matar el proceso. Simplemente obtendrá (onCreate + bundle) cuando vuelva a ellos.
Respuesta a la pregunta 2:
SI. Generalmente, el sistema mata todo el proceso, esto significa que todos los datos, incluidas las actividades y los campos estáticos, se destruyen. Esto NO se hace bien: no obtendrá onDestroy o finialize () para ninguna de sus actividades pausadas / detenidas. Es por eso que saveInstanceState () se llama justo antes del método onPause. onPause es básicamente el último método en el que debe guardar algo porque después de este método nunca podría ver onStop o onDestroy. El sistema puede simplemente matar el proceso destruyendo todos sus objetos, lo que sea que contengan y lo que sea que estén haciendo.
Respuesta a la pregunta 3:
¿Qué pasará cuando vuelva a una aplicación muerta?
- Antes de Android 2.2, la aplicación se iniciará desde el principio, con actividad de inicio.
- A partir de 2.2, el sistema restaurará el estado anterior de la aplicación. Qué significa eso? Significa que se volverá a crear la última actividad visible (onCreate + bundle). ¿Qué pasará con la pila de actividades? La pila está bien, pero todas las actividades están muertas. Cada uno de ellos se volverá a crear (onCreate + bundle) cuando regrese a él con el botón Atrás. Hay una cosa más sobre eso:
Normalmente, el sistema borra una tarea (elimina todas las actividades de la pila por encima de la actividad raíz) en determinadas situaciones cuando el usuario vuelve a seleccionar esa tarea desde la pantalla de inicio. Normalmente, esto se hace si el usuario no ha visitado la tarea durante un período de tiempo determinado, como 30 minutos.
¿Conclusión?
- No crea que el manejo de problemas de rotación de actividades puede resolverse con android: configChanges = "Orientación". Cuando hagas eso, tendrás muchos otros problemas de los que ni siquiera eres consciente.
- Pruebe su aplicación con DDMS - Botón Detener proceso. Mira esto
- Tenga cuidado al utilizar variables estáticas. No piense que cuando los inicializó en la actividad 1, los tendrá inicializados en la actividad 2. El único lugar seguro para inicializar la estática global sería la clase Aplicación.
- Recuerde que es posible que nunca vea onStop o onDestroy. Cierre archivos / bases de datos, detenga los descargadores en onPause. Cuando desee que la aplicación haga algo en BG, use el servicio de primer plano.
Eso sería todo ... Espero haber ayudado con mi essey :)
fuente
Respuestas:
Primero, eche un vistazo a esto:
Entonces, cuando presiona el botón "INICIO" en su dispositivo, su actividad actual en primer plano se coloca en
onPause()
ese momentoonStop()
, los otros 4 deben permaneceronStop()
Según los documentos de Google:
Y, para el ciclo de vida del proceso:
Todas las citas anteriores provienen de: Referencia de desarrolladores de Android: Actividad
Se confirma que el sistema puede destruir actividades no activas y reciclar memorias cuando inicias algunas aplicaciones que consumen memoria. Y puede implementar like:
isFinishing()
en su actividad y luego usar el botón "kill" en DDMS para detectar cuál de sus actividades está siendo descartada por el sistema. Pero supongo que el sistema destruirá primero al más antiguo. Sin embargo, no tiene sentido mantener otras actividades cuando se ha reciclado la "Actividad de lanzamiento".ACTUALIZAR
Aquí hay algunas opiniones que encontré aquí :
fuente
Si. Android elimina las actividades que se ejecutan en segundo plano cuando se necesita memoria. Matar a uno oa todos podría depender de algunas condiciones. Por ejemplo, una instancia pausada o detenida puede hacer que Android elimine una actividad o un proceso en sí. Aquí, en Ciclo de vida de la actividad , puede obtener los siguientes puntos. Te recomiendo que revises esa página por completo. Definitivamente despejará tus dudas.
La actividad pertenece a un individuo, mientras que el proceso pertenece a un grupo de actividades. Mire el tercer punto anterior nuevamente, mata el proceso como se mencionó.
Es similar a reiniciar. Nuevamente, el tercer punto le dará algunas respuestas como
When it is displayed again to the user, it must be completely restarted and restored to its previous state
Obtenga más información sobre cosas relacionadas con la memoria aquí .
Editar:
todas las actividades de una aplicación se ejecutan en un solo proceso. Entonces, cuando se mata un proceso, todas las actividades, no importa 5 o 10, se eliminarán, es decir, se reiniciarán. El reinicio hará que su aplicación se inicie desde un principio sin estados guardados.
fuente