2011-08-29 11 views
46

El diagrama de ciclo de vida de una actividad en un android no garantiza que se llame a onDestroy(), pero que el proceso se puede eliminar y la actividad se elimina abruptamente. El diagrama de ciclo de vida de un servicio en un android garantiza que se llame a onDestroy(). Entonces tengo dos preguntas relacionadas con esta diferencia.¿Está garantizado que un servicio de android llama a Destroy()?

En primer lugar, si el Servicio es parte del mismo proceso que la Actividad, ¿se llama al Servicio onDestroy(), aunque no se llama a la Actividad onDestroy()? Yo pensaría que no, ya que "matar a un proceso" sugiere que el sistema operativo está deteniendo sus hilos y liberando sus recursos.

Y si ese es el caso, ¿puede un proceso de solo servicio ser abruptamente asesinado por el sistema operativo?

Respuesta

29

No estoy seguro de dónde está viendo que se garantiza que un servicio tenga onDestroy() llamado. Hasta donde yo sé, este no es el caso. Si lee la página this de los documentos, describe las condiciones en las que un servicio podría ser eliminado. Entonces, si está preguntando si un proceso que alberga tanto una actividad como un servicio está siendo cancelado, se llamará al onDestroy() en el servicio (pero no en la actividad), entonces la respuesta es no; no se llamará necesariamente a un servicio onDestroy(). En cuanto a si un proceso de solo servicio puede ser abruptamente asesinado por el sistema operativo: sí, puede. Esto es especialmente cierto cuando tiene mucho trabajo por hacer, y su llamada onStartCommand solo hace cola para que el trabajo se realice de forma asíncrona. Entonces el servicio pasará la mayor parte de su tiempo no en los métodos protegidos onCreate, onStartCommand o onDestroy.

+0

Ese enlace era lo que quería ver. ¡Gracias! Estaba confundido al mirar los diagramas del ciclo de vida, porque uno mostraba el caso del proceso que se mata y el otro no. Pensé que esto último estaba implícito, sin embargo. Simplemente no sabía dónde verificar mis pensamientos. – user574771

+1

¿cómo puede recibir una notificación cuando necesita limpiar un servicio antes del cierre? por ejemplo, quiero almacenar en caché algún estado y enjuagarlo antes de cerrarlo; si nunca me dicen que me estoy cerrando, perderé mi estado, ¡no es bueno! – Michael

+1

@Michael Considere enjuagarlo periódicamente para almacenarlo/cuando cambien sus datos. Es una pregunta razonable. De hecho, si mi respuesta simple no te satisface, valdría la pena publicar tu propia pregunta sobre esto para obtener algunas respuestas en profundidad. – kabuko

10

Hay dos cosas a considerar:

  1. Android might decide to shut down a process at some point, when memory is low and required by other processes that are more immediately serving the user. Application components running in the process that's killed are consequently destroyed. A process is started again for those components when there's again work for them to do.En este caso no se llama onDestroy() como Android OS reclamará recursos de todos modos (esto es tarea básica del sistema operativo en general - en caso de que no lo hace saber que).
  2. A service can be both started and have connections bound to it. In such a case, the system will keep the service running as long as either it is started or there are one or more connections to it with the Context.BIND_AUTO_CREATE flag. Once neither of these situations hold, the service's onDestroy() method is called and the service is effectively terminated. All cleanup (stopping threads, unregistering receivers) should be complete upon returning from onDestroy(). Así que cuando el sistema operativo Android ve que el servicio ha terminado su trabajo y ya no es necesario, el sistema operativo de Android lo ignorará. El sistema operativo Android brinda al desarrollador la oportunidad de liberar los recursos del servicio para no causar pérdida de memoria. En este caso onDestroy() se llama ya que este es el lugar donde el desarrollador puede liberar los recursos. Por supuesto, en este caso, el proceso de la aplicación permanece intacto (ya que puede haber otros Servicios/Actividades ejecutándose en él).
+0

'Una vez que ninguna de estas situaciones mantiene'! = 'Guaranteed'! =' Always' –

+0

¿Entonces? ¿De qué se trata este comentario? Citó parte de los documentos oficiales, entonces? –

+0

Cité la misma parte de los documentos oficiales que usted hizo. Dice que 'Una vez que ninguna de estas situaciones se cumple, se llama al método onDestroy() del servicio'. Todavía significa que incluso cuando ambas situaciones mantengan el servicio, no solo se eliminará sin llamar a 'onDestroy'. Y en la práctica eso pasa a ser cierto. –

Cuestiones relacionadas