Descripción de SetRetainInstance del fragmento (boolean)

Comenzando con la documentación:

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.

Tengo algunas preguntas:

  • ¿El fragmento también conserva su punto de vista, o será recreado en el cambio de configuración? ¿Qué es exactamente "retenido"?

  • ¿Se destruirá el fragmento cuando el usuario abandone la actividad?

  • ¿Por qué no funciona con fragmentos en la pila trasera?

  • ¿Cuáles son los casos de uso donde tiene sentido usar este método?

En primer lugar, echa un vistazo a mi puesto en Fragmentos retenidos. Podría ayudar.

Ahora para responder a sus preguntas:

¿El fragmento también conserva su estado de vista , o será recreado en el cambio de configuración? ¿Qué es exactamente "retenido"?

Sí, el estado del Fragment se mantendrá durante el cambio de configuración. Específicamente, "retenido" significa que el fragmento no se destruirá en los cambios de configuración. Es decir, el Fragment se mantendrá incluso si el cambio de configuración hace que la Activity subyacente sea destruida.

¿Se destruirá el fragmento cuando el usuario abandone la actividad?

Al igual que las Activity , los Fragment pueden ser destruidos por el sistema cuando los recursos de memoria son bajos. Si usted tiene sus fragmentos conservan su estado de la instancia a través de cambios de la configuración no tendrá ningún efecto en si o no el sistema destruirá el Fragment s una vez que usted deja la Activity . Si abandona la Activity (es decir, presionando el botón de inicio), el Fragment puede o no ser destruido. Si abandona la Activity presionando el botón Atrás (de esta manera, llamando a finish() y destruyendo efectivamente la Activity ), también se destruirá todo el Fragment adjunto de la Activity .

¿Por qué no funciona con fragmentos en la pila trasera?

Probablemente hay varias razones por las que no se admite, pero la razón más obvia para mí es que la Activity contiene una referencia al FragmentManager y el FragmentManager administra el backstack. Es decir, no importa si elige retener su Fragment o no, la Activity (y por lo tanto el backtrack del FragmentManager ) será destruida en un cambio de configuración. Otra razón por la que podría no funcionar es porque las cosas podrían resultar complicadas si se permitiera que ambos fragmentos retenidos y fragmentos no retenidos existieran en el mismo backstack.

¿Cuáles son los casos de uso donde tiene sentido usar este método?

Los fragmentos retenidos pueden ser muy útiles para propagar información de estado – especialmente gestión de subprocesos – a través de instancias de actividad. Por ejemplo, un fragmento puede servir como un host para una instancia de Thread o AsyncTask , administrando su operación. Consulta la publicación de mi blog en este tema para obtener más información.

En general, yo lo trataría de manera similar a usar onConfigurationChanged con una Activity … no lo use como un bandaid sólo porque usted es demasiado perezoso para implementar / manejar un cambio de orientación correctamente. Úselo sólo cuando lo necesite.

setRetaininstance sólo es útil cuando la activity se destruye y se setRetaininstance crear debido a un cambio de configuración porque las instancias se guardan durante una llamada a onRetainNonConfigurationInstance . Es decir, si gira el dispositivo, los fragmentos retenidos permanecerán allí (no se destruyen y recrean.) Pero cuando el tiempo de ejecución mata la actividad para recuperar recursos, no queda nada. Al pulsar el botón Atrás y salir de la actividad, todo se destruye.

Normalmente utilizo esta función para guardar la orientación de cambio Time.Say tengo descargar un montón de mapas de bits del servidor y cada uno es de 1 MB, cuando el usuario gira accidentalmente su dispositivo, no quiero hacer todo el trabajo de descarga de nuevo. Creo un Fragment sostiene mis mapas de bits y lo agrego al encargado y llamo a setRetainInstance , todos los setRetainInstance bits están todavía allí incluso si la pantalla cambia de la orientación.

SetRetainInstance (true) permite que el tipo de fragmento de sobrevivir. Sus miembros serán retenidos durante el cambio de configuración como la rotación. Pero todavía se puede matar cuando la actividad se muere en el fondo. Si la actividad que contiene en el fondo es eliminada por el sistema, su instanceState debe ser guardado por el sistema que manejó onSaveInstanceState correctamente. En otra palabra siempre se llamará onSaveInstanceState. Aunque onCreateView no se llamará si SetRetainInstance es verdadera y el fragmento / actividad no se ha matado todavía, todavía se llamará si se mata y se intenta volver a traer.

Aquí hay algunos análisis de la actividad de Android / fragmento de esperanza que ayuda. http://ideaventure.blogspot.com.au/2014/01/android-activityfragment-life-cycle.html

SetRetainInstance (boolean) es útil cuando se desea tener algún componente que no esté vinculado al ciclo de vida de la actividad. Esta técnica es utilizada por ejemplo por rxloader para "manejar el ciclo de vida de la actividad de Android de Observable de rxjava" (que he encontrado aquí ).

  • El fragmento no se puede convertir en Contexto
  • Fragmentos de Android. Retener un AsyncTask durante la rotación de la pantalla o el cambio de configuración
  • ¿Por qué el teclado virtual de Android no responde a EditText?
  • ¿Cómo Fragments manejar toques?
  • Cambiar fragmentos demasiado rápidamente causa: java.lang.IllegalStateException: Sin actividad
  • Funciones de llamada dentro de fragmentos en Android
  • cómo obtener Resultado de onActivityResult en Fragment?
  • SearchView con múltiples fragmentos usando viewpager en android
  • ¿Cómo obtener una lista de entradas de fragmentos backstack en android?
  • Obtener el ID de la vista de contenedor de fragmento
  • Android - después del cambio de orrientación cambia el fragmento objetivo en el fragmento de diálogo
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.