onBackPressed() est déprécié : comment gérer correctement le bouton "Retour" sous Android
Si vous avez déjà développé pour Android en Kotlin, vous avez sûrement rencontré la méthode onBackPressed(). Jusqu'à récemment, c'était la méthode standard pour intercepter l'appui sur le bouton système "Retour". Mais dans les dernières versions d'Android Studio, vous remarquerez que cette méthode est barrée et marquée avec l'annotation @Deprecated. Une question légitime se pose : "onBackPressed() is deprecated. What is the alternative?" — cette question a d'ailleurs recueilli des milliers de vues sur Stack Overflow.
Dans cet article, nous allons voir pourquoi Google a décidé d'abandonner l'ancienne approche, et nous montrerons avec des exemples concrets de code en Kotlin comment gérer correctement l'appui sur le bouton "Retour" désormais. Vous découvrirez OnBackPressedDispatcher, OnBackPressedCallback et comment les intégrer avec le cycle de vie d'une Activity et d'un Fragment. C'est parti !
Pourquoi onBackPressed() est-il devenu déprécié ?
La raison principale est l'évolution architecturale d'Android. L'ancienne méthode onBackPressed() était fortement liée à l'Activity. Elle ne prenait pas en compte les Fragments, ne supportait pas les patrons modernes (MVVM, Clean Architecture) et conduisait souvent à des confusions lorsque plusieurs composants tentaient de gérer le même événement. Google a opté pour une approche de délégation : désormais, la gestion du "Retour" est confiée à un dispatcher spécial — OnBackPressedDispatcher.
Ce changement fait partie d'une stratégie plus large visant à simplifier la navigation et à améliorer le support de Jetpack. Vous pouvez désormais ajouter plusieurs callbacks qui fonctionnent de manière cohérente et respectent le cycle de vie. Si vous utilisez le Navigation Component, la gestion du "Retour" est automatiquement déléguée au graphe de navigation.
Ce qui a remplacé : OnBackPressedDispatcher
Depuis Activity 1.0.0 (inclus dans AndroidX), Google a introduit une nouvelle API. Les composants principaux sont :
- OnBackPressedDispatcher — le dispatcher central qui gère tous les callbacks.
- OnBackPressedCallback — la classe que vous étendez pour définir votre propre logique de gestion.
- LifecycleOwner — la liaison avec le cycle de vie (Activity ou Fragment).
Au lieu de redéfinir la méthode de l'Activity, vous enregistrez un callback auprès du dispatcher. Le dispatcher décide lui-même quel callback exécuter en premier (selon le principe LIFO — le dernier ajouté est traité en premier).
Implémentation de base dans une Activity
Commençons par un exemple simple. Supposons que vous souhaitiez afficher une boîte de dialogue de confirmation lors de l'appui sur "Retour", afin que l'utilisateur ne ferme pas accidentellement l'application.
Ancienne méthode (dépréciée) :
// On ne fait plus ça !@Deprecatedoverride fun onBackPressed() { showExitDialog()}Nouvelle méthode avec OnBackPressedDispatcher :
class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main)
// Enregistrement du callback onBackPressedDispatcher.addCallback(this, object : OnBackPressedCallback(true) { override fun handleOnBackPressed() { // Votre logique personnalisée showExitDialog() } }) }
private fun showExitDialog() { AlertDialog.Builder(this) .setTitle("Quitter") .setMessage("Êtes-vous sûr de vouloir quitter ?") .setPositiveButton("Oui") { _, _ -> finish() } .setNegativeButton("Non", null) .show() }}Notez le paramètre true dans le constructeur de OnBackPressedCallback(true). Ce