onBackPressed() obsoleto: como processar corretamente o botão "Voltar" no Android
Se você já escreveu para Android em Kotlin, certamente já se deparou com o método onBackPressed(). Até recentemente, essa era a forma padrão de interceptar o pressionamento do botão "Voltar" do sistema. Mas nas versões mais recentes do Android Studio, você notará que este método está riscado e marcado com a anotação @Deprecated. Surge a pergunta natural: "onBackPressed() is deprecated. What is the alternative?" — exatamente esta pergunta acumulou milhares de visualizações no Stack Overflow.
Neste artigo, vamos explicar por que o Google decidiu abandonar a abordagem antiga e mostrar, com exemplos reais de código em Kotlin, como processar corretamente o pressionamento do botão "Voltar" agora. Você aprenderá sobre OnBackPressedDispatcher, OnBackPressedCallback e como integrar isso com o ciclo de vida da Activity e do Fragment. Vamos lá!
Por que onBackPressed() se tornou obsoleto?
O principal motivo é a evolução arquitetural do Android. O método antigo onBackPressed() era rigidamente vinculado à Activity. Ele não considerava fragments, não suportava padrões modernos (MVVM, Clean Architecture) e frequentemente causava confusão quando vários componentes tentavam processar o mesmo evento. Google seguiu o caminho da delegação: agora o processamento do "Voltar" é passado para um despachante especial — OnBackPressedDispatcher.
Essa mudança faz parte de uma estratégia mais ampla para simplificar a navegação e melhorar o suporte ao Jetpack. Agora você pode adicionar vários callbacks que funcionam de forma consistente e consideram o ciclo de vida. Se você usa o Navigation Component, o processamento do "Voltar" é automaticamente delegado ao grafo de navegação.
O que veio para substituir: OnBackPressedDispatcher
A partir do Activity 1.0.0 (parte do AndroidX), o Google apresentou uma nova API. Os componentes principais são:
- OnBackPressedDispatcher — despachante central que gerencia todos os callbacks.
- OnBackPressedCallback — classe que você herda para definir sua própria lógica de processamento.
- LifecycleOwner — vinculação ao ciclo de vida (Activity ou Fragment).
Em vez de sobrescrever o método da Activity, você registra um callback no despachante. O despachante decide qual callback executar primeiro (pelo princípio LIFO — o último adicionado é processado primeiro).
Implementação básica na Activity
Vamos começar com um exemplo simples. Suponha que você queira mostrar um diálogo de confirmação ao pressionar "Voltar", para que o usuário não feche o aplicativo acidentalmente.
Forma antiga (obsoleta):
// Não fazemos mais assim!@Deprecatedoverride fun onBackPressed() { showExitDialog()}Nova forma com OnBackPressedDispatcher:
class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main)
// Registra o callback onBackPressedDispatcher.addCallback(this, object : OnBackPressedCallback(true) { override fun handleOnBackPressed() { // Sua lógica personalizada showExitDialog() } }) }
private fun showExitDialog() { AlertDialog.Builder(this) .setTitle("Sair") .setMessage("Tem certeza de que deseja sair?") .setPositiveButton("Sim") { _, _ -> finish() } .setNegativeButton("Não", null) .show() }}Observe o parâmetro true no construtor OnBackPressedCallback(true). Isso é