Sobes.tech
Junior

Pourquoi l'activité est-elle recréée lors de la rotation de l'écran?

sobes.tech IA

Réponse de l'IA

Lorsque l'écran est tourné, la configuration de l'appareil change, par exemple l'orientation. Android y répond en détruisant et recréant l'activité pour appliquer les modifications nécessaires aux ressources, telles que les fichiers de mise en page spécifiques à l'orientation portrait ou paysage.

Cycle de vie de l'activité lors de la rotation:

  1. onPause()
  2. onStop()
  3. onDestroy()
  4. Le système crée une nouvelle instance de l'activité.
  5. onCreate()
  6. onStart()
  7. onResume()

Pour sauvegarder l'état avant la destruction de l'activité, on utilise:

  • onSaveInstanceState(): sauvegarde de petites données dans un Bundle.

    override fun onSaveInstanceState(outState: Bundle) {
        super.onSaveInstanceState(outState)
        outState.putString("myKey", "myValue") // Sauvegarder les données
    }
    

    Restauration dans onCreate() ou onRestoreInstanceState():

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // ...
        if (savedInstanceState != null) {
            val myValue = savedInstanceState.getString("myKey") // Restaurer les données
        }
        // ...
    }
    
  • ViewModel: conserve les données tout au long du cycle de vie du contrôleur UI (Activity/Fragment), même lors du changement de configuration. ViewModel survit à la destruction de l'activité et ne perd pas son état.

    class MyViewModel : ViewModel() {
        var counter = 0
    }
    

    Utilisation dans l'activité/fragment:

    class MyActivity : AppCompatActivity() {
        private lateinit var viewModel: MyViewModel
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            viewModel = ViewModelProvider(this).get(MyViewModel::class.java)
            // Maintenant, viewModel.counter est conservé lors de la rotation
        }
    }
    
  • Sauvegarde des données dans SharedPreferences ou une base de données pour des données plus persistantes.

Pour éviter la recréation de l'activité lors de la rotation de l'écran, il est possible de déclarer que l'activité gère elle-même les changements de configuration. Cela se fait dans le manifeste, en ajoutant l'attribut configChanges="orientation|screenSize|screenLayout" à la balise <activity>:

<activity android:name=".MyActivity"
          android:configChanges="orientation|screenSize|screenLayout">
</activity>

Dans ce cas, au lieu de recréer l'activité, la méthode onConfigurationChanged() sera appelée:

override fun onConfigurationChanged(newConfig: Configuration) {
    super.onConfigurationChanged(newConfig)
    // Gérer manuellement le changement de configuration
    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
        // Logique pour l'orientation paysage
    } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
        // Logique pour l'orientation portrait
    }
}

L'utilisation de configChanges n'est pas recommandée dans la plupart des cas, car cela peut compliquer la gestion de l'état et des ressources lors de différents changements de configuration. La meilleure pratique consiste à utiliser ViewModel pour sauvegarder l'état des données.