Γιατί δημιουργείται ξανά η δραστηριότητα κατά την περιστροφή της οθόνης;
sobes.tech AI
Απάντηση από AI
Όταν περιστρέφεται η οθόνη, αλλάζει η διαμόρφωση της συσκευής, όπως η προσανατολισμός. Το Android αντιδρά σε αυτό καταστρέφοντας και δημιουργώντας ξανά τη δραστηριότητα, ώστε να εφαρμοστούν οι απαραίτητες αλλαγές στους πόρους, όπως αρχεία layout, που είναι συγκεκριμένα για κάθε προσανατολισμό (προσωπικό ή τοπίο).
Ο κύκλος ζωής της δραστηριότητας κατά την περιστροφή:
onPause()onStop()onDestroy()- Το σύστημα δημιουργεί ένα νέο αντίγραφο της δραστηριότητας.
onCreate()onStart()onResume()
Για την αποθήκευση δεδομένων κατάστασης πριν από την καταστροφή της δραστηριότητας, χρησιμοποιούνται:
-
onSaveInstanceState(): αποθηκεύει μικρά δεδομένα σε έναBundle.override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) outState.putString("myKey", "myValue") // Αποθήκευση δεδομένων }Ανάκτηση στο
onCreate()ήonRestoreInstanceState():override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // ... if (savedInstanceState != null) { val myValue = savedInstanceState.getString("myKey") // Ανάκτηση δεδομένων } // ... } -
ViewModel: Διατηρεί δεδομένα καθ' όλη τη διάρκεια του κύκλου ζωής του UI-ελεγκτή (Activity/Fragment), ακόμα και κατά την αλλαγή διαμόρφωσης. Το ViewModel επιβιώνει την καταστροφή της δραστηριότητας και δεν χάνει την κατάσταση του.
class MyViewModel : ViewModel() { var counter = 0 }Χρήση σε δραστηριότητα/fragment:
class MyActivity : AppCompatActivity() { private lateinit var viewModel: MyViewModel override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) viewModel = ViewModelProvider(this).get(MyViewModel::class.java) // Τώρα το viewModel.counter διατηρείται κατά την περιστροφή } } -
Αποθήκευση δεδομένων σε SharedPreferences ή βάση δεδομένων για πιο μόνιμα δεδομένα.
Για να αποφύγετε την αναδημιουργία της δραστηριότητας κατά την περιστροφή της οθόνης, μπορείτε να δηλώσετε ότι η δραστηριότητα χειρίζεται η ίδια τις αλλαγές διαμόρφωσης. Αυτό γίνεται στο manifest, προσθέτοντας το configChanges="orientation|screenSize|screenLayout" στο στοιχείο <activity>:
<activity android:name=".MyActivity"
android:configChanges="orientation|screenSize|screenLayout">
</activity>
Σε αυτή την περίπτωση, αντί για αναδημιουργία της δραστηριότητας, θα καλείται η μέθοδος onConfigurationChanged():
override fun onConfigurationChanged(newConfig: Configuration) {
super.onConfigurationChanged(newConfig)
// Χειρισμός αλλαγής διαμόρφωσης χειροκίνητα
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
// Λογική για τοπίο
} else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
// Λογική για πορτρέτο
}
}
Η χρήση του configChanges δεν συνιστάται σε πολλές περιπτώσεις, καθώς μπορεί να οδηγήσει σε δυσκολίες στη διαχείριση της κατάστασης και των πόρων κατά τις διάφορες αλλαγές διαμόρφωσης. Η προτιμώμενη προσέγγιση είναι η χρήση του ViewModel για την αποθήκευση δεδομένων κατάστασης.