¿Es seguro hacer toda la limpieza en onDestroy?

Más concretamente: ¿Es seguro colocar la cancelación de una tarea en onDestroy? Además, ¿es seguro utilizar onDestroy para anular el registro de receptores y liberar recursos?

Mi objetivo es asegurarse de que mi tarea se cancela / destruye cuando se destruye la actividad, pero no antes.

OnDestroy ():

  1. Se llama cuando la actividad es destruida y los recursos deben ser liberados.
  2. NO se llama cuando la actividad se destruye en una prisa (cuando el sistema es bajo en recursos, etc).

El primer caso es claro: hago toda la limpieza en onDestroy y no surgen problemas. El segundo caso es un poco un problema. Cuando se destruye la actividad y onDestroy se omite (por lo que no cancelo mi tarea), podría suceder que la tarea continúa la ejecución, luego completa e intenta actualizar la actividad muerta, por lo que la aplicación se bloquea?


Llegamos a la verdadera pregunta:

  1. Cuando se elimina una Actividad y se omite Destrucción, ¿se destruye automáticamente todo lo relacionado con esa Actividad? (¿Es onDestroy omitido sólo en caso de que todo se borrará por completo? Tareas, receptores registrados, etc)
  2. Si onDestroy se omite, ¿significa que se está matando a toda la aplicación ?

Centrémonos en onDestroy (), porque la solución no está en onPause () o onStop (). Argumentos:

  • OnStop () se puede omitir cuando se destruye la actividad, al igual que onDestroy
  • OnPause se llama demasiado pronto y demasiado a menudo, por lo que no es apropiado para el caso de uso. Ejemplos:

Bloqueo de pantalla : onPause se puede llamar cuando la pantalla del dispositivo está bloqueada . Muy a menudo esto sucede como un protector de pantalla y el usuario desbloquea inmediatamente porque él está parado allí mirando la pantalla. Cancelar tareas y detener todo lo que mi aplicación está haciendo en tal caso sólo degradará la experiencia del usuario. No quiero que mi aplicación se ahogue y se comporte mal debido a un "salvapantallas" incidental.

En una aplicación de ejemplo tengo dos pantallas que son Actividades. El usuario puede cambiar rápidamente entre ellos. En esta aplicación los usuarios tienden a cambiar las pantallas con frecuencia y rápidamente.

Navegación : Una de las pantallas tiene un mapa que recibe actualizaciones de localización del sistema. Registra un registro gráfico preciso de los cambios en la ubicación (ruta), por lo que debe ejecutarse constantemente hasta que se cierre la actividad. Normalmente me registraría y anularía el registro de los receptores en onResume y onPause. Sin embargo, esto haría la aplicación muy inutilizable, como las actualizaciones en el mapa se detendrá cada vez que el usuario navega lejos. Por lo tanto, me gustaría anular el registro de los receptores en onDestroy.

Lista de carga : La segunda pantalla tiene una lista que muestra los datos de un servicio web. Se tarda 4 segundos para descargar los datos. Utilizo un AsyncTask y sé que debo cancelar cuando sea necesario. No debe cancelarse en OnPause, ya que debe continuar cargando mientras el usuario cambia entre pantallas. Por lo tanto, me gustaría cancelarlo en onDestroy.

Puede haber muchos más ejemplos. Algunos de ellos pueden no ser totalmente apropiados en la opinión de todos (incluso podría sugerir el uso de un servicio en lugar de AsyncTask). Pero la idea es importante, y todos ellos tienen la misma idea : seguir haciendo un trabajo específico de la Actividad, mientras que la Actividad está en pausa , pero ASEGÚRESE de dejar de hacerlo cuando se destruye la Actividad. (No importa si estoy utilizando un AsyncTask o un Servicio. En cualquier caso, el trabajo debe ser detenido cuando se destruye la actividad.)

PS Si la respuesta es que no es seguro hacer la limpieza en onDestroy , esto significaría que el marco de Android nos obliga a detener todo lo que estamos haciendo en onPause. Y entonces no vería ninguna razón para usar onDestroy …

3 Solutions collect form web for “¿Es seguro hacer toda la limpieza en onDestroy?”

Me gustaría referirle a este bebé: http://developer.android.com/reference/android/content/ComponentCallbacks2.html#onTrimMemory(int)

Esencialmente le da todos los lugares donde el sistema encuentra útil cancelar tareas y limpiar su memoria:

Por favor, eche un vistazo más de cerca a los siguientes 2 casos:

TRIM_MEMORY_UI_HIDDEN – el proceso mostraba una interfaz de usuario y ya no lo hace.

TRIM_MEMORY_COMPLETE – el proceso se acerca al final de la lista LRU de fondo.

Cuáles son los casos para la mayor parte de lo que usted pidió.

En el mismo método también se puede capturar TRIM_MEMORY_RUNNING_CRITICAL que le alertará a un caso en el que el sistema no tiene memoria y se deben tomar acciones especiales de inmediato.

Este método ha hecho mi vida de desarrollo mucho mejor en casos similares.

Si sólo necesitas hacer alguna limpieza, no importa cómo se cierre la actividad, deberías poder usar una combinación de onSaveInstanceState() y onDestroy() . Uno de ellos debe ser llamado no importa qué. Tal vez tener una boolean cleanupDone en su actividad, que se establece siempre que uno de los dos acabados.

Con respecto al ahorro de datos de usuario , eche un vistazo a Guardar estado persistente :

Google sugiere un

Modelo de usuario "editar en el lugar"

Es decir: guardar tan pronto como el usuario crea nuevos datos, como máximo en onPause() . Esto no significa que usted necesita para recrear los datos en onResume() , sólo que debería haber sido guardado.

Por cierto: onStop() se puede omitir sólo en dispositivos pre-Honeycomb , es decir, a junio de 2015 , menos del 6% de todos los dispositivos. Sin embargo, onSaveInstanceState() debe llamar si onDestroy() o onStop() se omiten.

Por lo que he ido con android,

1 Cuando las aplicaciones se bloquean, todos los recursos relevantes se destruyen.

2 Cuando el dispositivo cambia la configuración que resulta en la actividad que se va a destruir y recrear.

3 Cuando las aplicaciones se ejecutan en segundo plano y Android matarlo debido a la ejecución en la memoria baja

Aparte de estos, el otro método de devolución de llamada se llama ie

1 cuando otra Actividad venga al frente, o el dispositivo bloquea ..etc

En todo caso según su requisito usted puede lanzar todos sus recursos en onDestroy y cancelar el Thread y Asyntask y parar todos los servicios etc .if que usted quisiera que su tarea permanezca parada y viva mientras que en destruido llamó entonces usted puede ahorrar la configuración y conservarla Mientras onCreate se llama de nuevo por cheque es nulo o no.

  • ¿Hay un Application :: onDestroy () equivalente para Android?
  • Ver - buscando un evento como en (Ver) Destruido
  • ¿Qué está haciendo exactamente el método Activity.finish ()?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.