onResume é um método do ciclo de vida do Android que é chamado quando uma Activity ou Fragment vai para o primeiro plano e recebe o foco de entrada. Neste estado, a tela está pronta para interação com o usuário: todos os eventos de toque, pressionamentos de tecla e gestos são direcionados a este componente. onResume é o estado de trabalho de uma Activity, onde o aplicativo passa a maior parte do tempo. É aqui que você abre a câmera, inicia a reprodução de vídeo, começa o reconhecimento de fala e registra ouvintes de sensores que exigem acesso exclusivo. Para mais informações sobre o ciclo de vida completo de uma Activity, leia o artigo Activity Lifecycle.
Pontos principais
onResume — o terceiro método do ciclo de vida de uma Activity, chamado após onStart, que sinaliza que a tela está pronta para interação total com o usuário. Neste momento, a Activity está no topo da pilha de tarefas (back stack), o sistema direciona todos os eventos de entrada para ela, e o aplicativo pode iniciar qualquer operação que exija participação ativa do usuário: chamadas de vídeo, jogos, gravação de áudio, desenho no Canvas.
onResume faz parte do “tempo de vida em primeiro plano” (foreground lifetime) — o intervalo entre onResume e onPause. Este é o período mais ativo de uma Activity, quando o aplicativo consome mais recursos: CPU para processar toques, GPU para renderizar animações, câmera e microfone para captura de vídeo. Entender este nível do ciclo de vida é fundamental para otimizar o consumo de energia — os recursos abertos em onResume devem ser fechados imediatamente em onPause.
De acordo com o Google I/O 2025, o tempo médio que uma Activity passa no estado onResume por sessão é de 2 a 5 minutos para aplicativos de notícias e de 15 a 30 minutos para jogos e mensageiros. Todo o resto do tempo, a Activity está nos estados onPause, onStop ou onDestroy. Isso significa que otimizar especificamente o código onResume proporciona os maiores ganhos em desempenho e duração da bateria.
Em uma Activity, o método onResume é chamado toda vez que a tela recebe o foco de entrada — ao iniciar pela primeira vez, ao retornar de outra Activity, ao fechar um diálogo, ao desbloquear o dispositivo. Este é um método “quente” que pode ser chamado muitas vezes por sessão, e sua implementação deve ser a mais leve possível.
class CameraActivity : AppCompatActivity() {
private var cameraProvider: ProcessCameraProvider? = null
private var preview: Preview? = null
override fun onResume() {
super.onResume()
val cameraProviderFuture = ProcessCameraProvider.getInstance(this)
cameraProviderFuture.addListener({
cameraProvider = cameraProviderFuture.get()
val cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA
preview = Preview.Builder().build().also {
it.setSurfaceProvider(binding?.viewFinder?.surfaceProvider)
}
try {
cameraProvider?.unbindAll()
cameraProvider?.bindToLifecycle(
this, cameraSelector, preview
)
} catch (e: Exception) {
Log.e("Camera", "Failed to bind camera", e)
}
}, ContextCompact.getMainExecutor(this))
}
override fun onPause() {
super.onPause()
cameraProvider?.unbindAll()
preview = null
}
}
O exemplo com CameraX demonstra o uso clássico de onResume/onPause: a câmera é um recurso exclusivo que apenas um aplicativo pode usar por vez. Vincular a câmera ao ciclo de vida através de bindToLifecycle fecha automaticamente a câmera em onPause, mas uma chamada explícita a unbindAll garante a liberação imediata. Isso é especialmente importante ao alternar entre Activities: a câmera deve ser liberada antes que outra Activity tente abri-la.
onResume em um Fragment é chamado depois que a Activity que o contém recebeu onResume. No entanto, devido às particularidades do FragmentManager e ViewPager, o momento da chamada onResume para um Fragment pode ser atrasado em relação à Activity. Por exemplo, um Fragment em um ViewPager com offscreenPageLimit = 1 recebe onResume apenas quando se torna a página atual, não ao iniciar a Activity.
class VideoPlayerFragment : Fragment() {
private var exoPlayer: ExoPlayer? = null
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
exoPlayer = ExoPlayer.Builder(requireContext()).build()
binding?.playerView?.player = exoPlayer
}
override fun onResume() {
super.onResume()
exoPlayer?.play()
if (userVisibleHint) {
startBiometricAuth()
}
}
override fun onPause() {
exoPlayer?.pause()
stopBiometricAuth()
super.onPause()
}
}
A verificação de userVisibleHint em Fragment.onResume é relevante para ViewPager: um Fragment pode receber onResume mas estar oculto por uma página vizinha (por exemplo, durante uma transição animada). Nesses casos, iniciar vídeo ou biometria em onResume sem verificar a visibilidade resultará em comportamento inesperado. A partir do Fragment 1.5.0, recomenda-se usar FragmentTransaction.setMaxLifecycle() para controle preciso do ciclo de vida dos fragmentos no ViewPager2.
Os desenvolvedores frequentemente confundem onStart e onResume, colocando código no método errado. A regra principal: onStart — para recursos que funcionam enquanto visíveis; onResume — para recursos que exigem foco de entrada. Vamos ver cenários específicos e a escolha correta do método.
| Operação | Método | Justificativa |
|---|---|---|
| Assinatura de geolocalização | onStart / onStop | GPS pode funcionar com visibilidade parcial |
| Abrir a câmera | onResume / onPause | Câmera é um recurso exclusivo |
| BroadcastReceiver | onStart / onStop | Eventos do sistema não exigem foco |
| Reprodução de vídeo | onResume / onPause | Vídeo deve estar visível para o usuário |
| Escaneamento Bluetooth | onStart / onStop | Escaneamento pode rodar em segundo plano |
| Gravador de voz (MediaRecorder) | onResume / onPause | Gravação requer UI ativa |
| Ouvintes de sensores | onResume / onPause | Sensores para jogos e gestos |
| Atualização de dados | onStart | Dados atualizados necessários ao aparecer |
Uma regra prática: se uma operação deve ser interrompida quando um diálogo aparecer — use onResume/onPause. Se uma operação pode continuar quando a tela está parcialmente coberta — use onStart/onStop. Por exemplo, um player de vídeo deve pausar o vídeo ao abrir um diálogo (onPause), enquanto a geolocalização pode continuar atualizando (permanece em onStart).
Recursos exclusivos são componentes do dispositivo que podem ser usados por apenas um aplicativo em um determinado momento. Câmera, microfone, saída de vídeo (MediaProjection), adaptador NFC em modo de leitura, dispositivos USB em modo accessory — todos esses recursos devem ser abertos em onResume e liberados em onPause.
MediaRecorder é usado para gravar áudio e vídeo. Solicitações de permissão e preparação do MediaRecorder são feitas em onCreate, enquanto a gravação começa em onResume. Se o usuário mudar para outro aplicativo, onPause pausa a gravação e onResume a retoma. Este é o comportamento padrão para gravadores de voz e aplicativos de gravação de vídeo.
private var mediaRecorder: MediaRecorder? = null
private var isRecording = false
override fun onResume() {
super.onResume()
if (isRecording) {
mediaRecorder?.resume()
}
}
override fun onPause() {
if (isRecording) {
mediaRecorder?.pause()
}
super.onPause()
}
A autenticação biométrica (BiometricPrompt) deve ser chamada apenas quando a Activity está em onResume. Se chamada em onCreate ou onStart, o diálogo de biometria pode aparecer antes que a Activity termine a inicialização, levando a um processamento incorreto do resultado. Chamá-la em onResume garante que a janela de biometria seja exibida no contexto correto.
Vamos ver três padrões comprovados para trabalhar com onResume usados em projetos comerciais: reinício do temporizador de inatividade, atualização de dados visíveis e integração com Jetpack Navigation.
Em aplicativos com dados confidenciais (bancos, registros médicos), onResume é usado para reiniciar o temporizador de logout automático. Se o usuário estiver interagindo ativamente com o aplicativo, onResume é chamado em cada transição de tela e o temporizador é reiniciado. Se o usuário minimizar o aplicativo, onPause para o temporizador, e onResume ao retornar ou o reinicia ou solicita nova autenticação.
Uma lista que deve exibir dados atualizados toda vez que a tela for revisitada é atualizada em onResume. Por exemplo, se o usuário criou uma nova entrada em outra Activity e navegou de volta, onResume recarrega a lista do banco de dados local ou do cache da ViewModel. Isso garante consistência dos dados sem chamadas manuais a notifyDataSetChanged.
override fun onResume() {
super.onResume()
// ActivityResultLauncher retornou um resultado — atualizando a lista
viewModel.refreshList()
// Reinício do temporizador de inatividade
inactivityTimer.reset()
}
No Jetpack Navigation, onResume de um fragment é chamado toda vez que você retorna a ele através da navegação reversa. Esta propriedade é usada para reiniciar o estado da UI: ocultar o teclado, limpar campos de pesquisa, atualizar o título da barra de ferramentas. OnBackPressedCallback combinado com onResume dá controle total sobre a navegação sem duplicação de código.
Perguntas frequentes
onStart — a tela está visível. onResume — a tela está ativa e pronta para interação. Imagine: você está assistindo TV (onStart), mas pega o controle remoto (onResume). A TV está sempre visível, mas a interação só começa com o controle remoto. Se alguém cobrir a TV com uma cortina — a tela deixa de ficar visível (onStop). Se alguém tirar o controle remoto de você — a interação para (onPause), mas a TV ainda está visível.
onResume é chamado toda vez que a Activity recebe o foco de entrada. O mínimo é uma vez (ao iniciar). O máximo depende dos cenários de uso: alternar entre telas, abrir diálogos, bloquear e desbloquear rapidamente o dispositivo — cada um desses cenários chama onResume ao retornar à tela.
A câmera é um recurso exclusivo disponível para apenas um aplicativo por vez. Se você abrir a câmera em onCreate ou onStart, ela permanecerá bloqueada para outros aplicativos mesmo quando seu aplicativo estiver inativo. onResume garante que a câmera esteja aberta apenas quando a Activity está em primeiro plano, e onPause a fecha imediatamente. Este é um padrão de desenvolvimento Android, estabelecido na documentação da CameraX e Camera2 API.
Sim, onResume pode não ocorrer se uma Activity for sobreposta por outra Activity imediatamente após aparecer. Por exemplo, a Activity A inicia a Activity B no método onCreate ou onStart. Neste caso, A recebe onStart → onPause → onStop, pulando onResume. O sistema não chama onResume porque a Activity A nunca recebeu o foco de entrada.
Em onResume, não se deve realizar operações síncronas longas: carregar grandes dados da rede, consultas SQL complexas, processamento de imagens. onResume executa na thread da UI, e qualquer bloqueio maior que 100–200 ms causa atraso na resposta da interface. Todas as operações pesadas devem ser assíncronas — via corrotinas, RxJava ou WorkManager. Também não é recomendado chamar finish() em onResume sem verificar — isso pode levar a um loop infinito de recriação.
Resumo
Vamos desenvolver um aplicativo móvel chave na mão
A IT Sectr cria aplicativos para iOS e Android para startups e empresas desde 2017. Nós vamos aconselhá-lo e propor a melhor solução.
Leia também