Waarom wordt de activiteit opnieuw gemaakt bij het draaien van het scherm?
sobes.tech AI
Antwoord van AI
Bij het draaien van het scherm verandert de configuratie van het apparaat, bijvoorbeeld de oriëntatie. Android reageert hierop door de activiteit te vernietigen en opnieuw te creëren om de benodigde wijzigingen in de bronnen toe te passen, zoals layout-bestanden die specifiek zijn voor portret- of landschaporiëntatie.
Levenscyclus van de activiteit bij draaien:
onPause()onStop()onDestroy()- Het systeem maakt een nieuw exemplaar van de activiteit.
onCreate()onStart()onResume()
Om de statusgegevens op te slaan voordat de activiteit wordt vernietigd, worden gebruikt:
-
onSaveInstanceState(): slaat kleine gegevens op in eenBundle.override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) outState.putString("myKey", "myValue") // Gegevens opslaan }Herstel in
onCreate()ofonRestoreInstanceState():override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // ... if (savedInstanceState != null) { val myValue = savedInstanceState.getString("myKey") // Gegevens herstellen } // ... } -
ViewModel: bewaart gegevens gedurende de volledige levenscyclus van de UI-controller (Activity/Fragment), zelfs bij configuratiewijzigingen. ViewModel overleeft de vernietiging van de activiteit en verliest zijn toestand niet.
class MyViewModel : ViewModel() { var counter = 0 }Gebruik in activiteit/fragment:
class MyActivity : AppCompatActivity() { private lateinit var viewModel: MyViewModel override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) viewModel = ViewModelProvider(this).get(MyViewModel::class.java) // Nu blijft viewModel.counter behouden bij draaien } } -
Opslaan van gegevens in SharedPreferences of een database voor meer persistente gegevens.
Om het opnieuw creëren van de activiteit bij het draaien van het scherm te voorkomen, kan worden aangegeven dat de activiteit zelf de configuratiewijzigingen afhandelt. Dit wordt gedaan in het manifest door het toevoegen van het attribuut configChanges="orientation|screenSize|screenLayout" aan de <activity>-tag:
<activity android:name=".MyActivity"
android:configChanges="orientation|screenSize|screenLayout">
</activity>
In dat geval wordt in plaats van het opnieuw creëren van de activiteit, de methode onConfigurationChanged() aangeroepen:
override fun onConfigurationChanged(newConfig: Configuration) {
super.onConfigurationChanged(newConfig)
// Handmatig omgaan met de configuratiewijziging
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
// Logica voor landschaporiëntatie
} else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
// Logica voor portretoriëntatie
}
}
Het gebruik van configChanges wordt niet aanbevolen in de meeste gevallen, omdat het het beheer van de toestand en bronnen bij verschillende configuratiewijzigingen kan bemoeilijken. De aanbevolen aanpak is het gebruik van ViewModel om de statusgegevens op te slaan.