Sobes.tech
Junior

Warum wird die Aktivität beim Drehen des Bildschirms neu erstellt?

sobes.tech KI

Antwort von AI

Wenn der Bildschirm gedreht wird, ändert sich die Geräte-Konfiguration, z.B. die Orientierung. Android reagiert darauf, indem es die Aktivität zerstört und neu erstellt, um die notwendigen Änderungen in den Ressourcen anzuwenden, wie z.B. layout-Dateien, die für Hoch- oder Querformat spezifisch sind.

Lebenszyklus der Aktivität beim Drehen:

  1. onPause()
  2. onStop()
  3. onDestroy()
  4. Das System erstellt eine neue Instanz der Aktivität.
  5. onCreate()
  6. onStart()
  7. onResume()

Um Zustandsdaten vor der Zerstörung der Aktivität zu speichern, werden verwendet:

  • onSaveInstanceState(): speichert kleine Daten in einem Bundle.

    override fun onSaveInstanceState(outState: Bundle) {
        super.onSaveInstanceState(outState)
        outState.putString("myKey", "myValue") // Daten speichern
    }
    

    Wiederherstellung in onCreate() oder onRestoreInstanceState():

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // ...
        if (savedInstanceState != null) {
            val myValue = savedInstanceState.getString("myKey") // Daten wiederherstellen
        }
        // ...
    }
    
  • ViewModel: speichert Daten während des gesamten Lebenszyklus des UI-Controllers (Activity/Fragment), auch bei Konfigurationsänderungen. Das ViewModel überlebt die Zerstörung der Aktivität und verliert seinen Zustand nicht.

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

    Verwendung in der Aktivität/Fragment:

    class MyActivity : AppCompatActivity() {
        private lateinit var viewModel: MyViewModel
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            viewModel = ViewModelProvider(this).get(MyViewModel::class.java)
            // Jetzt bleibt viewModel.counter beim Drehen erhalten
        }
    }
    
  • Speichern von Daten in SharedPreferences oder einer Datenbank für persistente Daten.

Um die Neuerstellung der Aktivität beim Drehen des Bildschirms zu vermeiden, kann man deklarieren, dass die Aktivität die Konfigurationsänderungen selbst behandelt. Dies erfolgt im Manifest durch Hinzufügen des Attributs configChanges="orientation|screenSize|screenLayout" zum <activity>-Tag:

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

In diesem Fall wird anstelle der Neuerstellung der Aktivität die Methode onConfigurationChanged() aufgerufen:

override fun onConfigurationChanged(newConfig: Configuration) {
    super.onConfigurationChanged(newConfig)
    // Manuelles Handling der Konfigurationsänderung
    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
        // Logik für Querformat
    } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
        // Logik für Hochformat
    }
}

Die Verwendung von configChanges wird in den meisten Fällen nicht empfohlen, da sie die Verwaltung des Zustands und der Ressourcen bei verschiedenen Konfigurationsänderungen erschweren kann. Der bevorzugte Ansatz ist die Verwendung von ViewModel zum Speichern des Zustands.