¿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)
- ¿Puede Wi-Fi o la CPU ir a dormir cuando la pantalla está encendida?
- Diferencia principal entre el Manifiesto y el Registro Programático de BroadcastReceiver
- Actividad Ciclo de vida X Botón de encendido X Pantalla de bloqueo
- Comportamiento extraño del ciclo de vida de la actividad - después onResume () también onPause () llamado ... ¿por qué?
- ¿Por qué onDestroy siempre se llama cuando regresa a la actividad de los padres?
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?
- La aplicación se reinicia en lugar de continuar
- Al cerrar la sesión, desactive la pila del historial de actividades, evitando que el botón "volver" abra las actividades activadas
- DialogFrag # show () de un lanzamiento de fragmentos "IllegalStateException: no se puede realizar esta acción después onSaveInstanceState"
- ¿Cuál es el orden correcto de llamar métodos de superclase en los métodos onPause, onStop y onDestroy? ¿y por qué?
- Uso del servicio como singleton en Android
- ¿Cuándo se utiliza realmente el paquete savedInstanceState?
- Evitar múltiples instancias de mi aplicación de Android compuesta por una sola actividad
- ¿Puede Android Service superar el objeto de aplicación?
¿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.