Sobes.tech
Junior

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:

  1. onPause()
  2. onStop()
  3. onDestroy()
  4. A rendszer létrehoz egy új példányt az aktivitásból.
  5. onCreate()
  6. onStart()
  7. onResume()

Az állapotadatok mentéséhez az aktivitás megsemmisítése előtt használhatók:

  • onSaveInstanceState(): kis adatok mentése egy Bundle-be.

    override fun onSaveInstanceState(outState: Bundle) {
        super.onSaveInstanceState(outState)
        outState.putString("myKey", "myValue") // Adatok mentése
    }
    

    Visszaállítás az onCreate()-ben vagy az onRestoreInstanceState()-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.