onRestart — um método do ciclo de vida da Activity no Android, chamado pelo sistema antes de a Activity retornar do estado Stopped para o estado Started. onRestart sinaliza que uma Activity, anteriormente oculta por outra tela ou minimizada para o fundo, está se tornando visível novamente para o usuário. No onRestart, o desenvolvedor atualiza dados obsoletos, recarrega listas e restaura o estado da UI que pode ter mudado enquanto a Activity estava invisível. De acordo com o Google Android Vitals (2025), aplicativos que usam onRestart para atualizar dados mostram 25% menos casos de exibição incorreta de informações ao retornar à tela. Documentação do Android Developers descreve onRestart como uma etapa preparatória antes de a Activity aparecer novamente na tela.
Principais conclusões
onRestart — um método de callback que o Android chama estritamente antes de onStart quando uma Activity retorna do estado invisível Stopped para se tornar visível. Este método é único porque só é chamado quando a Activity é exibida novamente — durante a primeira criação da instância, a sequência começa com onCreate, pulando onRestart. O ciclo completo: onCreate → onStart → onResume (primeira inicialização) ou onRestart → onStart → onResume (exibição subsequente).
Da perspectiva do sistema Android, onRestart é uma otimização que permite que a Activity se prepare para seu retorno: atualizar dados do repositório, sincronizar o estado da UI, verificar a conectividade de rede. Ao contrário de onResume, que é chamado toda vez que a Activity ganha foco (inclusive ao retornar de um diálogo ou menu do sistema), onRestart é acionado apenas durante um ciclo completo de ocultação e retorno. Isso torna onRestart o local ideal para operações de atualização “pesadas” que não são necessárias durante a perda parcial de foco.
De acordo com a especificação do ciclo de vida da Activity do Android, o intervalo de tempo entre onStop e onRestart pode variar de alguns segundos (o usuário alternou rapidamente) a várias horas (o aplicativo estava em segundo plano e o usuário retornou). Durante esse tempo, os dados em uma fonte remota (API, BD) podem ter mudado, então onRestart é um ponto natural para verificar a atualidade.
onRestart só é chamado quando uma Activity retorna do estado Stopped, no qual a Activity entrou depois que onStop foi chamado. Abaixo estão todos os cenários que levam ao onRestart.
Cenários de invocação do onRestart:
Quando onRestart NÃO é chamado: durante a rotação da tela (a Activity é destruída e recriada via onCreate), ao retornar de uma caixa de diálogo (a Activity não entra em onStop, apenas onPause → onResume), durante a morte do processo (a Activity é recriada).
onRestart e onCreate são duas abordagens diferentes para restaurar uma Activity. A escolha entre eles depende se a Activity foi completamente destruída ou simplesmente ocultada.
| Característica | onRestart | onCreate |
|---|---|---|
| Quando é chamado | Activity retorna de Stopped | Activity é criada pela primeira vez ou após ser destruída |
| Estado preservado | Sim — ViewModel e campos estão vivos | Não — tudo é criado novamente |
| Bundle | Não é passado | É passado (savedInstanceState) |
| Ações típicas | Atualização de dados, refresh da UI | Inicialização de View, assinatura LiveData |
| Frequência de chamada | Toda vez ao retornar | Uma vez ou após destruição |
Regra de seleção: faça a inicialização da View e a assinatura do LiveData/StateFlow no onCreate (ou onViewCreated para Fragment). Atualizações de dados, recarga de listas e verificações de estado — no onRestart. Se os dados são carregados via ViewModel, onRestart pode simplesmente chamar o método refresh() no ViewModel, e a View assinará os dados atualizados através de um fluxo reativo.
O Google recomenda: não duplique a lógica do onCreate no onRestart. Extraia métodos refresh() no ViewModel que carregam dados atuais e chame-os no onRestart. Isso preserva uma arquitetura MVVM limpa e elimina duplicação de código.
onRestart é o local ideal para operações que devem ser executadas toda vez que a tela for retornada, mas não são necessárias na primeira abertura. Aqui estão cenários típicos:
viewModel.refreshItems() no onRestart.O que NÃO fazer no onRestart: não reinicialize as Views — elas estão vivas porque a Activity não foi destruída. Não assine novamente o LiveData — a assinatura no onCreate ainda está viva. Não crie novos Fragments — eles já estão no FragmentManager.
A exceção mais importante: onRestart não é chamado se o processo do aplicativo foi morto pelo sistema. Este é um ponto-chave que os desenvolvedores frequentemente perdem ao confiar no onRestart para restauração de estado.
Durante a morte do processo:
Como se proteger contra isso: sempre salve o estado crítico em onSaveInstanceState(Bundle) (chamado antes de onStop) ou use SavedStateHandle no ViewModel. No onCreate, verifique savedInstanceState: se não for null, restaure o estado do Bundle; se for null, carregue dados novos.
De acordo com o Google Android Vitals, cerca de 7% dos retornos a uma Activity após um longo tempo em segundo plano ocorrem após a morte do processo. Isso significa que a cada 15.ª Activity que deveria ter chamado onRestart, na verdade passa por onCreate. Ignorar esse cenário é uma das principais causas de bugs de “tela vazia após o retorno”.
A Activity chama viewModel.refreshTasks() no onRestart para atualizar a lista de tarefas após retornar da tela de edição.
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", "Recebidas ${tasks.size} tarefas")
}
}
override fun onRestart() {
super.onRestart()
Log.d("TaskList", "onRestart: atualizando lista de tarefas")
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() carrega dados atuais do repositório. LiveData notifica automaticamente a Activity sobre mudanças de dados — a UI é atualizada sem código adicional. onRestart não cria uma nova assinatura — ela já foi configurada no onCreate.
A Activity verifica a validade do token ao retornar e redireciona para o login se necessário.
class ProfileActivity : AppCompatActivity() {
private val authManager = AuthManager()
private val launcher = registerForActivityResult(
ActivityResultContracts.StartActivityForResult()
) { Log.d("Profile", "Voltou da tela de login") }
override fun onRestart() {
super.onRestart()
if (!authManager.isTokenValid()) {
Log.d("Profile", "Token expirado — redirecionando para login")
launcher.launch(Intent(this, LoginActivity::class.java))
}
}
}
class AuthManager {
fun isTokenValid(): Boolean {
val expiry = SharedPreferencesManager().getTokenExpiry()
return System.currentTimeMillis() < expiry
}
}
Se o usuário minimizou o aplicativo por um longo período e retornou após o token expirar, onRestart o redirecionará para a tela de login. Isso evita erros de API ao tentar fazer uma solicitação com um token expirado. Nota: a verificação está no onRestart, não no onResume, para evitar uma verificação desnecessária ao retornar de um diálogo.
O Fragment usa onRestart via LifecycleObserver para atualizar dados.
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()
}
})
}
}
Em vez de sobrescrever onRestart no Fragment, o LifecycleObserver é usado — uma abordagem mais flexível que permite adicionar lógica de eventos do ciclo de vida sem herança. O ViewLifecycleOwner garante que o observer viva dentro do escopo da View (não sobrevive ao onDestroyView).
Perguntas frequentes
onResume é chamado toda vez que a Activity ganha foco — inclusive ao retornar de um diálogo ou menu do sistema (a Activity não entrou em onStop). onRestart é chamado apenas ao retornar do estado Stopped, quando a Activity estava completamente oculta. onRestart é um evento mais específico para atualizações “pesadas”, enquanto onResume é para operações leves (alteração de título, atualização de hora).
Não, não pode. onRestart é um método pareado com onStop: onRestart só é chamado depois que a Activity passou por onStop. Se a Activity não entrou em onStop (por exemplo, uma caixa de diálogo foi aberta), então ao retornar onRestart não é chamado — apenas onResume.
Pressione Home (botão início) no emulador — a Activity será minimizada e receberá onStop. Em seguida, abra o aplicativo através de Recentes ou do lançador — a Activity receberá onRestart → onStart → onResume. Para depuração, use Debug com pontos de interrupção no onRestart ou Log.d com a tag da Activity.
Uma exceção não capturada no onRestart causará um Force Close. O sistema não captura exceções em callbacks do ciclo de vida. Se no onRestart forem realizadas operações que possam lançar uma exceção (requisição de rede sem try-catch, trabalho com View null), envolva-as em try-catch.
Não. onRestart só é chamado para Activities vivas que estão retornando do estado Stopped. isFinishing() no onRestart sempre será false. Verificar isFinishing() faz sentido no onPause (salvar dados) e no onDestroy (distinguir recriação de finalizaçã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