El ciclo de vida de una aplicación móvil determina cómo se comporta al iniciarse, minimizarse, volver del fondo y cerrarse. En este artículo analizaremos App Lifecycle (iOS), Activity Lifecycle (Android), Fragment Lifecycle, ViewController Lifecycle y LifecycleOwner. Comprender estos procesos es fundamental para prevenir fugas de memoria, pérdida de datos y un funcionamiento incorrecto de la aplicación. Más detalles en la documentación oficial de Android Activity Lifecycle.
Puntos clave
Antes de analizar el ciclo de vida de pantallas individuales, es importante entender el ciclo de vida de toda la aplicación. En iOS, la aplicación pasa por cinco estados: Not Running (no ejecutada), Inactive (en segundo plano, no recibe eventos), Active (activa), Background (en segundo plano, ejecutando código) y Suspended (en segundo plano, código suspendido). Estos estados se gestionan en AppDelegate mediante los métodos applicationDidFinishLaunching, applicationDidBecomeActive, applicationWillResignActive, applicationDidEnterBackground y applicationWillTerminate.
En Android, el equivalente es el Application Lifecycle, que se rastrea a través de la interfaz Application.ActivityLifecycleCallbacks. Sin embargo, Android se centra más en el ciclo de vida de una Activity — una pantalla individual de la aplicación. Esto se debe a que una aplicación Android puede constar de múltiples Activities, cada una con su propio ciclo.
El enfoque moderno en Android es usar ProcessLifecycleOwner de la librería lifecycle-process. Permite rastrear el estado de todo el proceso sin estar vinculado a una Activity específica. En iOS, se usa UISceneDelegate (desde iOS 13) o AppDelegate para rastrear el estado de la aplicación. SceneDelegate maneja múltiples ventanas (multiwindow) en iPad. Comprender el App Lifecycle es especialmente importante para IT Sectr al desarrollar aplicaciones con sincronización en segundo plano, streaming y llamadas VoIP.
Activity es el componente básico de una aplicación Android que representa una pantalla. Activity tiene un ciclo de vida claramente definido gestionado por el sistema operativo en respuesta a acciones del usuario y eventos del sistema (rotación de pantalla, llamada entrante, poca memoria).
| Método | Descripción | Qué hacer |
|---|---|---|
| onCreate | Se llama una vez al crear la Activity | Inicialización de UI, findViewById, configuración de ViewModel |
| onStart | La Activity se vuelve visible | Iniciar animaciones, registrar BroadCastReceiver |
| onResume | La Activity obtiene el foco de entrada | Iniciar cámara, sensores, animaciones |
| onPause | La Activity pierde el foco (parcialmente visible) | Guardar borradores, detener animaciones |
| onStop | La Activity no es visible | Liberar recursos, detener actualizaciones |
| onDestroy | La Activity se destruye | Limpiar todas las referencias, cancelar suscripción de LiveData |
| onRestart | Se llama antes de onStart después de onStop | Reinicialización |
Importante: onSaveInstanceState se llama antes de onStop para guardar el estado temporal. La restauración ocurre en onCreate mediante Bundle savedInstanceState o mediante SavedStateHandle en ViewModel. Sin un manejo adecuado del ciclo de vida, la aplicación perderá todos los datos no guardados al rotar la pantalla.
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()
// Отписка от всех подписок
}
}
En Jetpack Compose, el ciclo de vida de Activity permanece sin cambios, pero Compose proporciona herramientas adicionales: Lifecycle-aware composition mediante LifecycleOwner, efectos LifecycleEventEffect y DisposableEffect para la limpieza automática de recursos al destruirse.
Fragment en Android vive dentro de una Activity y tiene su propio ciclo de vida, que se superpone parcialmente con Activity pero añade nuevos métodos. Los Fragments pueden agregarse, reemplazarse y eliminarse sin destruir la Activity, lo que los hace más flexibles pero también más complejos.
Métodos clave del Fragment Lifecycle: onAttach — Fragment adjuntado a Activity (primera llamada); onCreate — inicialización de datos; onCreateView — creación de View; onViewCreated — View creada, se puede configurar la UI; onStart — Fragment visible; onResume — Fragment en foco; onPause — Fragment pierde el foco; onStop — Fragment no visible; onDestroyView — View destruida; onDestroy — Fragment destruido; onDetach — Fragment desvinculado de Activity.
Diferencia clave con Activity: onCreateView y onDestroyView pueden llamarse varias veces (por ejemplo, al cambiar de TabLayout), mientras que onCreate se llama una sola vez. Por consiguiente, la inicialización de la View debe hacerse en onViewCreated, no en onCreateView. Los recursos relacionados con la View (como los adaptadores de RecyclerView) deben limpiarse en onDestroyView.
UIViewController es la clase base para gestionar pantallas en iOS. Su ciclo de vida consiste en una secuencia de métodos que UIKit llama automáticamente. Comprender este ciclo es fundamental para la correcta inicialización de la UI, la gestión de datos y la memoria.
| Método | Cuándo se llama | Uso típico |
|---|---|---|
| loadView | Cuando el View Controller carga su jerarquía de View | Inicialización personalizada sin storyboard |
| viewDidLoad | Después de cargar la View en memoria (una vez) | Configuración de UI, carga de datos iniciales |
| viewWillAppear | Antes de que la View aparezca en pantalla | Actualizar datos, suscribirse a notificaciones |
| viewDidAppear | Después de que la View aparezca en pantalla | Iniciar animaciones, iniciar animaciones de seguimiento |
| viewWillDisappear | Antes de que la View desaparezca de la pantalla | Guardar estado, cancelar suscripción de notificaciones |
| viewDidDisappear | Después de que la View desaparezca de la pantalla | Detener animaciones, liberar recursos |
| dealloc | Cuando se destruye el View Controller | Liberar todos los recursos |
Importante: viewDidLoad se llama solo una vez en la vida del View Controller. Para actualizar datos en cada aparición, use viewWillAppear. Si se suscribe a NotificationCenter en viewWillAppear, asegúrese de cancelar la suscripción en viewDidDisappear para evitar fugas de memoria.
SwiftUI gestiona el ciclo de vida de las Views mediante estructuras View. En lugar de métodos callback, SwiftUI usa los modificadores onAppear y onDisappear. Para estados globales de la aplicación, se usa el App Lifecycle a través de los protocolos App y Scene. SwiftUI gestiona automáticamente la creación y destrucción de Views basándose en el estado, lo que simplifica el desarrollo pero requiere comprender la identidad y el tiempo de vida de las Views.
struct ContentView: View {
var body: some View {
Text("Hello")
.onAppear {
print("View появилась")
}
.onDisappear {
print("View исчезла")
}
}
}
LifecycleOwner es una interfaz de Android Architecture Components que marca un objeto que tiene un ciclo de vida (Activity, Fragment). LifecycleObserver es una interfaz que permite a un objeto suscribirse a eventos de LifecycleOwner. Juntos forman la base de la gestión reactiva del ciclo de vida en el desarrollo moderno de Android.
En lugar de llamar métodos explícitamente en onStart/onStop, se recomienda usar DefaultLifecycleObserver (reemplazo del obsoleto LifecycleObserver con anotaciones @OnLifecycleEvent). Este es el enfoque promovido por Google para ViewModel y otros componentes que deben reaccionar al ciclo de vida sin tener referencias directas a Activity o Fragment.
class MyObserver : DefaultLifecycleObserver {
override fun onStart(owner: LifecycleOwner) {
// Подписка на обновления
}
override fun onStop(owner: LifecycleOwner) {
// Отписка
}
}
En IT Sectr, usamos LifecycleOwner en todos los proyectos de Android. ViewModel se suscribe al LifecycleOwner de Activity mediante viewModelScope y lifecycleScope, lo que garantiza la cancelación automática de corutinas cuando se destruye la Activity. Esto previene fugas de memoria y hace que el código sea más limpio y seguro.
Preguntas frecuentes
Activity pasa por seis estados: Created (onCreate), Started (onStart), Resumed (onResume), Paused (onPause), Stopped (onStop), Destroyed (onDestroy).
Orden: loadView → viewDidLoad → viewWillAppear → viewDidAppear → viewWillDisappear → viewDidDisappear. viewDidLoad se llama una vez.
LifecycleOwner es un componente de Android Architecture Components que posee el ciclo de vida de una Activity o Fragment. Permite suscribirse a eventos mediante LifecycleObserver.
La aplicación iOS pasa por cinco estados: Not Running, Inactive, Active, Background, Suspended. Las transiciones se gestionan mediante UIApplicationDelegate.
Saved State es el mecanismo de Android para preservar el estado de Activity/Fragment al rotar la pantalla o recrear el proceso. Utiliza onSaveInstanceState y SavedStateHandle.
Resumen
Desarrollaremos una aplicación móvil llave en mano
IT Sectr crea aplicaciones para iOS y Android para startups y empresas desde 2017. Le asesoraremos y le propondremos la mejor solución.