Sobes.tech
Junior

De ce se recreează activitatea la rotirea ecranului?

sobes.tech AI

Răspuns de la AI

Când ecranul este rotit, configurația dispozitivului se schimbă, de exemplu orientarea. Android răspunde la acest lucru distrugând și recreând activitatea pentru a aplica modificările necesare în resurse, cum ar fi fișierele de layout specifice pentru orientarea portret sau peisaj.

Ciclul de viață al activității la rotire:

  1. onPause()
  2. onStop()
  3. onDestroy()
  4. Sistemul creează o nouă instanță a activității.
  5. onCreate()
  6. onStart()
  7. onResume()

Pentru a salva datele de stare înainte de distrugerea activității, se folosesc:

  • onSaveInstanceState(): salvează date mici într-un Bundle.

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

    Restaurare în onCreate() sau onRestoreInstanceState():

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // ...
        if (savedInstanceState != null) {
            val myValue = savedInstanceState.getString("myKey") // Restaurare date
        }
        // ...
    }
    
  • ViewModel: păstrează datele pe durata întregului ciclu de viață al controlorului UI (Activity/Fragment), chiar și atunci când se schimbă configurația. ViewModel supraviețuiește distrugerii activității și nu își pierde starea.

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

    Utilizare în activitate/fragment:

    class MyActivity : AppCompatActivity() {
        private lateinit var viewModel: MyViewModel
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            viewModel = ViewModelProvider(this).get(MyViewModel::class.java)
            // Acum, viewModel.counter se păstrează la rotire
        }
    }
    
  • Salvarea datelor în SharedPreferences sau într-o bază de date pentru date mai persistente.

Pentru a evita recrearea activității la rotirea ecranului, se poate declara că activitatea gestionează singură schimbările de configurație. Acest lucru se face în manifest, adăugând atributul configChanges="orientation|screenSize|screenLayout" la eticheta <activity>:

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

În acest caz, în loc să fie recreată activitatea, se va apela metoda onConfigurationChanged():

override fun onConfigurationChanged(newConfig: Configuration) {
    super.onConfigurationChanged(newConfig)
    // Gestionare manuală a schimbării de configurație
    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
        // Logică pentru orientare peisaj
    } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
        // Logică pentru orientare portret
    }
}

Utilizarea configChanges nu este recomandată în cele mai multe cazuri, deoarece poate complica gestionarea stării și resurselor în timpul diferitelor schimbări de configurație. Abordarea preferată este utilizarea ViewModel pentru salvarea datelor de stare.