¿Por qué se vuelve a crear la actividad al girar la pantalla?
sobes.tech AI
Respuesta de la IA
Al girar la pantalla, la configuración del dispositivo cambia, por ejemplo, la orientación. Android responde a esto destruyendo y recreando la actividad para aplicar los cambios necesarios en los recursos, como archivos de diseño específicos para orientación vertical u horizontal.
Ciclo de vida de la actividad al girar:
onPause()onStop()onDestroy()- El sistema crea una nueva instancia de la actividad.
onCreate()onStart()onResume()
Para guardar datos de estado antes de destruir la actividad, se utilizan:
-
onSaveInstanceState(): guarda pequeños datos en unBundle.override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) outState.putString("myKey", "myValue") // Guardar datos }Restauración en
onCreate()oonRestoreInstanceState():override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // ... if (savedInstanceState != null) { val myValue = savedInstanceState.getString("myKey") // Restaurar datos } // ... } -
ViewModel: guarda datos durante todo el ciclo de vida del controlador de interfaz de usuario (Actividad/Fragmento), incluso cuando cambia la configuración. ViewModel sobrevive a la destrucción de la actividad y no pierde su estado.
class MyViewModel : ViewModel() { var counter = 0 }Uso en actividad/fragmento:
class MyActivity : AppCompatActivity() { private lateinit var viewModel: MyViewModel override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) viewModel = ViewModelProvider(this).get(MyViewModel::class.java) // Ahora viewModel.counter se mantiene al girar } } -
Guardar datos en SharedPreferences o en una base de datos para datos más persistentes.
Para evitar la recreación de la actividad al girar la pantalla, se puede declarar que la actividad maneja por sí misma los cambios de configuración. Esto se hace en el manifiesto, agregando el atributo configChanges="orientation|screenSize|screenLayout" a la etiqueta <activity>:
<activity android:name=".MyActivity"
android:configChanges="orientation|screenSize|screenLayout">
</activity>
En este caso, en lugar de recrear la actividad, se llamará al método onConfigurationChanged():
override fun onConfigurationChanged(newConfig: Configuration) {
super.onConfigurationChanged(newConfig)
// Manejar manualmente el cambio de configuración
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
// Lógica para orientación horizontal
} else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
// Lógica para orientación vertical
}
}
El uso de configChanges no se recomienda en la mayoría de los casos, ya que puede complicar la gestión del estado y los recursos ante diferentes cambios de configuración. La mejor práctica es usar ViewModel para guardar los datos de estado.