onRestart — μέθοδος κύκλου ζωής Activity στο Android, που καλείται από το σύστημα πριν την επιστροφή του Activity από την κατάσταση Stopped στην κατάσταση Started. Το onRestart σηματοδοτεί ότι το Activity, που προηγουμένως ήταν κρυμμένο από άλλη οθόνη ή είχε ελαχιστοποιηθεί στο παρασκήνιο, γίνεται ξανά ορατό στον χρήστη. Στο onRestart ο προγραμματιστής ενημερώνει παλιά δεδομένα, επαναφορτώνει λίστες και επαναφέρει την κατάσταση UI που μπορεί να άλλαξε όσο το Activity ήταν αόρατο. Σύμφωνα με το Google Android Vitals (2025), οι εφαρμογές που χρησιμοποιούν onRestart για ενημέρωση δεδομένων εμφανίζουν 25% λιγότερες περιπτώσεις εσφαλμένης εμφάνισης πληροφοριών κατά την επιστροφή στην οθόνη. Τεκμηρίωση Android Developers περιγράφει το onRestart ως προπαρασκευαστικό στάδιο πριν το Activity εμφανιστεί ξανά στην οθόνη.
Κύρια σημεία
onRestart — μέθοδος callback που καλεί το Android αυστηρά πριν από το onStart, όταν το Activity επιστρέφει από την αόρατη κατάσταση Stopped πίσω στην ορατή κατάσταση. Αυτή η μέθοδος είναι μοναδική επειδή καλείται μόνο κατά την επαναλαμβανόμενη εμφάνιση του Activity — κατά την πρώτη δημιουργία παρουσίας η σειρά ξεκινά με onCreate, παρακάμπτοντας το onRestart. Πλήρης κύκλος: onCreate → onStart → onResume (πρώτη εκκίνηση) ή onRestart → onStart → onResume (επαναλαμβανόμενη εμφάνιση).
Από την άποψη του συστήματος Android, το onRestart είναι μια βελτιστοποίηση που επιτρέπει στο Activity να προετοιμαστεί για επιστροφή: να ενημερώσει δεδομένα από το αποθετήριο, να συγχρονίσει την κατάσταση UI, να ελέγξει τη σύνδεση δικτύου. Σε αντίθεση με το onResume, το οποίο καλείται κάθε φορά κατά τη λήψη εστίασης (συμπεριλαμβανομένης της επιστροφής από διάλογο ή μενού συστήματος), το onRestart ενεργοποιείται μόνο κατά τον πλήρη κύκλο απόκρυψης-επιστροφής. Αυτό καθιστά το onRestart ιδανικό μέρος για «βαριές» λειτουργίες ενημέρωσης που δεν χρειάζονται σε μερική απώλεια εστίασης.
Σύμφωνα με τις προδιαγραφές του κύκλου ζωής Android Activity, το χρονικό διάστημα μεταξύ onStop και onRestart μπορεί να κυμαίνεται από λίγα δευτερόλεπτα (ο χρήστης άλλαξε γρήγορα) έως αρκετές ώρες (η εφαρμογή ήταν στο παρασκήνιο και ο χρήστης επέστρεψε). Κατά τη διάρκεια αυτού του χρόνου, τα δεδομένα στην απομακρυσμένη πηγή (API, DB) μπορεί να έχουν αλλάξει, γι' αυτό το onRestart είναι το φυσικό σημείο για έλεγχο ενημερότητας.
Το onRestart καλείται μόνο κατά την επιστροφή του Activity από την κατάσταση Stopped, στην οποία εισήλθε το Activity μετά την κλήση του onStop. Παρακάτω αναφέρονται όλα τα σενάρια που οδηγούν σε onRestart.
Σενάρια κλήσης onRestart:
Πότε ΔΕΝ καλείται το onRestart: κατά περιστροφή οθόνης (το Activity καταστρέφεται και δημιουργείται ξανά μέσω onCreate), κατά επιστροφή από παράθυρο διαλόγου (το Activity δεν πηγαίνει σε onStop, μόνο onPause → onResume), σε process death (το Activity δημιουργείται ξανά).
Το onRestart και το onCreate είναι δύο διαφορετικές προσεγγίσεις για την επαναφορά του Activity. Η επιλογή μεταξύ τους εξαρτάται από το αν το Activity καταστράφηκε πλήρως ή απλώς κρύφτηκε.
| Χαρακτηριστικό | onRestart | onCreate |
|---|---|---|
| Πότε καλείται | Το Activity επιστρέφει από Stopped | Το Activity δημιουργείται για πρώτη φορά ή μετά από καταστροφή |
| Κατάσταση αποθηκευμένη | Ναι — ViewModel και πεδία ζουν | Όχι — όλα δημιουργούνται ξανά |
| Bundle | Δεν μεταβιβάζεται | Μεταβιβάζεται (savedInstanceState) |
| Τυπικές ενέργειες | Ενημέρωση δεδομένων, ανανέωση UI | Αρχικοποίηση View, εγγραφή LiveData |
| Συχνότητα κλήσης | Κάθε φορά κατά επιστροφή | Μία φορά ή μετά από καταστροφή |
Κανόνας επιλογής: την αρχικοποίηση View και την εγγραφή σε LiveData/StateFlow κάντε στο onCreate (ή onViewCreated για Fragment). Ενημέρωση δεδομένων, επαναφόρτωση λιστών και έλεγχο κατάστασης — στο onRestart. Εάν τα δεδομένα φορτώνονται μέσω ViewModel, το onRestart μπορεί απλά να καλέσει τη μέθοδο refresh() στο ViewModel και το View θα εγγραφεί στα ενημερωμένα δεδομένα μέσω αντιδραστικής ροής.
Η Google συνιστά: μην αντιγράφετε τη λογική του onCreate στο onRestart. Απομονώστε στο ViewModel τις μεθόδους refresh() που φορτώνουν τρέχοντα δεδομένα και καλέστε τις στο onRestart. Αυτό διατηρεί την καθαρότητα της αρχιτεκτονικής MVVM και εξαλείφει την αντιγραφή κώδικα.
Το onRestart — ιδανικό μέρος για λειτουργίες που πρέπει να εκτελούνται σε κάθε επιστροφή στην οθόνη, αλλά δεν χρειάζονται στο πρώτο άνοιγμα. Ακολουθούν τυπικά σενάρια:
viewModel.refreshItems() στο onRestart.Τι να μην κάνετε στο onRestart: μην αρχικοποιείτε ξανά το View — ζουν επειδή το Activity δεν καταστράφηκε. Μην εγγράφεστε ξανά στο LiveData — η εγγραφή στο onCreate ζει. Μην δημιουργείτε νέα τμήματα — είναι ήδη στο FragmentManager.
Η πιο σημαντική εξαίρεση: το onRestart δεν καλείται εάν η διεργασία της εφαρμογής σκοτώθηκε από το σύστημα. Αυτό είναι το βασικό σημείο που οι προγραμματιστές συχνά παραβλέπουν βασιζόμενοι στο onRestart για επαναφορά κατάστασης.
Σε process death:
Πώς να προστατευτείτε: αποθηκεύετε πάντα την κρίσιμη κατάσταση στο onSaveInstanceState(Bundle) (καλείται πριν από onStop) ή χρησιμοποιείτε SavedStateHandle στο ViewModel. Στο onCreate ελέγξτε το savedInstanceState: αν δεν είναι null, επαναφέρετε την κατάσταση από το Bundle, αν είναι null — φορτώστε φρέσκα δεδομένα.
Σύμφωνα με το Google Android Vitals, περίπου 7% των επιστροφών σε Activity μετά από παρατεταμένη παραμονή στο παρασκήνιο συμβαίνουν μετά από process death. Αυτό σημαίνει ότι κάθε 15ο Activity που έπρεπε να καλέσει onRestart, στην πραγματικότητα περνά από onCreate. Η αγνόηση αυτού του σεναρίου είναι μία από τις κύριες αιτίες σφαλμάτων «κενή οθόνη μετά από επιστροφή».
Το Activity καλεί viewModel.refreshTasks() στο onRestart για ενημέρωση της λίστας εργασιών μετά από επιστροφή από την οθόνη επεξεργασίας.
class TaskListActivity : AppCompatActivity() {
private val viewModel: TaskViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_task_list)
viewModel.tasks.observe(this) { tasks ->
Log.d("TaskList", "Λήφθηκαν ${tasks.size} εργασίες")
}
}
override fun onRestart() {
super.onRestart()
Log.d("TaskList", "onRestart: ενημέρωση λίστας εργασιών")
viewModel.refreshTasks()
}
}
class TaskViewModel : ViewModel() {
private val _tasks = MutableLiveData<List<Task>>()
val tasks: LiveData<List<Task>> get() = _tasks
fun refreshTasks() {
viewModelScope.launch {
_tasks.value = TaskRepository().getAllTasks()
}
}
}
Το ViewModel.refreshTasks() φορτώνει τρέχοντα δεδομένα από το αποθετήριο. Το LiveData ειδοποιεί αυτόματα το Activity για αλλαγή δεδομένων — το UI ενημερώνεται χωρίς επιπλέον κώδικα. Το OnRestart δεν δημιουργεί νέα εγγραφή — είναι ήδη ρυθμισμένη στο onCreate.
Το Activity ελέγχει την εγκυρότητα του διακριτικού κατά την επιστροφή και ανακατευθύνει στη σύνδεση εάν χρειάζεται.
class ProfileActivity : AppCompatActivity() {
private val authManager = AuthManager()
private val launcher = registerForActivityResult(
ActivityResultContracts.StartActivityForResult()
) { Log.d("Profile", "Επιστρέψαμε από την οθόνη σύνδεσης") }
override fun onRestart() {
super.onRestart()
if (!authManager.isTokenValid()) {
Log.d("Profile", "Το διακριτικό έληξε — ανακατεύθυνση στη σύνδεση")
launcher.launch(Intent(this, LoginActivity::class.java))
}
}
}
class AuthManager {
fun isTokenValid(): Boolean {
val expiry = SharedPreferencesManager().getTokenExpiry()
return System.currentTimeMillis() < expiry
}
}
Εάν ο χρήστης ελαχιστοποίησε την εφαρμογή για μεγάλο χρονικό διάστημα και επέστρεψε μετά τη λήξη του διακριτικού, το onRestart θα τον ανακατευθύνει στην οθόνη σύνδεσης. Αυτό αποτρέπει σφάλματα API κατά την προσπάθεια εκτέλεσης αιτήματος με ληγμένο διακριτικό. Σημείωση: έλεγχος στο onRestart, όχι στο onResume, για αποφυγή περιττού ελέγχου κατά επιστροφή από διάλογο.
Το Fragment χρησιμοποιεί onRestart μέσω LifecycleObserver για ενημέρωση δεδομένων.
class FeedFragment : Fragment() {
private val viewModel: FeedViewModel by viewModels()
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
viewLifecycleOwner.lifecycle.addObserver(object : LifecycleObserver {
@OnLifecycleEvent(Lifecycle.Event.ON_RESTART)
fun onRestart() {
Log.d("FeedFragment", "onRestart μέσω LifecycleObserver")
viewModel.refreshFeed()
}
})
}
}
Αντί να παρακάμψετε το onRestart στο Fragment, χρησιμοποιείται LifecycleObserver — μια πιο ευέλικτη προσέγγιση που επιτρέπει την προσθήκη λογικής σε γεγονότα κύκλου ζωής χωρίς κληρονομικότητα. Το ViewLifecycleOwner εγγυάται ότι ο παρατηρητής ζει στο πεδίο του View (δεν επιβιώνει του onDestroyView).
Συχνές Ερωτήσεις
Το onResume καλείται κάθε φορά που το Activity λαμβάνει εστίαση — συμπεριλαμβανομένης της επιστροφής από διάλογο ή μενού συστήματος (το Activity δεν πήγε σε onStop). Το onRestart καλείται μόνο κατά την επιστροφή από την κατάσταση Stopped, όταν το Activity ήταν εντελώς κρυμμένο. Το onRestart είναι πιο περιορισμένο συμβάν για «βαριές» ενημερώσεις, το onResume για ελαφριές λειτουργίες (αλλαγή τίτλου, ενημέρωση ώρας).
Όχι, δεν μπορεί. Το onRestart είναι η ζευγαρωμένη μέθοδος του onStop: το onRestart καλείται μόνο αφού το Activity περάσει από onStop. Εάν το Activity δεν πήγε σε onStop (π.χ. είναι ανοιχτό ένα παράθυρο διαλόγου), τότε κατά την επιστροφή το onRestart δεν καλείται — μόνο onResume.
Πατήστε Home (κουμπί σπιτιού) στον εξομοιωτή — το Activity θα ελαχιστοποιηθεί, θα λάβει onStop. Στη συνέχεια, ανοίξτε την εφαρμογή μέσω Recent Apps ή του εκκινητή — το Activity θα λάβει onRestart → onStart → onResume. Για εντοπισμό σφαλμάτων χρησιμοποιήστε Debug με σημεία διακοπής στο onRestart ή Log.d με ετικέτα Activity.
Μη αναχαιτισμένη εξαίρεση στο onRestart θα προκαλέσει Force Close. Το σύστημα δεν αναχαιτίζει εξαιρέσεις σε callbacks κύκλου ζωής. Εάν στο onRestart εκτελούνται λειτουργίες που μπορεί να ρίξουν εξαίρεση (αίτημα δικτύου χωρίς try-catch, εργασία με null View), τυλίξτε τις σε try-catch.
Όχι. Το onRestart καλείται μόνο για ζωντανά Activity που επιστρέφουν από την κατάσταση Stopped. Το isFinishing() στο onRestart θα είναι πάντα false. Ο έλεγχος isFinishing() έχει νόημα στο onPause (αποθήκευση δεδομένων) και onDestroy (διάκριση αναδημιουργίας από finish()).
Σύνοψη
Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση
Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.
Διαβάστε επίσης