Sobes.tech
Junior

Kāpēc aktivitāte tiek izveidota vēlreiz, pagriežot ekrānu?

sobes.tech AI

Atbilde no AI

Pagriezienu ekrānam mainās ierīces konfigurācija, piemēram, orientācija. Android uz to reaģē, iznīcinot un pēc tam atkārtoti izveidojot aktivitāti, lai piemērotu nepieciešamās izmaiņas resursos, piemēram, layout failos, kas ir specifiski portreta vai ainavas orientācijai.

Aktivitātes dzīves cikls, kad notiek pagrieziens:

  1. onPause()
  2. onStop()
  3. onDestroy()
  4. Sistēma izveido jaunu aktivitātes eksemplāru.
  5. onCreate()
  6. onStart()
  7. onResume()

Lai saglabātu stāvokļa datus pirms aktivitātes iznīcināšanas, tiek izmantoti:

  • onSaveInstanceState(): saglabā nelielus datus Bundle.

    override fun onSaveInstanceState(outState: Bundle) {
        super.onSaveInstanceState(outState)
        outState.putString("myKey", "myValue") // Saglabā datus
    }
    

    Atjaunošana onCreate() vai onRestoreInstanceState():

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // ...
        if (savedInstanceState != null) {
            val myValue = savedInstanceState.getString("myKey") // Atjauno datus
        }
        // ...
    }
    
  • ViewModel: Saglabā datus visa UI kontroliera (Activity/Fragment) dzīves cikla laikā, pat mainoties konfigurācijai. ViewModel izdzīvo aktivitātes iznīcināšanu un nezaudē savu stāvokli.

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

    Izmantošanā 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)
            // Tagad viewModel.counter saglabājas pagrieziena laikā
        }
    }
    
  • Datu saglabāšana SharedPreferences vai datu bāzē, lai nodrošinātu ilgāku saglabāšanu.

Lai izvairītos no aktivitātes atkārtotas izveides ekrāna pagrieziena laikā, var norādīt, ka aktivitāte pati apstrādā konfigurācijas izmaiņas. To veic manifestā, pievienojot configChanges="orientation|screenSize|screenLayout" atribūtu <activity> tagam:

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

Šādā gadījumā, nevis tiks izveidota jauna aktivitāte, tiks izsaukta onConfigurationChanged() metode:

override fun onConfigurationChanged(newConfig: Configuration) {
    super.onConfigurationChanged(newConfig)
    // Konfigurācijas izmaiņu apstrāde manuāli
    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
        // Logika ainavas orientācijai
    } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
        // Logika portreta orientācijai
    }
}

configChanges izmantošana nav ieteicama lielākajā daļā gadījumu, jo tas var radīt grūtības stāvokļa un resursu pārvaldībā dažādu konfigurācijas izmaiņu laikā. Ieteicamā pieeja ir izmantot ViewModel, lai saglabātu stāvokļa datus.