¿Está garantizado que un servicio de Android llama a Destroy ()?

El diagtwig del 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 diagtwig de ciclo de vida de un servicio en un android garantiza que se llame a onDestroy (). Entonces tengo dos preguntas relacionadas con esta diferencia.

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?

No estoy seguro de dónde está viendo que se garantiza que un servicio tenga onDestroy() . Hasta donde yo sé, este no es el caso. Si lee esta página de los documentos, describe las condiciones en las que un servicio podría ser asesinado. Entonces, si está preguntando si un proceso que aloja tanto una actividad como un servicio está siendo onDestroy() , se onDestroy() a onDestroy() en el servicio (pero no en la actividad), entonces la respuesta es no; el servicio onDestroy() no será necesariamente llamado. 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 pone en cola el trabajo para hacer de manera asincrónica. Entonces, el servicio pasará la mayor parte del tiempo no en los onCreate protegidos onCreate , onStartCommand o onDestroy .

Hay dos cosas a considerar:

  1. Android podría decidir cerrar un proceso en algún momento, cuando la memoria es baja y es requerida por otros procesos que están sirviendo al usuario más inmediatamente. Por lo tanto, se destruyen los componentes de la aplicación que se ejecutan en el proceso anulado. Se inicia nuevamente un proceso para esos componentes cuando nuevamente hay trabajo para ellos. En este caso, no se llama a onDestroy() ya que el sistema operativo Android reclamará recursos de todos modos (esta es una tarea básica del sistema operativo en general, en caso de que no lo sepa).
  2. Un servicio puede iniciarse y tener conexiones vinculadas a él. En tal caso, el sistema mantendrá el servicio en ejecución mientras se inicie o haya una o más conexiones con el indicador Context.BIND_AUTO_CREATE. Una vez que ninguna de estas situaciones se cumple, se llama al método onDestroy () del servicio y el servicio finaliza efectivamente. Toda la limpieza (detención de subprocesos, anulación del registro de receptores) debe completarse al regresar de onDestroy (). Entonces, cuando el sistema operativo Android ve que el Servicio ha terminado su trabajo y ya no es necesario, el sistema operativo 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 se llama a onDestroy() 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).