¿Por qué utilizar Fragment # setRetainInstance (boolean)?

Encuentro Fragmento # setRetainInstance (true) confuso. Aquí está el Javadoc, extraído de la API para desarrolladores de Android :

Public void setRetainInstance (retención booleana)

Controlar si una instancia de fragmento se conserva a lo largo de la recreación de actividad (por ejemplo, a partir de un cambio de configuración). Esto sólo puede usarse con fragmentos que no estén en la pila trasera. Si se establece, el ciclo de vida de los fragmentos será ligeramente diferente cuando se recrea una actividad:

  • OnDestroy () no será llamado (pero onDetach () seguirá siendo, porque el fragmento se está desvinculando de su actividad actual).
  • OnCreate (Bundle) no se llamará ya que el fragmento no se vuelve a crear.
  • OnAttach (Activity) y onActivityCreated (Bundle) seguirán siendo llamados.

Pregunta: ¿Cómo usan esto los desarrolladores y por qué facilitan las cosas?

¿Cómo usas esto como desarrollador?

Llame a setRetainInstance(true) . Normalmente lo hago en onCreateView() o onActivityCreated() , donde lo uso.

Y por qué facilita las cosas?

Tiende a ser más simple que onRetainNonConfigurationInstance() para manejar la retención de datos a través de cambios de configuración (por ejemplo, girar el dispositivo de retrato a paisaje). Los fragmentos no retenidos son destruidos y recreados en el cambio de configuración; Los fragmentos retenidos no lo son. Por lo tanto, cualquier información contenida en esos fragmentos retenidos está disponible para la actividad de cambio posterior a la configuración.

Es muy útil para mantener abiertos los recursos largos como los sockets. Tenga un fragmento sin interfaz de usuario que contenga referencias a los sockets bluetooth y no tendrá que preocuparse por volver a conectarlos cuando el usuario cambie el teléfono.

También es útil para mantener referencias a recursos que requieren mucho tiempo para cargar como mapas de bits o datos de servidor. Cargarlo una vez, mantenerlo en un fragmento retenido, y cuando la actividad se vuelve a cargar todavía está allí y no tiene que reconstruirlo.

Agregó esta respuesta muy tarde, pero pensé que sería hacer las cosas más claras. Repite después de mi. Cuando setRetainInstance es:

FALSO

  • Fragmento se vuelve a crear en el cambio de configuración. Se crea NUEVA INSTANCIA.
  • TODOS los métodos del ciclo de vida son llamados al cambio de configuración, incluyendo onCreate () y onDestroy ().

CIERTO

  • Fragmento no se vuelve a crear en el cambio de configuración. Se utiliza SAME INSTANCE.
  • Todos los métodos del ciclo de vida se llaman al cambio de configuración, APART FROM onCreate () y onDestroy ().
  • La retención de una instancia no funcionará cuando se agrega a la backstack.

No olvide que lo anterior se aplica a DialogFragments, así como fragmentos.

  • FacebookActivity no llamó a finish () en Api 23+
  • Apertura de la cámara en un proceso diferente
  • cómo comprobar si una actividad implementa una interfaz después de onAttach (Activity activity) ha sido depreciada
  • Mal comportamiento de Backstack de la actividad cuando la actividad destruida
  • ¿Android almacena variables estáticas?
  • Ciclo de vida de android onActivityResult vs onStop
  • En libgdx en Android, ¿cómo puedo guardar el estado del juego en caso de que se muera la aplicación?
  • OnDestroy () - para establecer o no establecer variables de instancia a null?
  • Cómo detener y reanudar un servicio
  • Cómo saber si un Fragmento fue recreado o retenido
  • El OnClickListener de Fragment llamado después de OnDestroyView
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.