onRestart — une méthode du cycle de vie de l'Activity dans Android, appelée par le système avant que l'Activity ne revienne de l'état Stopped à l'état Started. onRestart signale qu'une Activity, précédemment masquée par un autre écran ou minimisée en arrière-plan, redevient visible pour l'utilisateur. Dans onRestart, le développeur met à jour les données obsolètes, recharge les listes et restaure l'état de l'UI qui a pu changer pendant que l'Activity était invisible. Selon Google Android Vitals (2025), les applications qui utilisent onRestart pour mettre à jour les données présentent 25% de cas en moins d'affichage incorrect d'informations lors du retour à l'écran. Documentation Android Developers décrit onRestart comme une étape préparatoire avant que l'Activity n'apparaisse de nouveau à l'écran.
Points clés
onRestart — une méthode de callback qu'Android appelle strictement avant onStart lorsqu'une Activity revient de l'état invisible Stopped à l'état visible. Cette méthode est unique car elle n'est appelée que lorsque l'Activity est réaffichée — lors de la première création de l'instance, la séquence commence par onCreate, en sautant onRestart. Le cycle complet : onCreate → onStart → onResume (premier lancement) ou onRestart → onStart → onResume (affichage ultérieur).
Du point de vue du système Android, onRestart est une optimisation qui permet à l'Activity de se préparer à son retour : mettre à jour les données du référentiel, synchroniser l'état de l'UI, vérifier la connectivité réseau. Contrairement à onResume, qui est appelé chaque fois que l'Activity obtient le focus (y compris lors du retour d'une boîte de dialogue ou d'un menu système), onRestart n'est déclenché que lors d'un cycle complet de masquage et de retour. Cela fait d'onRestart l'endroit idéal pour les opérations de mise à jour « lourdes » qui ne sont pas nécessaires lors d'une perte partielle de focus.
Selon la spécification du cycle de vie de l'Activity Android, l'intervalle de temps entre onStop et onRestart peut aller de quelques secondes (l'utilisateur a rapidement changé) à plusieurs heures (l'application était en arrière-plan et l'utilisateur est revenu). Pendant ce temps, les données d'une source distante (API, BD) ont pu changer, donc onRestart est un point naturel pour vérifier l'actualité.
onRestart n'est appelé que lorsqu'une Activity revient de l'état Stopped, dans lequel l'Activity est entrée après l'appel de onStop. Voici tous les scénarios qui mènent à onRestart.
Scénarios d'invocation d'onRestart :
Quand onRestart N'est PAS appelé : lors de la rotation de l'écran (l'Activity est détruite et recréée via onCreate), lors du retour d'une boîte de dialogue (l'Activity n'entre pas dans onStop, seulement onPause → onResume), lors de la mort du processus (l'Activity est recréée).
onRestart et onCreate sont deux approches différentes pour restaurer une Activity. Le choix entre eux dépend si l'Activity a été complètement détruite ou simplement masquée.
| Caractéristique | onRestart | onCreate |
|---|---|---|
| Quand il est appelé | L'Activity revient de Stopped | L'Activity est créée pour la première fois ou après destruction |
| État préservé | Oui — ViewModel et champs sont vivants | Non — tout est recréé |
| Bundle | Non passé | Passé (savedInstanceState) |
| Actions typiques | Mise à jour des données, rafraîchissement de l'UI | Initialisation de la View, abonnement LiveData |
| Fréquence d'appel | Chaque fois au retour | Une fois ou après destruction |
Règle de sélection : effectuez l'initialisation de la View et l'abonnement LiveData/StateFlow dans onCreate (ou onViewCreated pour Fragment). Les mises à jour de données, le rechargement de listes et les vérifications d'état — dans onRestart. Si les données sont chargées via ViewModel, onRestart peut simplement appeler la méthode refresh() sur le ViewModel, et la View s'abonnera aux données mises à jour via un flux réactif.
Google recommande : ne dupliquez pas la logique d'onCreate dans onRestart. Extrayez les méthodes refresh() dans ViewModel qui chargent les données actuelles, et appelez-les dans onRestart. Cela préserve une architecture MVVM propre et élimine la duplication de code.
onRestart est l'endroit idéal pour les opérations qui doivent être effectuées chaque fois que l'écran est réaffiché, mais qui ne sont pas nécessaires lors de la première ouverture. Voici des scénarios typiques :
viewModel.refreshItems() dans onRestart.Ce qu'il ne faut PAS faire dans onRestart : ne réinitialisez pas les Views — elles sont vivantes car l'Activity n'a pas été détruite. Ne vous réabonnez pas à LiveData — l'abonnement dans onCreate est toujours actif. Ne créez pas de nouveaux Fragments — ils sont déjà dans le FragmentManager.
L'exception la plus importante : onRestart n'est pas appelé si le processus de l'application a été tué par le système. C'est un point clé que les développeurs oublient souvent lorsqu'ils comptent sur onRestart pour la restauration d'état.
Lors de la mort du processus :
Comment s'en protéger : sauvegardez toujours l'état critique dans onSaveInstanceState(Bundle) (appelé avant onStop) ou utilisez SavedStateHandle dans ViewModel. Dans onCreate, vérifiez savedInstanceState : s'il n'est pas null, restaurez l'état depuis Bundle ; s'il est null, chargez de nouvelles données.
Selon Google Android Vitals, environ 7% des retours à une Activity après un long séjour en arrière-plan se produisent après une mort du processus. Cela signifie qu'une Activity sur 15 qui aurait dû appeler onRestart passe en réalité par onCreate. Ignorer ce scénario est l'une des principales causes de bugs d'« écran vide après le retour ».
L'Activity appelle viewModel.refreshTasks() dans onRestart pour mettre à jour la liste des tâches après être revenue de l'écran d'édition.
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} tâches reçues")
}
}
override fun onRestart() {
super.onRestart()
Log.d("TaskList", "onRestart: mise à jour de la liste des tâches")
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() charge les données actuelles depuis le référentiel. LiveData notifie automatiquement l'Activity des changements de données — l'UI se met à jour sans code supplémentaire. onRestart ne crée pas un nouvel abonnement — il a déjà été configuré dans onCreate.
L'Activity vérifie la validité du jeton au retour et redirige vers la connexion si nécessaire.
class ProfileActivity : AppCompatActivity() {
private val authManager = AuthManager()
private val launcher = registerForActivityResult(
ActivityResultContracts.StartActivityForResult()
) { Log.d("Profile", "Revenu de l'écran de connexion") }
override fun onRestart() {
super.onRestart()
if (!authManager.isTokenValid()) {
Log.d("Profile", "Token expiré — redirection vers la connexion")
launcher.launch(Intent(this, LoginActivity::class.java))
}
}
}
class AuthManager {
fun isTokenValid(): Boolean {
val expiry = SharedPreferencesManager().getTokenExpiry()
return System.currentTimeMillis() < expiry
}
}
Si l'utilisateur a minimisé l'application pendant une longue période et est revenu après l'expiration du jeton, onRestart le redirigera vers l'écran de connexion. Cela évite les erreurs d'API lors de la tentative d'exécution d'une requête avec un jeton expiré. Remarque : la vérification est dans onRestart, pas dans onResume, pour éviter une vérification inutile lors du retour d'une boîte de dialogue.
Le Fragment utilise onRestart via LifecycleObserver pour mettre à jour les données.
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 via LifecycleObserver")
viewModel.refreshFeed()
}
})
}
}
Au lieu de redéfinir onRestart dans Fragment, on utilise LifecycleObserver — une approche plus flexible permettant d'ajouter une logique d'événements de cycle de vie sans héritage. ViewLifecycleOwner garantit que l'observer vit dans la portée de la View (il ne survit pas à onDestroyView).
Questions fréquentes
onResume est appelé chaque fois que l'Activity obtient le focus — y compris lors du retour d'une boîte de dialogue ou d'un menu système (l'Activity n'est pas entrée dans onStop). onRestart n'est appelé que lors du retour de l'état Stopped, lorsque l'Activity était complètement masquée. onRestart est un événement plus spécifique pour les mises à jour « lourdes », tandis qu'onResume est pour les opérations légères (changement de titre, mise à jour de l'heure).
Non, il ne le peut pas. onRestart est une méthode jumelée avec onStop : onRestart n'est appelé qu'après que l'Activity a traversé onStop. Si l'Activity n'est pas entrée dans onStop (par exemple, une boîte de dialogue a été ouverte), alors au retour onRestart n'est pas appelé — seulement onResume.
Appuyez sur Home (bouton d'accueil) dans l'émulateur — l'Activity sera minimisée et recevra onStop. Ensuite, ouvrez l'application via les applications récentes ou le lanceur — l'Activity recevra onRestart → onStart → onResume. Pour le débogage, utilisez Debug avec des points d'arrêt dans onRestart ou Log.d avec le tag de l'Activity.
Une exception non interceptée dans onRestart provoquera un Force Close. Le système n'intercepte pas les exceptions dans les callbacks du cycle de vie. Si onRestart effectue des opérations qui pourraient lever une exception (requête réseau sans try-catch, travail avec une View null), enveloppez-les dans try-catch.
Non. onRestart n'est appelé que pour les Activities vivantes qui reviennent de l'état Stopped. isFinishing() dans onRestart sera toujours false. Vérifier isFinishing() a du sens dans onPause (sauvegarde de données) et onDestroy (distinguer recréation de fin).
Résumé
Nous développerons une application mobile clé en main
IT Sectr crée des applications iOS et Android pour les startups et les entreprises depuis 2017. Nous vous conseillerons et vous proposerons la meilleure solution.
Lisez aussi