onRestart — un metodo del ciclo di vita dell'Activity in Android, chiamato dal sistema prima che l'Activity torni dallo stato Stopped allo stato Started. onRestart segnala che un'Activity, precedentemente nascosta da un'altra schermata o minimizzata in background, sta diventando di nuovo visibile all'utente. In onRestart, lo sviluppatore aggiorna i dati obsoleti, ricarica le liste e ripristina lo stato dell'UI che potrebbe essere cambiato mentre l'Activity era invisibile. Secondo Google Android Vitals (2025), le app che utilizzano onRestart per aggiornare i dati mostrano 25% in meno di casi di visualizzazione errata delle informazioni al ritorno alla schermata. Documentazione Android Developers descrive onRestart come un passaggio preparatorio prima che l'Activity riappaia sullo schermo.
Punti chiave
onRestart — un metodo di callback che Android chiama rigorosamente prima di onStart quando un'Activity torna dallo stato invisibile Stopped a essere visibile. Questo metodo è unico perché viene chiamato solo quando l'Activity viene mostrata di nuovo — durante la prima creazione dell'istanza, la sequenza inizia con onCreate, saltando onRestart. Il ciclo completo: onCreate → onStart → onResume (primo avvio) o onRestart → onStart → onResume (visualizzazione successiva).
Dal punto di vista del sistema Android, onRestart è un'ottimizzazione che consente all'Activity di prepararsi al suo ritorno: aggiornare i dati dal repository, sincronizzare lo stato dell'UI, verificare la connettività di rete. A differenza di onResume, che viene chiamato ogni volta che l'Activity ottiene il focus (incluso quando si torna da un dialogo o menu di sistema), onRestart viene attivato solo durante un ciclo completo di occultamento e ritorno. Questo rende onRestart il luogo ideale per operazioni di aggiornamento “pesanti” che non sono necessarie durante una perdita parziale di focus.
Secondo la specifica del ciclo di vita dell'Activity Android, l'intervallo di tempo tra onStop e onRestart può variare da pochi secondi (l'utente ha cambiato rapidamente) a diverse ore (l'app era in background e l'utente è tornato). Durante questo periodo, i dati in una fonte remota (API, DB) potrebbero essere cambiati, quindi onRestart è un punto naturale per verificare l'attualità.
onRestart viene chiamato solo quando un'Activity torna dallo stato Stopped, in cui l'Activity è entrata dopo che onStop è stato chiamato. Di seguito sono elencati tutti gli scenari che portano a onRestart.
Scenari di invocazione di onRestart:
Quando onRestart NON viene chiamato: durante la rotazione dello schermo (l'Activity viene distrutta e ricreata tramite onCreate), quando si torna da una finestra di dialogo (l'Activity non entra in onStop, solo onPause → onResume), durante la morte del processo (l'Activity viene ricreata).
onRestart e onCreate sono due approcci diversi per ripristinare un'Activity. La scelta tra di essi dipende dal fatto che l'Activity sia stata completamente distrutta o semplicemente nascosta.
| Caratteristica | onRestart | onCreate |
|---|---|---|
| Quando viene chiamato | L'Activity torna da Stopped | L'Activity viene creata per la prima volta o dopo essere stata distrutta |
| Stato preservato | Sì — ViewModel e campi sono vivi | No — tutto viene creato di nuovo |
| Bundle | Non passato | Passato (savedInstanceState) |
| Azioni tipiche | Aggiornamento dati, refresh UI | Inizializzazione View, sottoscrizione LiveData |
| Frequenza di chiamata | Ogni volta al ritorno | Una volta o dopo la distruzione |
Regola di selezione: esegui l'inizializzazione della View e la sottoscrizione a LiveData/StateFlow in onCreate (o onViewCreated per Fragment). Aggiornamenti dati, ricaricamento liste e controlli di stato — in onRestart. Se i dati vengono caricati tramite ViewModel, onRestart può semplicemente chiamare il metodo refresh() sul ViewModel, e la View si sottoscriverà ai dati aggiornati attraverso un flusso reattivo.
Google raccomanda: non duplicare la logica di onCreate in onRestart. Estrai i metodi refresh() in ViewModel che caricano i dati correnti e chiamali in onRestart. Questo preserva un'architettura MVVM pulita ed elimina la duplicazione del codice.
onRestart è il luogo ideale per le operazioni che dovrebbero essere eseguite ogni volta che si torna alla schermata, ma non sono necessarie alla prima apertura. Ecco gli scenari tipici:
viewModel.refreshItems() in onRestart.Cosa NON fare in onRestart: non reinizializzare le View — sono vive perché l'Activity non è stata distrutta. Non ri-sottoscriverti a LiveData — la sottoscrizione in onCreate è ancora viva. Non creare nuovi Fragment — sono già nel FragmentManager.
L'eccezione più importante: onRestart non viene chiamato se il processo dell'app è stato ucciso dal sistema. Questo è un punto chiave che gli sviluppatori spesso trascurano quando fanno affidamento su onRestart per il ripristino dello stato.
Durante la morte del processo:
Come proteggersi: salva sempre lo stato critico in onSaveInstanceState(Bundle) (chiamato prima di onStop) o usa SavedStateHandle in ViewModel. In onCreate, controlla savedInstanceState: se non è null, ripristina lo stato dal Bundle; se è null, carica dati freschi.
Secondo Google Android Vitals, circa il 7% dei ritorni a un'Activity dopo un lungo periodo in background avviene dopo la morte del processo. Ciò significa che ogni 15ª Activity che avrebbe dovuto chiamare onRestart, in realtà passa attraverso onCreate. Ignorare questo scenario è una delle cause principali di bug di “schermata vuota dopo il ritorno”.
L'Activity chiama viewModel.refreshTasks() in onRestart per aggiornare la lista dei compiti dopo essere tornata dalla schermata di modifica.
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", "Ricevuti ${tasks.size} compiti")
}
}
override fun onRestart() {
super.onRestart()
Log.d("TaskList", "onRestart: aggiornamento elenco compiti")
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() carica i dati correnti dal repository. LiveData notifica automaticamente l'Activity dei cambiamenti dei dati — l'UI si aggiorna senza codice aggiuntivo. onRestart non crea una nuova sottoscrizione — è già stata impostata in onCreate.
L'Activity controlla la validità del token al ritorno e reindirizza al login se necessario.
class ProfileActivity : AppCompatActivity() {
private val authManager = AuthManager()
private val launcher = registerForActivityResult(
ActivityResultContracts.StartActivityForResult()
) { Log.d("Profile", "Ritornato dalla schermata di login") }
override fun onRestart() {
super.onRestart()
if (!authManager.isTokenValid()) {
Log.d("Profile", "Token scaduto — reindirizzamento al login")
launcher.launch(Intent(this, LoginActivity::class.java))
}
}
}
class AuthManager {
fun isTokenValid(): Boolean {
val expiry = SharedPreferencesManager().getTokenExpiry()
return System.currentTimeMillis() < expiry
}
}
Se l'utente ha minimizzato l'app per molto tempo ed è tornato dopo la scadenza del token, onRestart lo reindirizzerà alla schermata di login. Questo previene errori API quando si tenta di effettuare una richiesta con un token scaduto. Nota: il controllo è in onRestart, non in onResume, per evitare un controllo non necessario quando si torna da un dialogo.
Il Fragment utilizza onRestart tramite LifecycleObserver per aggiornare i dati.
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 tramite LifecycleObserver")
viewModel.refreshFeed()
}
})
}
}
Invece di sovrascrivere onRestart in Fragment, si utilizza LifecycleObserver — un approccio più flessibile che consente di aggiungere logica agli eventi del ciclo di vita senza ereditarietà. ViewLifecycleOwner garantisce che l'observer viva nell'ambito della View (non sopravvive a onDestroyView).
Domande frequenti
onResume viene chiamato ogni volta che l'Activity ottiene il focus — incluso quando si torna da un dialogo o menu di sistema (l'Activity non è entrata in onStop). onRestart viene chiamato solo quando si torna dallo stato Stopped, quando l'Activity era completamente nascosta. onRestart è un evento più specifico per aggiornamenti “pesanti”, mentre onResume è per operazioni leggere (cambio del titolo, aggiornamento dell'ora).
No, non può. onRestart è un metodo accoppiato con onStop: onRestart viene chiamato solo dopo che l'Activity ha attraversato onStop. Se l'Activity non è entrata in onStop (ad esempio, è stata aperta una finestra di dialogo), allora al ritorno onRestart non viene chiamato — solo onResume.
Premere Home (pulsante home) nell'emulatore — l'Activity verrà minimizzata e riceverà onStop. Quindi aprire l'app tramite App recenti o il launcher — l'Activity riceverà onRestart → onStart → onResume. Per il debug, utilizzare Debug con punti di interruzione in onRestart o Log.d con il tag dell'Activity.
Un'eccezione non catturata in onRestart causerà un Force Close. Il sistema non cattura le eccezioni nei callback del ciclo di vita. Se in onRestart vengono eseguite operazioni che potrebbero lanciare un'eccezione (richiesta di rete senza try-catch, lavoro con una View null), racchiuderle in try-catch.
No. onRestart viene chiamato solo per Activity vive che stanno tornando dallo stato Stopped. isFinishing() in onRestart sarà sempre false. Controllare isFinishing() ha senso in onPause (salvare dati) e onDestroy (distinguere ricreazione da chiusura).
Riepilogo
Svilupperemo un'applicazione mobile chiavi in mano
IT Sectr crea applicazioni iOS e Android per startup e aziende dal 2017. Ti consulteremo e ti proporremo la soluzione migliore.
Leggi anche