Sobes.tech
Junior

Γιατί δημιουργείται ξανά η δραστηριότητα κατά την περιστροφή της οθόνης;

sobes.tech AI

Απάντηση από AI

Όταν περιστρέφεται η οθόνη, αλλάζει η διαμόρφωση της συσκευής, όπως η προσανατολισμός. Το Android αντιδρά σε αυτό καταστρέφοντας και δημιουργώντας ξανά τη δραστηριότητα, ώστε να εφαρμοστούν οι απαραίτητες αλλαγές στους πόρους, όπως αρχεία layout, που είναι συγκεκριμένα για κάθε προσανατολισμό (προσωπικό ή τοπίο).

Ο κύκλος ζωής της δραστηριότητας κατά την περιστροφή:

  1. onPause()
  2. onStop()
  3. onDestroy()
  4. Το σύστημα δημιουργεί ένα νέο αντίγραφο της δραστηριότητας.
  5. onCreate()
  6. onStart()
  7. 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 για την αποθήκευση δεδομένων κατάστασης.