onRestart — ουσία, επαναφορά Activity στον κύκλο ζωής

Συγγραφέας: IT Sectr Δημοσιεύτηκε: 2026-03-04 Χρόνος ανάγνωσης: 8 λεπ

onRestart — μέθοδος κύκλου ζωής Activity στο Android, που καλείται από το σύστημα πριν την επιστροφή του Activity από την κατάσταση Stopped στην κατάσταση Started. Το onRestart σηματοδοτεί ότι το Activity, που προηγουμένως ήταν κρυμμένο από άλλη οθόνη ή είχε ελαχιστοποιηθεί στο παρασκήνιο, γίνεται ξανά ορατό στον χρήστη. Στο onRestart ο προγραμματιστής ενημερώνει παλιά δεδομένα, επαναφορτώνει λίστες και επαναφέρει την κατάσταση UI που μπορεί να άλλαξε όσο το Activity ήταν αόρατο. Σύμφωνα με το Google Android Vitals (2025), οι εφαρμογές που χρησιμοποιούν onRestart για ενημέρωση δεδομένων εμφανίζουν 25% λιγότερες περιπτώσεις εσφαλμένης εμφάνισης πληροφοριών κατά την επιστροφή στην οθόνη. Τεκμηρίωση Android Developers περιγράφει το onRestart ως προπαρασκευαστικό στάδιο πριν το Activity εμφανιστεί ξανά στην οθόνη.

Κύρια σημεία

  • onRestart καλείται κατά την επιστροφή του Activity από την κατάσταση Stopped, πριν από onStart και onResume.
  • Το onRestart δεν καλείται κατά την πρώτη δημιουργία του Activity — μόνο κατά την επαναλαμβανόμενη εμφάνιση μετά από απόκρυψη.
  • Κύρια αποστολή του onRestart είναι η ενημέρωση δεδομένων που μπορεί να άλλαξαν όσο το Activity ήταν αόρατο.
  • Το onRestart δεν καλείται σε process death — σε αυτήν την περίπτωση το Activity δημιουργείται ξανά μέσω onCreate.
  • Η σωστή χρήση του onRestart βελτιώνει την εμπειρία χρήστη σε πολλαπλές εργασίες και εναλλαγή μεταξύ εφαρμογών.

onRestart — ουσία της μεθόδου στον κύκλο ζωής Android

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: συνθήκες και σειρά

Το onRestart καλείται μόνο κατά την επιστροφή του Activity από την κατάσταση Stopped, στην οποία εισήλθε το Activity μετά την κλήση του onStop. Παρακάτω αναφέρονται όλα τα σενάρια που οδηγούν σε onRestart.

Σενάρια κλήσης onRestart:

  • Επιστροφή από άλλο Activity — ο χρήστης άνοιξε ένα νέο Activity (π.χ. έκανε κλικ σε ειδοποίηση) και στη συνέχεια επέστρεψε (πάτησε «Πίσω»). Στοίβα: MainActivity.onPause → MainActivity.onStop → SecondActivity δημιουργείται → ο χρήστης πατά «Πίσω» → SecondActivity.onPause → SecondActivity.onStop → SecondActivity.onDestroy → MainActivity.onRestart → MainActivity.onStart → MainActivity.onResume.
  • Επιστροφή από ελαχιστοποίηση — ο χρήστης ελαχιστοποίησε την εφαρμογή (Home) και μετά από λίγο επέστρεψε. CurrentActivity.onPause → CurrentActivity.onStop → (εφαρμογή στο παρασκήνιο) → ο χρήστης επιστρέφει → CurrentActivity.onRestart → CurrentActivity.onStart → CurrentActivity.onResume.
  • Επιστροφή από οθόνη κλειδώματος — η οθόνη κλειδώματος καλύπτει το Activity· μετά το ξεκλείδωμα το Activity λαμβάνει onRestart αν έχει περάσει σημαντικός χρόνος (πάνω από 5 δευτερόλεπτα).
  • Επιστροφή από εφαρμογή που εκκινήθηκε μέσω Intent — κάμερα, γκαλερί, πρόγραμμα περιήγησης — οποιαδήποτε εφαρμογή τρίτου μέρους που εκκινήθηκε μέσω startActivityForResult() ή ActivityResultLauncher.

Πότε ΔΕΝ καλείται το onRestart: κατά περιστροφή οθόνης (το Activity καταστρέφεται και δημιουργείται ξανά μέσω onCreate), κατά επιστροφή από παράθυρο διαλόγου (το Activity δεν πηγαίνει σε onStop, μόνο onPause → onResume), σε process death (το Activity δημιουργείται ξανά).

Διαφορά μεταξύ onRestart και onCreate: τι να επιλέξετε

Το onRestart και το onCreate είναι δύο διαφορετικές προσεγγίσεις για την επαναφορά του Activity. Η επιλογή μεταξύ τους εξαρτάται από το αν το Activity καταστράφηκε πλήρως ή απλώς κρύφτηκε.

ΧαρακτηριστικόonRestartonCreate
Πότε καλείταιΤο 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: ενημέρωση δεδομένων και UI

Το onRestart — ιδανικό μέρος για λειτουργίες που πρέπει να εκτελούνται σε κάθε επιστροφή στην οθόνη, αλλά δεν χρειάζονται στο πρώτο άνοιγμα. Ακολουθούν τυπικά σενάρια:

  • Ενημέρωση λίστας από DB ή API — ο χρήστης πήγε σε άλλο Activity, εκεί άλλαξε δεδομένα, επέστρεψε — η λίστα πρέπει να είναι ενημερωμένη. Καλέστε viewModel.refreshItems() στο onRestart.
  • Έλεγχος εξουσιοδότησης — εάν το Activity ήταν κρυμμένο για μεγάλο χρονικό διάστημα, το διακριτικό πρόσβασης μπορεί να έχει λήξει. Το onRestart είναι το σημείο για έλεγχο εγκυρότητας του διακριτικού και ανακατεύθυνση στην οθόνη σύνδεσης.
  • Συγχρονισμός κατάστασης UI — εναλλαγή θεμάτων, αλλαγή γλώσσας, ενημέρωση ρυθμίσεων — οι αλλαγές πρέπει να εφαρμόζονται κατά την επιστροφή στην οθόνη.
  • Επαναφόρτωση πολυμέσων — εάν το Activity εμφανίζει περιεχόμενο που μπορεί να έχει αλλάξει (ροή ειδήσεων, ισοτιμία νομισμάτων, καιρός), ενημερώστε τα δεδομένα στο onRestart.
  • Έλεγχος σύνδεσης δικτύου — κατά την επιστροφή από λειτουργία εκτός σύνδεσης, το Activity πρέπει να ελέγξει τη διαθεσιμότητα δικτύου και να αλλάξει το UI.
  • Επαναφορά κινούμενων εικόνων — κινούμενες εικόνες που απελευθερώθηκαν στο onStop, επανεκκινήστε στο onRestart πριν από το onStart.

Τι να μην κάνετε στο onRestart: μην αρχικοποιείτε ξανά το View — ζουν επειδή το Activity δεν καταστράφηκε. Μην εγγράφεστε ξανά στο LiveData — η εγγραφή στο onCreate ζει. Μην δημιουργείτε νέα τμήματα — είναι ήδη στο FragmentManager.

onRestart και process death: σημαντική εξαίρεση

Η πιο σημαντική εξαίρεση: το onRestart δεν καλείται εάν η διεργασία της εφαρμογής σκοτώθηκε από το σύστημα. Αυτό είναι το βασικό σημείο που οι προγραμματιστές συχνά παραβλέπουν βασιζόμενοι στο onRestart για επαναφορά κατάστασης.

Σε process death:

  • Η εφαρμογή ήταν στο παρασκήνιο, το Android σκότωσε τη διεργασία για να ελευθερώσει μνήμη.
  • Ο χρήστης επιστρέφει — το σύστημα εκκινεί μια νέα διεργασία.
  • Το Activity δημιουργείται ξανά: onCreate(Bundle) → onStart → onResume.
  • Το onRestart ΔΕΝ καλείται — για το σύστημα αυτή είναι μια νέα παρουσία Activity.

Πώς να προστατευτείτε: αποθηκεύετε πάντα την κρίσιμη κατάσταση στο onSaveInstanceState(Bundle) (καλείται πριν από onStop) ή χρησιμοποιείτε SavedStateHandle στο ViewModel. Στο onCreate ελέγξτε το savedInstanceState: αν δεν είναι null, επαναφέρετε την κατάσταση από το Bundle, αν είναι null — φορτώστε φρέσκα δεδομένα.

Σύμφωνα με το Google Android Vitals, περίπου 7% των επιστροφών σε Activity μετά από παρατεταμένη παραμονή στο παρασκήνιο συμβαίνουν μετά από process death. Αυτό σημαίνει ότι κάθε 15ο Activity που έπρεπε να καλέσει onRestart, στην πραγματικότητα περνά από onCreate. Η αγνόηση αυτού του σεναρίου είναι μία από τις κύριες αιτίες σφαλμάτων «κενή οθόνη μετά από επιστροφή».

Παραδείγματα κώδικα με onRestart σε Kotlin

Παράδειγμα 1: onRestart με ενημέρωση λίστας μέσω ViewModel

Το Activity καλεί viewModel.refreshTasks() στο onRestart για ενημέρωση της λίστας εργασιών μετά από επιστροφή από την οθόνη επεξεργασίας.

kotlin
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.

Παράδειγμα 2: onRestart με έλεγχο εξουσιοδότησης

Το Activity ελέγχει την εγκυρότητα του διακριτικού κατά την επιστροφή και ανακατευθύνει στη σύνδεση εάν χρειάζεται.

kotlin
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, για αποφυγή περιττού ελέγχου κατά επιστροφή από διάλογο.

Παράδειγμα 3: onRestart σε Fragment με ViewLifecycleOwner

Το Fragment χρησιμοποιεί onRestart μέσω LifecycleObserver για ενημέρωση δεδομένων.

kotlin
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).

Συχνές Ερωτήσεις

Σε τι διαφέρει το onRestart από το onResume;

Το onResume καλείται κάθε φορά που το Activity λαμβάνει εστίαση — συμπεριλαμβανομένης της επιστροφής από διάλογο ή μενού συστήματος (το Activity δεν πήγε σε onStop). Το onRestart καλείται μόνο κατά την επιστροφή από την κατάσταση Stopped, όταν το Activity ήταν εντελώς κρυμμένο. Το onRestart είναι πιο περιορισμένο συμβάν για «βαριές» ενημερώσεις, το onResume για ελαφριές λειτουργίες (αλλαγή τίτλου, ενημέρωση ώρας).

Μπορεί το onRestart να κληθεί χωρίς onStop;

Όχι, δεν μπορεί. Το onRestart είναι η ζευγαρωμένη μέθοδος του onStop: το onRestart καλείται μόνο αφού το Activity περάσει από onStop. Εάν το Activity δεν πήγε σε onStop (π.χ. είναι ανοιχτό ένα παράθυρο διαλόγου), τότε κατά την επιστροφή το onRestart δεν καλείται — μόνο onResume.

Πώς να προσομοιώσετε το onRestart στον εξομοιωτή;

Πατήστε Home (κουμπί σπιτιού) στον εξομοιωτή — το Activity θα ελαχιστοποιηθεί, θα λάβει onStop. Στη συνέχεια, ανοίξτε την εφαρμογή μέσω Recent Apps ή του εκκινητή — το Activity θα λάβει onRestart → onStart → onResume. Για εντοπισμό σφαλμάτων χρησιμοποιήστε Debug με σημεία διακοπής στο onRestart ή Log.d με ετικέτα Activity.

Τι συμβαίνει εάν γίνει ρίψη εξαίρεσης στο onRestart;

Μη αναχαιτισμένη εξαίρεση στο onRestart θα προκαλέσει Force Close. Το σύστημα δεν αναχαιτίζει εξαιρέσεις σε callbacks κύκλου ζωής. Εάν στο onRestart εκτελούνται λειτουργίες που μπορεί να ρίξουν εξαίρεση (αίτημα δικτύου χωρίς try-catch, εργασία με null View), τυλίξτε τις σε try-catch.

Χρειάζεται να ελέγξω το isFinishing() στο onRestart;

Όχι. Το onRestart καλείται μόνο για ζωντανά Activity που επιστρέφουν από την κατάσταση Stopped. Το isFinishing() στο onRestart θα είναι πάντα false. Ο έλεγχος isFinishing() έχει νόημα στο onPause (αποθήκευση δεδομένων) και onDestroy (διάκριση αναδημιουργίας από finish()).

Σύνοψη

  • onRestart — μέθοδος κύκλου ζωής που καλείται κατά την επιστροφή του Activity από κατάσταση Stopped, πριν από onStart και onResume.
  • Το onRestart ΔΕΝ καλείται κατά την πρώτη δημιουργία του Activity — μόνο κατά επαναλαμβανόμενη εμφάνιση μετά από πλήρη απόκρυψη.
  • Κύριος σκοπός του onRestart είναι η ενημέρωση παλαιών δεδομένων και ο έλεγχος κατάστασης (διακριτικό, δίκτυο, ρυθμίσεις).
  • Το onRestart δεν καλείται σε process death — χρησιμοποιήστε onCreate με Bundle για επαναφορά μετά τη θανάτωση της διεργασίας.
  • Μην αντιγράφετε τη λογική του onCreate στο onRestart: αρχικοποίηση στο onCreate, ενημέρωση στο onRestart.
  • Για Fragment χρησιμοποιήστε LifecycleObserver στο viewLifecycleOwner αντί να παρακάμψετε το onRestart.
  • Η σωστή υλοποίηση του onRestart βελτιώνει την UX σε πολλαπλές εργασίες και αποτρέπει την εμφάνιση παλαιών δεδομένων.

Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση

Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.

Συζήτηση έργου

Διαβάστε επίσης