Miért újra létrejön az aktivitás a képernyő forgatásakor?
sobes.tech MI
Válasz az MI-től
Amikor a képernyőt elforgatják, a készülék konfigurációja megváltozik, például az orientáció. Az Android erre úgy reagál, hogy megsemmisíti és újra létrehozza az aktivitást, hogy alkalmazza a szükséges változtatásokat a forrásokon, például a layout fájlokon, amelyek portré vagy tájkép orientációhoz kötöttek.
Az aktivitás életciklusa forgatáskor:
onPause()onStop()onDestroy()- A rendszer létrehoz egy új példányt az aktivitásból.
onCreate()onStart()onResume()
Az állapotadatok mentéséhez az aktivitás megsemmisítése előtt használhatók:
-
onSaveInstanceState(): kis adatok mentése egyBundle-be.override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) outState.putString("myKey", "myValue") // Adatok mentése }Visszaállítás az
onCreate()-ben vagy azonRestoreInstanceState()-ben:override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // ... if (savedInstanceState != null) { val myValue = savedInstanceState.getString("myKey") // Adatok visszaállítása } // ... } -
ViewModel: Az adatok megőrzése az UI-vezérlő (Activity/Fragment) életciklusa során, még a konfiguráció változása esetén is. A ViewModel túléli az aktivitás megsemmisítését, és nem veszti el az állapotát.
class MyViewModel : ViewModel() { var counter = 0 }Használat aktivitásban/fragmentben:
class MyActivity : AppCompatActivity() { private lateinit var viewModel: MyViewModel override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) viewModel = ViewModelProvider(this).get(MyViewModel::class.java) // Most a viewModel.counter megmarad a forgatás során } } -
Az adatok mentése SharedPreferences-be vagy adatbázisba, hogy tartósabbak legyenek.
A képernyő forgatásakor az aktivitás újraalkotásának elkerülése érdekében meg lehet határozni, hogy az aktivitás maga kezeli a konfigurációs változásokat. Ez a manifestben történik, a configChanges="orientation|screenSize|screenLayout" attribútum hozzáadásával az <activity> címkéhez:
<activity android:name=".MyActivity"
android:configChanges="orientation|screenSize|screenLayout">
</activity>
Ebben az esetben az aktivitás újraalkotása helyett a onConfigurationChanged() metódus hívódik meg:
override fun onConfigurationChanged(newConfig: Configuration) {
super.onConfigurationChanged(newConfig)
// A konfiguráció változásának manuális kezelése
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
// Tájolás szerinti logika
} else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
// Portré szerinti logika
}
}
A configChanges használata nem ajánlott a legtöbb esetben, mivel bonyolultabbá teheti az állapot és az erőforrások kezelését különböző konfigurációs változások esetén. Az ajánlott megközelítés a ViewModel használata az állapotadatok megőrzésére.