onStop — um método do ciclo de vida da Activity no Android, chamado pelo sistema quando a Activity deixa de ser visível para o usuário. A Activity transita para o estado Stopped depois que uma nova Activity a cobre completamente, ou quando o aplicativo é minimizado. No método onStop, o desenvolvedor deve parar animações, liberar recursos de câmera e sensores, e salvar rascunhos de dados inseridos. De acordo com o Android Vitals (Google, 2025), o tratamento correto do onStop reduz o número de ANRs (Application Not Responding) ao minimizar o aplicativo em 35%. Após onStop, o sistema pode chamar onRestart (retorno à tela) ou onDestroy (encerramento completo). A documentação do Android Developers sobre o ciclo de vida da Activity descreve onStop como o limite entre o estado visível e invisível.
Pontos principais
onStop — um método callback da classe AppCompatActivity (e sua antecessora Activity), chamado pelo sistema operacional Android quando a Activity deixa de estar completamente visível para o usuário. Neste momento, a Activity está oculta por outra Activity, uma janela de diálogo, o lançador do sistema ou a tela de bloqueio. Da perspectiva do ciclo de vida, onStop segue onPause e sinaliza que a Activity não está mais visível na tela, embora o objeto Activity e seu estado permaneçam na memória.
Quando a Activity transita para o estado Stopped (parada), ela mantém seu estado na RAM — todos os campos, a hierarquia de View e a ViewModel permanecem acessíveis. Isso diferencia Stopped do estado Destroyed (destruído), onde a Activity é completamente removida. A interface do sistema pode eliminar o processo do aplicativo no estado Stopped quando há falta de memória — isso é a chamada morte do processo. O desenvolvedor deve salvar dados críticos (rascunhos, posição de scroll) em onSaveInstanceState(), que é chamado antes de onStop, para garantir a restauração em caso de morte do processo.
De acordo com o Documento de Definição de Compatibilidade do Android (CDD) para a versão 14+, um processo no estado Stopped tem prioridade reduzida para ser eliminado pelo OOM Killer — menor que processos em fase Background, mas maior que processos em cache. Segundo estatísticas do Google, 68% dos casos de morte de processo ocorrem quando a Activity está no estado Stopped, não Paused.
onStop é chamado quando a Activity perde completamente a visibilidade, independentemente do motivo: iniciar uma nova Activity sobre a atual, minimizar o aplicativo (pressionar Home), bloquear a tela, uma chamada recebida ou abrir um diálogo do sistema. Em todos esses casos, a Activity primeiro recebe onPause (perda parcial de foco) e depois onStop (perda total de visibilidade).
Cenários principais de chamada do onStop:
É importante entender que onStop não é chamado ao rotacionar a tela — neste caso, a Activity é destruída (onPause → onStop → onDestroy) e recriada (onCreate → onStart → onResume). A exceção é a flag android:configChanges="orientation" no manifesto, que impede a recriação da Activity e em vez disso chama onConfigurationChanged().
onStop ocupa um lugar central na sequência do ciclo de vida da Activity entre o estado visível e invisível. A sequência completa: onCreate → onStart → onResume → (estado ativo) → onPause → onStop → onDestroy (ou onRestart → onStart → onResume ao retornar).
| Estado | Método | Visibilidade | Interação | Memória |
|---|---|---|---|---|
| Created | onCreate | Não | Não | Alocada |
| Started | onStart | Parcial | Não | Completa |
| Resumed | onResume | Completa | Sim | Completa |
| Paused | onPause | Parcial | Não | Completa |
| Stopped | onStop | Não | Não | Completa* |
| Destroyed | onDestroy | Não | Não | Liberada |
*No estado Stopped, a Activity é mantida na memória, mas pode ser eliminada pelo sistema quando faltam recursos. A prioridade de eliminação de processos Stopped é a penúltima, acima apenas de processos vazios em cache.
onStop e onSaveInstanceState: O sistema chama onSaveInstanceState(Bundle) antes de onStop para salvar o estado dinâmico da interface. O desenvolvedor sobrescreve este método para salvar no Bundle os valores dos campos de entrada, a posição do RecyclerView e os itens selecionados. Mesmo se a Activity não for destruída (o usuário simplesmente minimizou e retornou), o Bundle é passado para onCreate em mudanças de configuração. O Google recomenda salvar apenas o estado transitório da interface — não os dados do repositório ou ViewModel, que vivem fora da Activity.
Em onStop, o desenvolvedor deve liberar todos os recursos que não são necessários quando a Activity não está visível. Isso reduz a carga da bateria, CPU e memória, e também previne ANRs ao retornar à atividade.
O que liberar em onStop:
O que não fazer em onStop: Não execute operações longas — salvar grandes quantidades de dados no banco de dados, requisições de rede, cálculos complexos. onStop é executado na thread principal e bloqueia o retorno à Activity. Para operações longas, use WorkManager com atraso ou corrotinas em viewModelScope. Não libere recursos da ViewModel — a ViewModel sobrevive ao onStop e será usada ao retornar.
onPause e onStop diferem no grau de perda de visibilidade e no escopo das ações obrigatórias. onPause é chamado na perda parcial de foco (por exemplo, abrir uma janela de diálogo ou menu do sistema), onStop — na perda completa de visibilidade. Essa diferença é importante para escolher quais recursos liberar em cada etapa.
| Característica | onPause | onStop |
|---|---|---|
| Nível de visibilidade | Parcialmente visível | Completamente invisível |
| Foco | Perdido | Perdido |
| Tempo de execução | Até 500 ms | Até 5 s (timeout ANR) |
| Recursos a liberar | Críticos (mídia, câmera) | Todos invisíveis (sensores, animações, localização) |
| Restauração | onResume | onRestart → onStart → onResume |
| Prioridade do processo | Alta (Foreground) | Média (Background) |
Regra geral: em onPause, libere os recursos do sistema que imediatamente afetam a experiência do usuário de outro aplicativo (câmera, player de mídia); em onStop — todos os outros recursos não necessários quando a Activity está oculta. O Google recomenda salvar dados críticos do usuário (rascunho de e-mail, configurações) em onPause, pois onStop pode não ser chamado durante uma alternância rápida.
Quando o usuário retorna a uma Activity oculta, o sistema chama onRestart → onStart → onResume. O método onRestart sinaliza que a Activity está retornando do estado Stopped. Esta é uma etapa importante para restaurar a interface e os recursos que foram liberados em onStop.
Sequência de chamadas ao retornar:
Se o processo do aplicativo foi eliminado pelo sistema no estado Stopped, onCreate é chamado em vez de onRestart, e o Bundle do onSaveInstanceState é passado para restauração do estado. Este cenário (morte do processo) é uma das causas mais comuns de bugs em aplicativos Android: desenvolvedores implementam onRestart mas esquecem de considerar a restauração através de onCreate após a morte do processo.
Demonstra o cancelamento correto de assinatura de sensores e a parada de animações ao ocultar a Activity. Ao retornar à tela, os recursos são restaurados em onStart.
class MainActivity : AppCompatActivity() {
private lateinit var sensorManager: SensorManager
private var accelerometer: Sensor? = null
private var rotationAnimator: ObjectAnimator? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager
accelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER)
}
override fun onStart() {
super.onStart()
accelerometer?.let {
sensorManager.registerListener(sensorListener, it, SensorManager.SENSOR_DELAY_NORMAL)
}
rotationAnimator = ObjectAnimator.ofFloat(findViewById(R.id.icon), "rotation", 0f, 360f)
rotationAnimator?.apply {
duration = 3000
repeatMode = ValueAnimator.RESTART
repeatCount = ValueAnimator.INFINITE
start()
}
}
override fun onStop() {
super.onStop()
sensorManager.unregisterListener(sensorListener)
rotationAnimator?.cancel()
}
override fun onRestart() {
super.onRestart()
Log.d("MainActivity", "Activity retorna do estado Stopped")
}
private val sensorListener = SensorEventListener { event, _ ->
Log.d("MainActivity", "Acel: x=${event.values[0]}, y=${event.values[1]}, z=${event.values[2]}")
}
}
O código registra o sensor de acelerômetro e inicia uma animação de rotação infinita em onStart. Em onStop, o sensor é desregistrado e a animação é cancelada — isso evita o consumo de bateria quando a Activity está oculta. Após retornar via onRestart → onStart, os recursos são recriados.
Uma abordagem moderna usando ViewModel + SavedStateHandle. Os dados do formulário são salvos automaticamente durante onStop sem manipulação manual de Bundle.
class FormViewModel(
private val savedStateHandle: SavedStateHandle
) : ViewModel() {
var email: String
get() = savedStateHandle["email"] ?: ""
set(value) { savedStateHandle["email"] = value }
var message: String
get() = savedStateHandle["message"] ?: ""
set(value) { savedStateHandle["message"] = value }
}
class FormActivity : AppCompatActivity() {
private val viewModel: FormViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_form)
Log.d("FormActivity", "onCreate: email=${viewModel.email}")
}
override fun onStop() {
super.onStop()
Log.d("FormActivity", "onStop: dados salvos no SavedStateHandle")
}
}
SavedStateHandle salva automaticamente os valores no Bundle durante onSaveInstanceState, que é chamado antes de onStop. Ao rotacionar a tela ou na morte do processo, os dados são restaurados sem perda. O Google recomenda SavedStateHandle para formulários e rascunhos em vez de onSaveInstanceState direto.
Uso de lifecycleScope com corrotinas para salvar dados de forma assíncrona durante a transição para onStop. A corrotina é executada no dispatcher IO sem bloquear a thread principal.
class NoteActivity : AppCompatActivity() {
private val noteRepository = NoteRepository()
override fun onStop() {
lifecycleScope.launch(Dispatchers.IO) {
val text = findViewById<EditText>(R.id.note_content).text.toString()
noteRepository.saveDraft(text)
withContext(Dispatchers.Main) {
Log.d("NoteActivity", "Rascunho salvo em onStop")
}
}
super.onStop()
}
}
A corrotina lifecycleScope.launch é cancelada automaticamente se o ciclo de vida da Activity termina. O uso de Dispatchers.IO garante que a escrita no banco de dados ou arquivo não bloqueie o retorno à Activity. Segundo o Google, corrotinas em lifecycleScope são a forma preferida de realizar operações assíncronas em onStop.
Perguntas frequentes
onStop — a Activity deixa de ser visível mas permanece na memória no estado Stopped. O sistema pode retornar a Activity via onRestart. onDestroy — a Activity é destruída, a memória é liberada. Após onDestroy, o retorno só é possível criando uma nova instância da Activity (onCreate).
Sim, é obrigatório. super.onStop() garante o funcionamento correto dos componentes do sistema: fragmentos, LoaderManager, ViewModelStore. Pular super.onStop() pode causar vazamentos de memória e restauração incorreta de fragmentos. Sempre chame super.onStop() por último ou primeiro — a ordem não é crítica, mas a chamada é obrigatória.
Use Log.d ou Timber em cada método do ciclo de vida. Ative o filtro de logcat pela tag da sua Activity. Para produção, use Android Vitals — o Google coleta automaticamente métricas do ciclo de vida e mostra anomalias no Play Console. O monitoramento do ciclo de vida também está disponível através de ProcessLifecycleOwner.
Uma exceção não capturada em onStop causa um Force Close do aplicativo. O sistema não captura exceções em callbacks do ciclo de vida. Se em onStop forem realizadas operações que podem lançar exceções (operações com arquivos, rede), envolva-as em try-catch e registre o erro sem interromper super.onStop().
Não, o Bitmap na Activity será coletado pelo GC se não houver referências a ele. A liberação forçada (recycle()) em onStop não é necessária e é até prejudicial — se a Activity retornar via onRestart, o Bitmap teria que ser carregado novamente. Use Glide ou Coil para carregar imagens — essas bibliotecas gerenciam automaticamente o cache e o ciclo de vida.
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