Sobes.tech
Junior

Perché l'attività viene ricreata quando si ruota lo schermo?

sobes.tech AI

Risposta dell'AI

Quando si ruota lo schermo, la configurazione del dispositivo cambia, ad esempio l'orientamento. Android risponde distruggendo e ricreando l'attività per applicare le modifiche necessarie alle risorse, come i file di layout specifici per orientamenti portrait o landscape.

Ciclo di vita dell'attività durante la rotazione:

  1. onPause()
  2. onStop()
  3. onDestroy()
  4. Il sistema crea una nuova istanza dell'attività.
  5. onCreate()
  6. onStart()
  7. onResume()

Per salvare i dati di stato prima della distruzione dell'attività, si usano:

  • onSaveInstanceState(): salva piccoli dati in un Bundle.

    override fun onSaveInstanceState(outState: Bundle) {
        super.onSaveInstanceState(outState)
        outState.putString("myKey", "myValue") // Salva i dati
    }
    

    Ripristino in onCreate() o onRestoreInstanceState():

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // ...
        if (savedInstanceState != null) {
            val myValue = savedInstanceState.getString("myKey") // Ripristina i dati
        }
        // ...
    }
    
  • ViewModel: conserva i dati durante tutto il ciclo di vita del controllore UI (Activity/Fragment), anche quando cambia la configurazione. Il ViewModel sopravvive alla distruzione dell'attività e non perde il suo stato.

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

    Uso nell'attività/fragment:

    class MyActivity : AppCompatActivity() {
        private lateinit var viewModel: MyViewModel
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            viewModel = ViewModelProvider(this).get(MyViewModel::class.java)
            // Ora viewModel.counter si mantiene durante la rotazione
        }
    }
    
  • Salvataggio dei dati in SharedPreferences o in un database per dati più persistenti.

Per evitare la ricreazione dell'attività durante la rotazione dello schermo, si può dichiarare che l'attività gestisce autonomamente i cambiamenti di configurazione. Questo si fa nel manifesto, aggiungendo l'attributo configChanges="orientation|screenSize|screenLayout" al tag <activity>:

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

In questo caso, invece di ricreare l'attività, verrà chiamato il metodo onConfigurationChanged():

override fun onConfigurationChanged(newConfig: Configuration) {
    super.onConfigurationChanged(newConfig)
    // Gestione manuale del cambiamento di configurazione
    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
        // Logica per orientamento landscape
    } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
        // Logica per orientamento portrait
    }
}

L'uso di configChanges non è raccomandato nella maggior parte dei casi, poiché può complicare la gestione dello stato e delle risorse durante i vari cambiamenti di configurazione. L'approccio preferito è usare ViewModel per salvare i dati di stato.