¿Por qué desvincular Service onDestroy?

He visto que se menciona en múltiples fuentes, que si una actividad enlaza un servicio, debe desvincularlo enDestroy. ¿Por qué? Dado que la actividad se destruye, parece que el servicio será desvinculado de todos modos. Si fue "iniciado" – no importa de todos modos. Y si se inició automáticamente por la actividad – se cerrará de todos modos si no otros vinculados.

Entonces, ¿por qué desvincularlo?

Las actividades deben gestionar los cambios de configuración, como cuando se gira la pantalla o el usuario cambia las configuraciones locales o el dispositivo entra en el modo nocturno.

El comportamiento predeterminado de la actividad de primer plano, cuando se produce un cambio de configuración, es que se destruya y se vuelva a crear.

Como resultado, llamar a bindService() en una Activity no es una buena idea. Queremos que el enlace permanezca intacto a través del cambio de configuración. De lo contrario, nuestro servicio será destruido y recreado, junto con la actividad (suponiendo que la actividad tiene el único enlace y nada más comenzó el servicio).

Por lo tanto, el patrón recomendado es llamar a bindService() en el singleton de Application . A continuación, puede pasar su ServiceConnection desde la instancia de actividad anterior a la nueva instancia de actividad. Los fragmentos retenidos funcionan bien para esto, ya que entonces se puede llamar unbindService() en onDestroy() del fragmento , de modo que cuando la actividad es "permanentemente" destruida (por ejemplo, el usuario pulsa BACK, llama finish() ser liberado.


Con todo eso como fondo, a su preocupación específica.

En primer lugar, se supone que una actividad destruida automáticamente se desvincula de los servicios a los que se enlazó a través de bindService() llamados a esa Activity . Es posible que esto suceda, aunque no recuerdo que el comportamiento documentado, y es el tipo de cosa que los desarrolladores no deben confiar.

Más importante aún, en la mayoría de los casos, llamar a bindService() en la Activity no es el enfoque correcto. De lo contrario, entrar en los problemas que he descrito anteriormente.

Pero, siguiendo el bindService() -en-la- Application , no esperaría que alguna vez haya algún tipo de desvinculación automática, ya que el Singleton de Application nunca se destruye. Por lo tanto, si no llama a unbindService() algún lugar (por ejemplo, en onDestroy() del fragmento retenido), perderá su servicio.

  • Uso del servicio como singleton en Android
  • Actividad y acceso al fondo de acceso a la base de datos SQLite
  • Servicio AIDL que no se conecta después de bindService ()
  • Cómo consumir servicios web SOAP / REST en Android (Servicio / Difusión / Intención / etc)
  • Matar la aplicación android del administrador de tareas mata los servicios iniciados por la aplicación
  • Android RuntimeException: No se puede crear una instancia del servicio
  • Compruebe si la actividad se está ejecutando desde el servicio
  • ¿Cómo detener un servicio de Android SOLAMENTE cuando no hay otras actividades en mi aplicación en ejecución?
  • Evitando el retraso de inicialización de Google TTS Engine en Android
  • Transmisión local desde Servicio no recibido por Actividad
  • ¿Cómo actualizar un widget de aplicación en la medianoche?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.