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:
onPause()onStop()onDestroy()- Il sistema crea una nuova istanza dell'attività.
onCreate()onStart()onResume()
Per salvare i dati di stato prima della distruzione dell'attività, si usano:
-
onSaveInstanceState(): salva piccoli dati in unBundle.override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) outState.putString("myKey", "myValue") // Salva i dati }Ripristino in
onCreate()oonRestoreInstanceState():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.