Sobes.tech
Junior

Miks tegevus taaskasutatakse ekraani pööramisel?

sobes.tech AI

Vastus AI-lt

Ekraani pööramisel muutub seadme konfiguratsioon, näiteks orientatsioon. Android reageerib sellele, hävitades ja seejärel uuesti luues tegevuse, et rakendada vajalikud muudatused ressurssides, nagu paigutusfailid, mis on spetsiifilised portree- või maastikuorientatsioonile.

Tegevuse elutsükkel pöörde ajal:

  1. onPause()
  2. onStop()
  3. onDestroy()
  4. Süsteem loob uue tegevuse eksemplari.
  5. onCreate()
  6. onStart()
  7. onResume()

Andmete salvestamiseks enne tegevuse hävitamist kasutatakse:

  • onSaveInstanceState(): salvestab väikeseid andmeid Bundle'i.

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

    Taastamine onCreate() või onRestoreInstanceState():

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // ...
        if (savedInstanceState != null) {
            val myValue = savedInstanceState.getString("myKey") // Andmete taastamine
        }
        // ...
    }
    
  • ViewModel: Salvestab andmeid kogu UI-kontrollija (Activity/Fragment) elutsükli jooksul, isegi konfiguratsiooni muutmisel. ViewModel ellujääb tegevuse hävitamise ja ei kaota oma olekut.

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

    Kasutamine tegevuses/fragmentis:

    class MyActivity : AppCompatActivity() {
        private lateinit var viewModel: MyViewModel
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            viewModel = ViewModelProvider(this).get(MyViewModel::class.java)
            // Nüüd säilib viewModel.counter pöörde ajal
        }
    }
    
  • Andmete salvestamine SharedPreferences või andmebaasi, et tagada pikemaajaline säilitamine.

Et vältida tegevuse uuesti loomist ekraani pööramisel, saab määrata, et tegevus ise käsitleb konfiguratsiooni muutusi. Seda tehakse manifestis, lisades <activity> sildile configChanges="orientation|screenSize|screenLayout" atribuudi:

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

Sellisel juhul, mitte tegevuse uuesti loomise asemel, kutsutakse välja onConfigurationChanged() meetod:

override fun onConfigurationChanged(newConfig: Configuration) {
    super.onConfigurationChanged(newConfig)
    // Konfiguratsiooni muutuste käsitlemine käsitsi
    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
        // Maastiku orientatsiooni loogika
    } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
        // Portree orientatsiooni loogika
    }
}

configChanges kasutamine ei ole soovitatav enamikul juhtudel, kuna see võib põhjustada keerukusi oleku ja ressursside haldamisel erinevate konfiguratsioonimuutuste ajal. Eelistatud lähenemine on kasutada ViewModeli oleku andmete salvestamiseks.