O ciclo de vida de um aplicativo móvel determina como ele se comporta ao ser iniciado, minimizado, retornado do fundo e fechado. Neste artigo, abordaremos App Lifecycle (iOS), Activity Lifecycle (Android), Fragment Lifecycle, ViewController Lifecycle e LifecycleOwner. Compreender esses processos é fundamental para evitar vazamentos de memória, perda de dados e comportamento incorreto do aplicativo. Mais detalhes na documentação oficial do Android Activity Lifecycle.
Principais pontos
Antes de analisar o ciclo de vida de telas individuais, é importante entender o ciclo de vida de todo o aplicativo. No iOS, o aplicativo passa por cinco estados: Not Running (não executando), Inactive (em segundo plano, não recebe eventos), Active (ativo), Background (em segundo plano, executando código) e Suspended (em segundo plano, código suspenso). Esses estados são gerenciados no AppDelegate através dos métodos applicationDidFinishLaunching, applicationDidBecomeActive, applicationWillResignActive, applicationDidEnterBackground e applicationWillTerminate.
No Android, o equivalente é o Application Lifecycle, rastreado através da interface Application.ActivityLifecycleCallbacks. No entanto, o Android foca mais no ciclo de vida de uma Activity — uma tela individual do aplicativo. Isso porque um aplicativo Android pode consistir em várias Activities, cada uma com seu próprio ciclo.
A abordagem moderna no Android é usar ProcessLifecycleOwner da biblioteca lifecycle-process. Ele permite rastrear o estado de todo o processo sem estar vinculado a uma Activity específica. No iOS, usa-se UISceneDelegate (desde o iOS 13) ou AppDelegate para rastrear o estado do aplicativo. O SceneDelegate lida com múltiplas janelas (multiwindow) no iPad. Compreender o App Lifecycle é especialmente importante para a IT Sectr ao desenvolver aplicativos com sincronização em segundo plano, streaming e chamadas VoIP.
Activity é o componente básico de um aplicativo Android, representando uma tela. A Activity tem um ciclo de vida claramente definido gerenciado pelo sistema operacional em resposta a ações do usuário e eventos do sistema (rotação de tela, chamada recebida, pouca memória).
| Método | Descrição | O que fazer |
|---|---|---|
| onCreate | Chamado uma vez quando a Activity é criada | Inicialização da UI, findViewById, configuração do ViewModel |
| onStart | Activity se torna visível | Iniciar animações, registrar BroadCastReceiver |
| onResume | Activity ganha foco de entrada | Iniciar câmera, sensores, animações |
| onPause | Activity perde o foco (parcialmente visível) | Salvar rascunhos, parar animações |
| onStop | Activity não está visível | Liberar recursos, parar atualizações |
| onDestroy | Activity é destruída | Limpar todas as referências, cancelar inscrição do LiveData |
| onRestart | Chamado antes de onStart após onStop | Reinicialização |
Importante: onSaveInstanceState é chamado antes de onStop para salvar o estado temporário. A restauração ocorre no onCreate via Bundle savedInstanceState ou via SavedStateHandle no ViewModel. Sem o tratamento adequado do ciclo de vida, o aplicativo perderá todos os dados não salvos ao rotacionar a tela.
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
outState.putString("draft", draftText)
}
override fun onDestroy() {
super.onDestroy()
// Отписка от всех подписок
}
}
No Jetpack Compose, o ciclo de vida da Activity permanece inalterado, mas o Compose fornece ferramentas adicionais: Composição ciente do ciclo de vida via LifecycleOwner, efeitos LifecycleEventEffect e DisposableEffect para limpeza automática de recursos na destruição.
Fragment no Android vive dentro de uma Activity e tem seu próprio ciclo de vida, que se sobrepõe parcialmente ao da Activity, mas adiciona novos métodos. Fragments podem ser adicionados, substituídos e removidos sem destruir a Activity, tornando-os mais flexíveis, mas também mais complexos.
Métodos principais do Fragment Lifecycle: onAttach — Fragment anexado à Activity (primeira chamada); onCreate — inicialização de dados; onCreateView — criação da View; onViewCreated — View criada, UI pode ser configurada; onStart — Fragment visível; onResume — Fragment em foco; onPause — Fragment perde o foco; onStop — Fragment não visível; onDestroyView — View destruída; onDestroy — Fragment destruído; onDetach — Fragment desanexado da Activity.
Diferença chave da Activity: onCreateView e onDestroyView podem ser chamados várias vezes (por exemplo, ao alternar TabLayout), enquanto onCreate é chamado uma vez. Consequentemente, a inicialização da View deve ser feita em onViewCreated, não em onCreateView. Recursos relacionados à View (como adaptadores RecyclerView) devem ser limpos em onDestroyView.
UIViewController é a classe base para gerenciar telas no iOS. Seu ciclo de vida consiste em uma sequência de métodos que o UIKit chama automaticamente. Compreender esse ciclo é fundamental para a inicialização correta da UI, gerenciamento de dados e memória.
| Método | Quando é chamado | Uso típico |
|---|---|---|
| loadView | Quando o View Controller carrega sua hierarquia de View | Inicialização personalizada sem storyboard |
| viewDidLoad | Após a View ser carregada na memória (uma vez) | Configuração da UI, carregar dados iniciais |
| viewWillAppear | Antes da View aparecer na tela | Atualizar dados, inscrever-se em notificações |
| viewDidAppear | Após a View aparecer na tela | Iniciar animações, iniciar animações de rastreamento |
| viewWillDisappear | Antes da View desaparecer da tela | Salvar estado, cancelar inscrição de notificações |
| viewDidDisappear | Após a View desaparecer da tela | Parar animações, liberar recursos |
| dealloc | Quando o View Controller é destruído | Liberar todos os recursos |
Importante: viewDidLoad é chamado apenas uma vez na vida do View Controller. Para atualizar dados a cada aparição, use viewWillAppear. Se você se inscrever no NotificationCenter em viewWillAppear, certifique-se de cancelar a inscrição em viewDidDisappear para evitar vazamentos de memória.
O SwiftUI gerencia o ciclo de vida das Views através de estruturas View. Em vez de métodos de callback, o SwiftUI usa os modificadores onAppear e onDisappear. Para estados globais do aplicativo, o App Lifecycle é usado através dos protocolos App e Scene. O SwiftUI gerencia automaticamente a criação e destruição das Views com base no estado, simplificando o desenvolvimento, mas exigindo compreensão da identidade e tempo de vida das Views.
struct ContentView: View {
var body: some View {
Text("Hello")
.onAppear {
print("View появилась")
}
.onDisappear {
print("View исчезла")
}
}
}
LifecycleOwner é uma interface do Android Architecture Components que marca um objeto que possui um ciclo de vida (Activity, Fragment). LifecycleObserver é uma interface que permite a um objeto inscrever-se em eventos do LifecycleOwner. Juntos, eles formam a base do gerenciamento reativo do ciclo de vida no desenvolvimento Android moderno.
Em vez de chamar métodos explicitamente em onStart/onStop, recomenda-se usar DefaultLifecycleObserver (substituto do obsoleto LifecycleObserver com anotações @OnLifecycleEvent). Esta é a abordagem promovida pelo Google para ViewModel e outros componentes que precisam reagir ao ciclo de vida sem ter referências diretas à Activity ou Fragment.
class MyObserver : DefaultLifecycleObserver {
override fun onStart(owner: LifecycleOwner) {
// Подписка на обновления
}
override fun onStop(owner: LifecycleOwner) {
// Отписка
}
}
Na IT Sectr, usamos LifecycleOwner em todos os projetos Android. O ViewModel se inscreve no LifecycleOwner da Activity através de viewModelScope e lifecycleScope, garantindo o cancelamento automático de corrotinas quando a Activity é destruída. Isso evita vazamentos de memória e torna o código mais limpo e seguro.
Perguntas frequentes
A Activity passa por seis estados: Created (onCreate), Started (onStart), Resumed (onResume), Paused (onPause), Stopped (onStop), Destroyed (onDestroy).
Ordem: loadView → viewDidLoad → viewWillAppear → viewDidAppear → viewWillDisappear → viewDidDisappear. viewDidLoad é chamado uma vez.
LifecycleOwner é um componente do Android Architecture Components que possui o ciclo de vida de uma Activity ou Fragment. Permite inscrever-se em eventos via LifecycleObserver.
O aplicativo iOS passa por cinco estados: Not Running, Inactive, Active, Background, Suspended. As transições são gerenciadas via UIApplicationDelegate.
Saved State é o mecanismo do Android para preservar o estado da Activity/Fragment ao rotacionar a tela ou recriar o processo. Usa onSaveInstanceState e SavedStateHandle.
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.