Componentes y ciclo de vida
De qué está hecha una aplicación Android por dentro, cómo se declara en el Manifest, y cómo sobrevive (o no) a los cambios que le impone el sistema.
De qué está hecha una aplicación Android por dentro, cómo se declara en el Manifest, y cómo sobrevive (o no) a los cambios que le impone el sistema.
Las cuatro piezas de una app y la tarjeta de identidad que las declara.
Cómo se comunican los componentes, y cómo se navega hoy entre pantallas: una Activity, varios destinos.
Layouts, drawables, strings y cualificadores de configuración.
Los callbacks que deciden si tu app pierde datos al girar la pantalla.
El ciclo de vida de la app como producto, y Git como herramienta obligatoria.
| Componente | Para qué sirve |
|---|---|
Activity | Representa una pantalla con la que interactúa el usuario. El más usado, con diferencia. |
Service | Ejecuta trabajo en segundo plano, sin interfaz propia (música, sincronización, descargas). |
Broadcast Receiver | Escucha anuncios del sistema u otras apps (batería baja, cambio de red, arranque). |
Content Provider | Gestiona acceso a datos compartidos entre aplicaciones. El menos usado de los cuatro. |
Cualquier app está construida combinando algunos de estos cuatro bloques — no hace falta usarlos todos.
Sin interfaz propia. Sirve para operaciones que continúan aunque el usuario cambie de pantalla: reproducir música, sincronizar, descargar.
Ojo: no crea un hilo nuevo por defecto — corre en el hilo principal, igual que una Activity.
Batería baja, cambio de conectividad, SMS entrante, arranque del dispositivo. Sin interfaz, trabajo breve: recibe y delega.
Confundir un Service con una Activity es un error típico de principiante: cada componente tiene ciclo de vida y reglas distintas.
src/main/.| Pregunta | Dónde se responde |
|---|---|
| ¿Qué componentes tiene la app? | <activity>, <service>, <receiver>, <provider> |
| ¿Por dónde se arranca? | El <intent-filter> con MAIN y LAUNCHER |
| ¿Qué permisos necesita? | <uses-permission> |
| ¿Qué versiones de Android soporta? | minSdk, targetSdk |
| ¿Qué icono y nombre muestra? | android:icon, android:label |
exportedandroid:exported indica si el componente puede ser invocado por otras apps. Obligatorio declararlo desde Android 12 si hay intent-filter.false salvo que exista una razón concreta para exponer el componente.Indica exactamente qué componente se quiere lanzar: por ejemplo, un Service propio o una Activity de otra app conocida.
Describe una acción a realizar sin decir quién la hace. El sistema busca entre las apps instaladas cuál puede resolverla.
Extras: los datos que viajan con putExtra deben ser serializables (primitivos, String, Parcelable...).
Ese enfoque moderno se llama Navigation Component, y es lo que viene a continuación.
NavController: ejecuta ese grafo. Navegar sustituye a lanzar un Intent explícito y llamar a startActivity.Adelanto: el Navigation Component se trabajará en profundidad en la unidad 3, con su grafo visual y NavHost. De momento basta con la idea: una Activity, varios destinos.
res/ guarda todo lo que no es lógica en Kotlin, organizado por tipo.R generada automáticamente: cada recurso recibe un identificador (R.layout.activity_main, R.string.app_name).@+id vs @id: crea un identificador nuevo vs. referencia uno existente. Nunca texto literal en el layout.match_parent / wrap_content: todo el espacio del padre vs. solo lo necesario.setContentView infla el layout; findViewById accede a sus vistas por id.Imágenes (.png, .webp), iconos vectoriales y formas XML. Los VectorDrawable escalan sin perder calidad a cualquier densidad.
Todo texto visible va aquí, nunca en el layout o el código: permite internacionalización (values-en/) y mantenimiento en un solo sitio.
| Cualificador | Ejemplo de carpeta | Selecciona según... |
|---|---|---|
| Idioma | values-en/ | Idioma del sistema |
| Orientación | layout-land/ | Orientación actual del dispositivo |
| Ancho mínimo | layout-sw600dp/ | Tamaño de pantalla (tablets) |
| Densidad | drawable-xxhdpi/ | Densidad de píxeles |
| Tema | values-night/ | Modo claro u oscuro |
El sistema resuelve automáticamente qué versión usar en tiempo de ejecución: no se escribe ningún if para esto.
| Estado | Qué significa |
|---|---|
| Activo (resumed) | En primer plano, el usuario interactúa con ella. |
| Pausado (paused / stopped) | Sigue viva pero sin foco: parcialmente visible o completamente oculta. |
| Destruido | Ha dejado de existir. El sistema liberó sus recursos. |
Estos tres estados se traducen en una secuencia más fina de callbacks que Android invoca sobre la Activity.
Tras onStop vendría onDestroy si la Activity se destruye del todo.
Si el usuario pulsa inicio y vuelve enseguida, no se pasa por onCreate ni onDestroy:
La Activity sigue viva en memoria, simplemente detenida: por eso onStop/onStart son distintos de onCreate/onDestroy.
layout-land/).onPause → onStop → onDestroy.onCreate → onStart → onResume, cargando el layout adecuado a la nueva orientación.Cualquier variable en memoria se pierde si no se ha hecho nada para evitarlo: un formulario a medio rellenar desaparece con un simple giro.
Se invoca antes de destruirse por cambio de configuración; el Bundle vuelve como parámetro de onCreate.
El usuario vuelve a la app tras haberla dejado del todo en segundo plano.
El sistema la mata definitivamente por falta de memoria o cierre completo.
Diagrama completo del ciclo de estados: apuntes del tema 2 · apartado C.
CicloVida muestra el orden exacto de llamadas.| Fase | Qué ocurre |
|---|---|
| Descubrimiento | Tienda de apps, búsqueda, recomendación, enlace directo. |
| Instalación | El sistema descarga el paquete, verifica firma y permisos. |
| Ejecución | Combina internamente los ciclos de vida de Activities, Services y demás. |
| Actualización | Sustituye el paquete, normalmente conservando los datos del usuario. |
| Borrado | Desinstalación: libera el espacio ocupado. |
versionCode / versionName existen para que el sistema sepa si un paquete nuevo es realmente más reciente.
onSaveInstanceState: ambos mecanismos existen para que ese cierre silencioso no se note al volver a abrir la app.App, datos y caché.
Y desinstalar.
AndroidManifest.xml primero: mapa rápido de componentes y punto de entrada.intent-filter con MAIN/LAUNCHER) y sigue el flujo desde ahí.ui, data, model) o por característica.Qué NO se sube: carpetas de compilación (build/) y ficheros locales del IDE. Revisa el .gitignore que trae el proyecto, no lo sustituyas por uno genérico.
android/compose-samples: Activities, destinos de navegación, componentes, Manifest y estructura de paquetes.onSaveInstanceState.Entender el ciclo de vida no es un trámite: es la diferencia entre una app que respeta al usuario y una que le hace perder su trabajo con un simple giro de pantalla.