Android destruyendo actividades, matando procesos

Hola, me pregunto cómo Android administra la memoria y no puedo encontrar una respuesta precisa en ningún lado. Supongamos que tengo una aplicación con 5 actividades en la stack de actividad actual (4 se detienen y 1 se reanuda), no hay servicio conectado. Presiono el botón INICIO para que todas mis actividades se detengan. Comienzo otra aplicación que consume memoria y la memoria general del dispositivo está empezando a ser baja. Y la pregunta es

… ¿Qué pasará con mi aplicación?

  1. ¿Puede el sistema destruir solo una o algunas de mis actividades para recuperar la memoria?
  2. ¿El sistema matará todo el proceso de mi aplicación? ¿Todas las actividades serán destruidas?
  3. ¿Qué pasará cuando regrese a mi aplicación cuando fue totalmente destruida? ¿Empezará desde el inicio (como el primer inicio) o intentará recuperar actividades al estado anterior / si es así – es solo el que está en la parte superior de la stack o todos?

ACTUALIZAR:

Antes de hacer esta pregunta, he visto el ciclo de vida de la actividad algunas veces, pero no tiene respuestas a mis preguntas. Hice algunas pruebas y tengo algunas respuestas. “Detener proceso” en DDMS fue una pista para probar.

No he probado la respuesta a la pregunta 1, pero como dice la guía:

Si una actividad se detiene o se detiene, el sistema puede eliminar la actividad de la memoria pidiéndole que termine o simplemente eliminando el 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.

Pregunta 2 respuesta:

SÍ. En general, el sistema elimina todo el proceso, lo que significa que todos los datos, incluidas las actividades y los campos estáticos, se destruyen. Esto NO se realiza correctamente: no se aplicará Destroy o finialize () para ninguna de sus actividades pausadas / detenidas. Esta es la razón por la cual se llama a saveInstanceState () justo antes del método onPause. onPause es básicamente el último método donde debes guardar algo porque después de este método nunca podrías ver onStop o onDestroy. El sistema puede matar el proceso destruyendo todos sus objetos, lo que sea que tengan y lo que estén haciendo.

Pregunta 3 respuesta:

¿Qué pasará cuando regrese a una aplicación muerta?

  • Antes de Android 2.2, la aplicación comenzará desde el principio, con la actividad del iniciador.
  • Comenzando desde 2.2, el sistema restaurará el estado de la aplicación anterior. Qué significa eso? Significa que la última actividad visible será recreada (onCreate + bundle). ¿Qué pasará con la stack de actividades? La stack está bien, pero todas las actividades en ella están muertas. Cada uno de ellos será recreado (onCreate + bundle) cuando vuelvas 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 stack por encima de la actividad raíz) en ciertas 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?

  1. No piense que el manejo de los problemas de rotación de la actividad se puede resolver con android: configChanges = “orientation”. Cuando lo haga, obtendrá muchos otros problemas que ni siquiera conoce.
  2. Pruebe su aplicación con DDMS – Botón de detener proceso. Mira esto
  3. Tenga cuidado al usar variables estáticas. No piense que cuando los inicializó en la actividad 1, los inicializará en la actividad 2. El único lugar seguro para inicializar la estática global sería la clase de aplicación.
  4. Recuerde que es posible que nunca vea onStop o onDestroy. Cierre los archivos / bases de datos, pare los descargadores en onPause. Cuando desee que la aplicación haga algo en BG: use el servicio en primer plano.

Eso sería … Espero haber ayudado con mi essey 🙂

Primero, mira esto:

img1

onPause () Se invoca cuando el sistema está por comenzar a reanudar una actividad previa. Esto se usa generalmente para confirmar cambios no guardados en datos persistentes, detener animaciones y otras cosas que pueden consumir CPU, etc. Las implementaciones de este método deben ser muy rápidas porque la siguiente actividad no se reanudará hasta que regrese este método. Seguido por onResume () si la actividad regresa al frente, o onStop () si se vuelve invisible para el usuario.

onStop () Se invoca cuando la actividad ya no es visible para el usuario, porque se ha reanudado otra actividad y está cubriendo esta. Esto puede suceder ya sea porque se está iniciando una nueva actividad, se está trayendo una existente frente a esta, o esta se está destruyendo. Seguido por onRestart () si esta actividad vuelve a interactuar con el usuario, o onDestroy () si esta actividad se va.

Por lo tanto, cuando presiona el botón “INICIO” en su dispositivo, su actividad de primer plano actual se pone en onPause() luego En onStop() , los otros 4 deben permanecer en onStop()

De acuerdo con los documentos de Google:

  • Si hay una actividad en el primer plano de la pantalla (en la parte superior de la stack), está activa o en ejecución.
  • Si una actividad ha perdido el enfoque pero aún está visible (es decir, una nueva actividad no completa o transparente se ha centrado en la parte superior de su actividad), se pausa. Una actividad detenida está completamente viva (mantiene toda la información de estado y miembros y permanece unida al administrador de ventanas), pero puede ser eliminada por el sistema en situaciones de poca memoria.
  • Si una actividad está completamente oscurecida por otra actividad, se detiene. Todavía conserva toda la información de estado y miembros, sin embargo, ya no es visible para el usuario, por lo que su ventana está oculta y el sistema la eliminará a menudo cuando se necesite memoria en otro lugar.
  • Si una actividad se detiene o se detiene, el sistema puede eliminar la actividad de la memoria pidiéndole que termine o simplemente eliminando el proceso. Cuando se vuelve a mostrar al usuario, debe reiniciarse completamente y restaurarse a su estado anterior.

Y, para el ciclo de vida del proceso:

Ciclo de vida del proceso 3. Una actividad de fondo (una actividad que no es visible para el usuario y ha sido detenida) ya no es crítica, por lo que el sistema puede matar de forma segura su proceso para reclamar memoria para otros procesos en primer plano o visibles. Si su proceso necesita ser eliminado, cuando el usuario navega de regreso a la actividad (haciéndolo visible en la pantalla de nuevo), su método onCreate (Bundle) será llamado con el estado de instancia salvado que había proporcionado previamente en el estado de excepción de almacenamiento (Bundle) para que puede reiniciarse en el mismo estado que el usuario lo dejó por última vez.

Todas las citas anteriores provienen de: Android Developers Reference: Activity

Se confirma que el sistema puede destruir actividades que no son activas y reciclar recuerdos cuando se lanzan 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 viejo. Sin embargo, no tiene sentido mantener otras actividades cuando se haya reciclado la “Actividad de lanzamiento”.

ACTUALIZAR

Aquí hay algunas opiniones que encontré aquí :

Estado detenido

Cuando una actividad no es visible, pero aún está en la memoria, decimos que está detenida. La actividad detenida podría regresar al frente para volver a ser una actividad en ejecución. O bien, podría ser destruido y eliminado de la memoria.

El sistema mantiene las actividades en un estado detenido porque es probable que el usuario quiera volver a esas actividades pronto, y reiniciar una actividad detenida es mucho más barato que comenzar una actividad desde cero. Eso es porque ya tenemos todos los objetos cargados en la memoria y simplemente tenemos que llevarlo todo al primer plano.

Las actividades detenidas se pueden eliminar de la memoria en cualquier punto.

¿Puede el sistema destruir solo una o algunas de mis actividades para recuperar la memoria?

Sí. Android mata las actividades que se ejecutan en segundo plano cuando hay una necesidad de memoria. Asesinar a uno o todos puede depender de algunas condiciones. Para una instancia detenida o detenida, puede hacer que Android mate una actividad o un proceso en sí. Aquí, en Ciclo de vida de la actividad , puede obtener los puntos a continuación. Te recomiendo que revises esa página por completo. Definitivamente aclarará tus dudas.

Si una actividad ha perdido el enfoque pero aún está visible (es decir, una nueva actividad no completa o transparente se ha centrado en la parte superior de su actividad), se pausa. Una actividad detenida está completamente viva (mantiene toda la información de estado y miembros y permanece unida al administrador de ventanas), pero puede ser eliminada por el sistema en situaciones de poca memoria.

Si una actividad está completamente oscurecida por otra actividad, se detiene. Todavía conserva toda la información de estado y miembros, sin embargo, ya no es visible para el usuario, por lo que su ventana está oculta y el sistema la eliminará a menudo cuando se necesite memoria en otro lugar.

Si una actividad se detiene o se detiene, el sistema puede eliminar la actividad de la memoria pidiéndole que termine o simplemente eliminando el proceso. Cuando se vuelve a mostrar al usuario, debe reiniciarse completamente y restaurarse a su estado anterior.


¿El sistema matará todo el proceso de mi aplicación? ¿Todas las actividades serán destruidas?

La actividad pertenece a un individuo mientras que el proceso pertenece al grupo de actividades. Mira el tercer punto anterior otra vez mata el proceso como se mencionó.


¿Qué pasará cuando regrese a mi aplicación cuando fue totalmente destruida?

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 restred to its previous state

Obtenga más información acerca de productos relacionados con la memoria aquí .

Editar:
Todas las actividades en una aplicación se ejecutan en un solo proceso. Entonces, cuando se mata un proceso, todas las actividades, sin importar 5 o 10, se eliminarán, es decir, se reiniciarán. Reiniciar hará que su aplicación comience desde un principio sin estados guardados.