Gestión de la memoria android en el ciclo de vida de la actividad

Mi pregunta es un poco complicada.

Quiero entender cómo la aplicación trata los recursos (especialmente las imágenes de fondos, botones, etc.) cuando se inicia la actividad y se suspende.

Por ejemplo, empiezo la Actividad A, muestra todas las imágenes en la pantalla, se come su memoria, luego se inicia otra Actividad B y se suspende A. ¿Qué pasa con todas las imágenes, recursos, etc.? ¿Cuándo son liberados? ¿Cómo puedo tomar control sobre ellos? ¿No debería mantener la actividad A en la memoria y eliminarla de la pila de actividades?

¡Si usted necesita alguna aclaración para mis preguntas, los pls me escriben!

¡Gracias por adelantado! Danail

La actividad no libera recursos hasta que termine. Pero en la mayoría de los casos no debe ser un problema para usted. En mi opinión, no debe agregar su propia gestión de recursos y hacer que su código complicado en la mayoría de los casos.

Pero si realmente piensa que su aplicación puede estar fuera de la memoria, debe comprobarlo con algo como MAT . Los problemas con la memoria pueden ser causados ​​por pérdidas de memoria, no por el uso de memoria pesada.

Eventualmente, cuando esté absolutamente seguro de que tiene que hacer algo para reducir el uso de memoria, puede hacer alguna optimización de la memoria. Por ejemplo, puede guardar objetos que consumen mucha memoria (por ejemplo, imágenes grandes) en un almacenamiento local en onStop() y cargarlos en onStart() . Creo que usar onPause() / onResume() para este propósito es una mala idea, porque la actividad es parcial o incluso totalmente visible.

En teoría, incluso puedes destruir todos tus widgets en onStop() y restaurarlos en onStart() , pero puede hacer que tu aplicación sea demasiado lenta. Y, por supuesto, en este caso el estado de ahorro debe ser implementado por usted.

Las actividades de acabado pueden parecer una buena idea, pero creo que no. En primer lugar hace que su trabajo más lento. En segundo lugar debe gestionar la pila de actividades y el estado de las actividades usted mismo. Por ejemplo, la actividad A inicia la actividad B. Por lo tanto, la actividad B debe saber qué hacer cuando el usuario presiona el botón Atrás. Cuando el usuario presiona el botón de regreso debe iniciar la actividad A y restaurar su estado. Pero ¿qué pasa si el usuario termina esta aplicación. En este caso, debe inicializar la Actividad A con su estado predeterminado. Por lo tanto, tiene que implementar una gran cantidad de lógica adicional.

En conclusión voy a repetir la idea principal una vez más: no optimizar el uso de la memoria si no está absolutamente seguro de que tiene que!

Muy bien, tenemos la siguiente situación:

 A > onCreate A > onStart A > onResume A > Use up a load of memory (A could even use up too much and crash) A > Launch activity B B > onCreate A > onPause B > onStart A > onStop B > onResume B > Use up a load of memory 

Si B usa suficiente memoria, entonces el sistema Android matará la actividad A (notará que los métodos onPause y onStop de A ya han sido llamados por lo que ya se le ha dado la oportunidad de guardar su estado)

Si pulsa el botón de retroceso, el sistema Android comenzará la actividad A de nuevo (y si es inteligente, debe recordar que es el último estado), por lo que parece que nunca le pasó nada al usuario.

Por lo tanto, para ser un poco más claro: si inicia B y luego termina A, B básicamente reemplazará A en la pila de actividades y presionando el botón Atrás en la actividad B sólo saldrá de su aplicación y no volverá a la actividad A.

Si, por el contrario, inicia B sin terminar A, a continuación, presionando el botón Atrás en B le llevará de nuevo a A. Mientras la actividad A está en segundo plano, podría matarse para recuperar la memoria, pero Android lo recreará cuando sea necesario cuando El usuario navega a través de la pila de actividades.

Además, si tiene cachés de memoria de varios objetos (por ejemplo, mapas de bits / dibujables), vuelva a su colección por SoftReferences para que el GC pueda borrarlos si se está agotando la memoria.

Usted debe diseñar su aplicación para que su uso de memoria es baja, pero puede contar con el marco lo mejor en la gestión de la memoria. Por lo tanto, no trabajar demasiado duro con la eliminación de las cosas no utilizadas, sólo en los casos en que es obvio que su aplicación está comiendo demasiada memoria.

Cuando la memoria disponible disminuye, la infraestructura detendrá y eliminará las actividades y servicios que no están asociados con la tarea actual. Si su aplicación consume más memoria, el framework detendrá sus actividades que están en segundo plano. Luego vienen los servicios asociados con su aplicación y el último en terminar será la actividad actual.

Cuando el framework detiene una actividad, mantiene un registro de la pila de actividades, las intenciones utilizadas para iniciar la actividad y el paquete devuelto por onSaveInstanceState (), para que pueda recrear el último estado conocido de las actividades. Además, el framework puede descargar recursos no utilizados (drawables, etc.) cuando no está en uso y recargarlos cuando sea necesario.

Bien antes de responder a sus preguntas, tengo ciertos hechos para discutir.

  1. Según el ciclo de vida de la Actividad, si llamamos finish() entonces onStop() llamó y finalmente onDestroy() que onDestroy() esa Actividad para Garbage Collection y la quita de la Activity Stack de Android.

  2. Android mantiene la caché de dibujo para la actividad de diseño y visualización en la pantalla. Por lo tanto, si deshabilita la caché onCreate() Actividad onCreate() .

Por lo tanto, la mejor práctica es desactivar el caché extraíble en el onCreate la onCreate manera:

  LinearLayout v = (LinearLayout) findViewById(R.id.mainLayout); v.setDrawingCacheEnabled(false); 

Y llamar a finish(); En la onPause() ;

Tienes muy poco control sobre la memoria cuando escribes código Java. Esto es bueno para la mayoría de los casos. En realidad, la mayor parte de la aplicación no necesita preocuparse por la memoria.

Para responder a su pregunta, todo el objeto de la actividad A permanecerá en la memoria cuando se suspenda. VM iniciará GC cuando necesite recursos.

  • Android - ¿Por qué mi aplicación utiliza alrededor de 40 MB de proceso de fondo en caché?
  • LeakCanary informa actividad filtrada Instancia por implementación anónima de localización
  • El método android finish () no borra la aplicación de la memoria
  • ¿Cuánta memoria recibe cada proceso de Android?
  • Android java, obtener más uso de memoria permitido
  • android R.integer devuelve incorrecto Valor extremadamente grande que causa fuera de mem mientras que crea el arsenal
  • ¿Trabajar alrededor de la fuga de SpellCheckerSession?
  • Android: Campos estáticos y fugas de memoria
  • ¿Por qué Android no limpia la memoria después de terminar la actividad?
  • Consulta sobre "dumpsys meminfo" en android
  • ¿Cómo utilizar Valgrind con la aplicación android en Eclipse en Ubuntu para encontrar fugas de memoria de código nativo android en tiempo de ejecución?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.