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.
- Cargar un archivo de 16KB en Android tarda 35 segundos?
- ¿Por qué se recomienda no retener el fragmento con la interfaz de usuario?
- Android: ¿herramientas para encontrar fugas de memoria?
- Android WebView - Fuga de memoria de JavaScript
- Uso de la memoria de aplicaciones Android de Xamarin
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
- ¿El método ArrayList.clear () libera memoria?
- Android NDK mmap llamada roto en dispositivos de 32 bits después de actualizar a Lollipop
- Memoria liberada del colector de basura de Android
- Referencia débil en lugar de getActivity () (evitar Android memoria fugas)?
- ¿Es esta Runnable a salvo de fugas de memoria?
- ¿Por qué EditText conserva el contexto de su actividad en Ice Cream Sandwich
- Público o privado, realmente importa con las variables de Android
- Beneficios de GSON sobre el análisis normal de JSON
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.
-
Según el ciclo de vida de la Actividad, si llamamos
finish()
entoncesonStop()
llamó y finalmenteonDestroy()
queonDestroy()
esa Actividad para Garbage Collection y la quita de la Activity Stack de Android. -
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()
ActividadonCreate()
.
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.
- No se puede resolver el símbolo 'IOUtils'
- Cómo solucionar IncompatibleClassChangeError durante Android Jackson Parsing usando anotaciones en Android Lollipop?