Programación de Dispositivos Móviles · Tema 2

🤖 Introducción a Android

Historia, arquitectura, entorno de desarrollo, componentes de una app, interfaz de usuario y sistema de recursos — la base completa para desarrollar en Android.

📅 Historia 🛠️ Android Studio 🧱 Componentes 🎨 Interfaz 📦 Recursos 🏋️ Actividades 📖 Glosario
01
Historia, Arquitectura y Ecosistema
Orígenes · Capas del SO · Versiones · Ecosistema Google

📅 Historia y Orígenes de Android

Android no nació como sistema operativo para móviles — nació para cámaras digitales. En 2003, Andy Rubin, Rich Miner, Nick Sears y Chris White fundaron Android Inc. con ese objetivo. Pivotaron rápidamente al mercado de smartphones, y en 2005 Google adquirió la compañía por ~50 millones de dólares.

El primer dispositivo Android llegó en 2008: el HTC Dream (T-Mobile G1). Desde entonces, Android ha crecido hasta convertirse en el sistema operativo más usado del planeta.

2003
Fundación de Android Inc.
2005
Adquisición por Google (~$50M)
2008
Primer dispositivo Android (HTC Dream)
3.000M
Usuarios activos en 2024
💡 Open Handset Alliance (OHA)

En 2007 Google anunció la OHA — un consorcio de 80+ empresas (HTC, Samsung, LG, Motorola, Sony, Qualcomm, Intel...) para desarrollar estándares abiertos para móviles. Android se publicó bajo licencia Apache 2.0 — completamente abierto y gratuito.

🏗️ Arquitectura de Android: las 5 capas

Android se organiza como una pila de 5 capas donde cada nivel provee servicios a la capa superior. Entender esta estructura ayuda a saber qué ocurre «por debajo» cuando ejecutamos nuestra app.

Analogía: es como un edificio — el sótano (kernel) sostiene todo, las plantas intermedias ofrecen servicios, y en la última planta (la app) es donde el usuario vive.

5
Aplicaciones
Apps del sistema y de terceros (Kotlin/Java)
4
Framework de Aplicaciones
Activity Manager, Content Providers, Notification Manager, Window Manager
3
Librerías Nativas + ART
SQLite, WebKit, OpenGL ES · Android Runtime (AOT+JIT)
2
HAL (Hardware Abstraction Layer)
Drivers estandarizados de cámara, GPS, sensores...
1
Linux Kernel
Gestión de memoria, procesos, seguridad y energía
💡 ART vs Dalvik

Desde Android 5.0 (Lollipop), ART (Android Runtime) reemplazó a Dalvik. ART usa compilación AOT (Ahead-Of-Time, al instalar) + JIT (Just-In-Time, en ejecución). Resultado: apps más rápidas y menor consumo de batería.

📱 Versiones de Android y API Levels

Cada versión de Android tiene un API Level — un número que identifica qué funcionalidades están disponibles. Cuando desarrollas, defines un minSdkVersion (mínimo compatible) y un targetSdkVersion (versión objetivo).

VersiónAPINombreAñoHito clave
5.021Lollipop2014Material Design, ART reemplaza Dalvik
6.023Marshmallow2015Permisos en runtime, USB-C
8.026Oreo2017Picture-in-Picture, Project Treble
10292019Modo oscuro oficial, 5G nativo
1231Material You2021Colores dinámicos desde fondo pantalla
14342023Personalización avanzada, rendimiento
15352024IA integrada, audio espacial
⚠️ Fragmentación: el gran reto de Android

En 2024: Android 14 ~30% · Android 13 ~25% · Android 12 ~18% · Android 11 o inferior ~27%. Esto significa que si fijas minSdkVersion 29, excluyes a ~27% de usuarios pero garantizas funciones modernas. Hay que equilibrar cobertura y funcionalidad.

🌐 El Ecosistema Android

🏪
Google Play Store
+3 millones de apps. Google Play Protect analiza seguridad. Restricciones en China y otros países.
⚙️
GMS (Google Mobile Services)
APIs propietarias de Google: Maps, Gmail, YouTube, Drive. Requieren licencia para incluirse en el dispositivo.
🔓
AOSP
Código fuente abierto (Apache 2.0). Base de ROMs como LineageOS. Alternativa sin GMS: Amazon Fire OS, Huawei HMS.
🏢
Android Enterprise
Gestión MDM para empresas. Perfiles de trabajo separados, políticas de seguridad remotas.
🙋 Pregunta para el alumno

¿Sabes por qué los teléfonos Huawei actuales no tienen Google Play? ¿Qué usa Huawei en su lugar y qué implicaciones tiene para los desarrolladores?

📋 Mini resumen

Android nació en 2003, adquirido por Google en 2005. Arquitectura en 5 capas: Kernel Linux → HAL → ART+Librerías → Framework → Apps. Cada versión tiene un API Level. ~70% cuota global. Ecosistema: Play Store, GMS, AOSP y Android Enterprise.

02
Entorno de Desarrollo
Android Studio · SDK · Estructura de proyecto · AVD · ADB

🛠️ Android Studio: el IDE oficial

Android Studio es el entorno de desarrollo integrado oficial para Android. Está basado en IntelliJ IDEA (JetBrains) y es completamente gratuito. Incluye editor de código, diseñador visual de layouts, emulador, depurador y profiler de rendimiento.

ComponenteMínimoRecomendado
Sistema operativoWindows 8+, macOS 10.14+, LinuxWindows 10/11, macOS 12+
RAM4 GB16 GB o más
Espacio en disco2 GB8 GB+ (SSD)
Resolución1280×8001920×1080+
📱 Pasos de instalación
  1. Descargar desde developer.android.com/studio (versión estable)
  2. Ejecutar instalador (.exe en Windows, arrastrar a Applications en Mac)
  3. Seleccionar tipo Standard en la configuración inicial
  4. Aceptar licencias del SDK y esperar descarga de componentes
  5. ¡Listo! Crear primer proyecto con la plantilla "Empty Activity"

📦 Configuración del SDK Manager

El SDK Manager (Settings → SDK Manager) gestiona todos los componentes necesarios para compilar y ejecutar apps. Piensa en él como un gestor de herramientas de taller.

Componente SDKDescripción
Android SDK PlatformSistema Android para cada versión objetivo (ej. API 34)
SDK Build-ToolsCompiladores: aapt, d8, zipalign
SDK Platform-Toolsadb (Android Debug Bridge) y fastboot
Android Support/AndroidXLibrerías de compatibilidad retrocompatibles
Google RepositoryGoogle Play Services y APIs de Google

📁 Estructura de un Proyecto Android

Todo proyecto Android sigue una estructura estandarizada de directorios. Conocerla bien es fundamental para trabajar de forma eficiente y no perderse entre archivos.

MiApp/ ├── app/ │ ├── src/main/ │ │ ├── java/com.ejemplo.miapp/ │ │ │ └── MainActivity.kt ← Código Kotlin │ │ ├── res/ │ │ │ ├── layout/ │ │ │ │ └── activity_main.xml ← Layout de la pantalla │ │ │ ├── values/ │ │ │ │ ├── strings.xml ← Textos │ │ │ │ ├── colors.xml ← Colores │ │ │ │ └── themes.xml ← Temas │ │ │ └── drawable/ ← Imágenes e iconos │ │ └── AndroidManifest.xml ← ¡Registro central! │ └── build.gradle.kts ← Dependencias └── settings.gradle.kts

El AndroidManifest.xml — el DNI de la app:

Es el fichero más importante del proyecto. Declara permisos, registra todos los componentes y define la Activity de arranque.

<!-- AndroidManifest.xml — configuración global de la app -->
<manifest xmlns:android="http://schemas.android.com/apk/res/android">

  <!-- Permisos que la app necesita -->
  <uses-permission android:name="android.permission.INTERNET"/>
  <uses-permission android:name="android.permission.CAMERA"/>

  <application
      android:icon="@mipmap/ic_launcher"
      android:theme="@style/Theme.MiApp">

    <!-- Registrar la Activity principal -->
    <activity android:name=".MainActivity" android:exported="true">
      <intent-filter>
        <action android:name="android.intent.action.MAIN"/>
        <category android:name="android.intent.category.LAUNCHER"/>
      </intent-filter>
    </activity>
  </application>
</manifest>
⚠️ Error frecuente

Olvidar registrar un componente (Activity, Service, BroadcastReceiver) en el AndroidManifest.xml. El resultado es un crash inmediato al intentar usar ese componente. Todo componente nuevo debe declararse en el Manifest.

📲 Emuladores (AVD) y ADB

El AVD Manager (Android Virtual Device) permite crear dispositivos virtuales para probar sin hardware físico. ADB (Android Debug Bridge) es la herramienta de línea de comandos para comunicarse con el dispositivo.

✅ Crear AVD

  1. Tools → Device Manager → Create Device
  2. Seleccionar hardware (Pixel 7...)
  3. Elegir imagen del sistema (API 34)
  4. Configurar RAM y almacenamiento

⚠️ Limitaciones del emulador

  • Rendimiento inferior al real
  • NFC y BT limitados
  • Consume recursos del PC
  • Siempre probar en real antes de publicar

Activar depuración en dispositivo real:

📱 Pasos para habilitar Developer Options

Ajustes → Acerca del teléfono → pulsar «Número de compilación» 7 veces → aparece «Opciones de desarrollador» → activar Depuración USB → conectar por USB y aceptar el permiso en el teléfono.

Comandos ADB esenciales:

# Gestión de dispositivos
adb devices                       # Listar dispositivos conectados
adb install app.apk               # Instalar un APK
adb uninstall com.paquete.app     # Desinstalar una app

# Depuración
adb logcat                        # Ver logs en tiempo real
adb shell                         # Abrir shell remota en el dispositivo

# Transferencia de archivos
adb pull /sdcard/archivo local/   # Dispositivo → PC
adb push archivo.txt /sdcard/     # PC → Dispositivo
adb reboot                        # Reiniciar el dispositivo

# WiFi Debugging (Android 11+)
adb pair IP:PUERTO                # Emparejar por WiFi
adb connect IP:PUERTO             # Conectar vía WiFi
🙋 Pregunta para el alumno

¿Para qué sirve adb logcat? ¿En qué situación te sería útil durante el desarrollo de una app? ¿Qué diferencia hay entre depurar en emulador y en dispositivo real?

📋 Mini resumen

Android Studio (IntelliJ-based, gratuito) es el IDE oficial. SDK Manager gestiona versiones y herramientas. La estructura del proyecto tiene java/ (código) + res/ (recursos) + AndroidManifest.xml (registro central). AVD para emuladores. ADB para comunicarse con el dispositivo vía línea de comandos.

03
Fundamentos: Componentes de una App
Activity · Service · BroadcastReceiver · ContentProvider · Intents · Fragments

🧱 Los 4 Componentes Principales de Android

Android define cuatro tipos fundamentales de componentes. Son los bloques de construcción de cualquier app. Todos deben declararse en el AndroidManifest.xml.

📱
Activity
Una pantalla con interfaz de usuario. Punto de entrada para la interacción con el usuario.
Ej: pantalla de login, listado de productos
⚙️
Service
Opera en segundo plano sin interfaz visible. Se ejecuta aunque la app no esté en pantalla.
Ej: reproducción de música, descarga de archivos
📡
BroadcastReceiver
Escucha y responde a eventos del sistema o de otras apps.
Ej: batería baja, cambio de red, arranque
🗄️
ContentProvider
Gestiona y comparte datos entre aplicaciones de forma estructurada.
Ej: acceder a contactos, galería de fotos
// 1. ACTIVITY — pantalla con UI
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    }
}

// 2. SERVICE — trabajo en segundo plano
class MyService : Service() {
    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
        // Tarea en segundo plano aquí
        return START_STICKY  // Se reinicia si el sistema lo mata
    }
    override fun onBind(intent: Intent?): IBinder? = null
}

// 3. BROADCASTRECEIVER — escucha eventos del sistema
class BatteryReceiver : BroadcastReceiver() {
    override fun onReceive(context: Context, intent: Intent) {
        if (intent.action == Intent.ACTION_BATTERY_LOW) {
            // Reaccionar cuando la batería está baja
        }
    }
}
💡 Analogía de los 4 componentes

Piensa en una empresa: Activity = recepción (cara visible al cliente). Service = almacén (trabaja sin que el cliente lo vea). BroadcastReceiver = sistema de alarmas (reacciona a eventos). ContentProvider = archivo compartido (datos accesibles por todos los departamentos).

🔄 Ciclo de Vida de un Activity

Una Activity no existe solo en dos estados (existe/no existe) — pasa por varios estados a lo largo de su vida. Gestionar este ciclo correctamente evita pérdidas de datos, consumo innecesario de batería y crashes.

onCreate() — Inicialización
▼ la Activity se crea por primera vez
onStart() — Visible
▼ pasa a primer plano
onResume() — Activa (Interactuable)
↕ otra Activity toma el foco
onPause() — Pausada
▼ Activity deja de ser visible
onStop() — Detenida
▼ antes de destruirse
onDestroy() — Destruida
MétodoQué hacer aquí
onCreate()setContentView(), vincular vistas, inicializar
onStart()Preparar la interfaz de usuario
onResume()Iniciar animaciones, cámara, listeners
onPause()Pausar animaciones, guardar estado temporal
onStop()Liberar recursos pesados
onDestroy()Limpieza final de todos los recursos
⚠️ Regla de oro del ciclo de vida

En onPause() y onStop() libera recursos que consuman CPU o memoria (cámara, GPS, sensores). En onCreate() y onResume() vuélvelos a inicializar. Nunca hagas operaciones lentas en onCreate() — bloquea el arranque y el sistema considera que la app no responde.

✉️ Intents: comunicación entre componentes

Los Intents son el mecanismo de mensajería de Android. Permiten que componentes se comuniquen, navegar entre pantallas y solicitar acciones al sistema.

🎯 Intent Explícito

Especifica exactamente el componente destino. Para navegar dentro de tu propia app.

// Navegar a SecondActivity
val intent = Intent(this,
    SecondActivity::class.java)
intent.putExtra("KEY", "valor")
startActivity(intent)

// Recibir en destino
val v = intent.getStringExtra("KEY")
🌐 Intent Implícito

Declara la acción, el sistema elige la app. Para usar funciones del dispositivo o de otras apps.

// Abrir URL
startActivity(Intent(
    Intent.ACTION_VIEW,
    Uri.parse("https://ejemplo.com")))

// Llamar por teléfono
startActivity(Intent(
    Intent.ACTION_DIAL,
    Uri.parse("tel:+34600123456")))

// Compartir texto
val i = Intent(Intent.ACTION_SEND)
i.type = "text/plain"
i.putExtra(Intent.EXTRA_TEXT, "Texto")
startActivity(Intent.createChooser(i, "Compartir"))

🧩 Fragments: UI modular y reutilizable

Un Fragment es una porción de UI reutilizable que vive dentro de una Activity. Permite construir interfaces adaptables — un teléfono puede mostrar un Fragment a la vez, mientras una tablet muestra dos simultáneamente.

Analogía: si la Activity es una habitación, los Fragments son los muebles — puedes moverlos, reemplazarlos o quitarlos según necesites.

// Añadir o reemplazar un Fragment dinámicamente
supportFragmentManager.beginTransaction()
    .replace(R.id.fragment_container, MiFragment())
    .addToBackStack(null)  // Permite volver con el botón Back
    .commit()
🙋 Pregunta para el alumno

¿Por qué una Activity tiene su propio ciclo de vida y un Fragment también tiene el suyo? ¿Qué ocurre con el Fragment cuando la Activity en la que vive se pausa?

📋 Mini resumen

4 componentes: Activity (UI), Service (background), BroadcastReceiver (eventos), ContentProvider (datos). Todos en el Manifest. Ciclo de vida de Activity: onCreate → onStart → onResume ↔ onPause → onStop → onDestroy. Intents explícitos (dentro de la app) vs implícitos (sistema). Fragments para UI modular.

04
Interfaz de Usuario
Layouts · Controles UI · Material Design 3 · Diseño responsivo

📐 Layouts y ViewGroups

En Android, la interfaz se construye con Views (elementos básicos: botón, texto, imagen) organizadas dentro de ViewGroups (contenedores). Un layout es un ViewGroup que define cómo se colocan sus hijos.

🎯
ConstraintLayout ⭐
Recomendado por Google. Posiciona elementos con restricciones entre sí. Evita anidar layouts. Ideal para diseños complejos.
↕️
LinearLayout
Organiza en fila horizontal o columna vertical. Simple y predecible. Ideal para formularios simples.
📄
FrameLayout
Apila elementos uno sobre otro. Ideal para contener un Fragment o superponer vistas (overlay).
GridLayout
Organiza en cuadrícula. Útil para teclados, calculadoras y paneles de categorías.
<!-- ConstraintLayout — el más recomendado -->
<androidx.constraintlayout.widget.ConstraintLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/tvTitulo"
        android:text="@string/titulo"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        android:layout_marginTop="16dp"/>

    <Button
        android:id="@+id/btnAccion"
        android:text="Aceptar"
        app:layout_constraintTop_toBottomOf="@id/tvTitulo"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"/>

</androidx.constraintlayout.widget.ConstraintLayout>
💡 ConstraintLayout: por qué es el mejor

Anidar múltiples LinearLayouts degrada el rendimiento porque Android tiene que calcular la posición en múltiples pasadas. ConstraintLayout resuelve todo en una sola pasada de medición, haciendo la UI más fluida.

🎛️ Controles de UI Básicos

ControlAtributos claveUso típico
TextViewtext, textSize (sp), textColor, textStyleMostrar texto estático o dinámico
EditTexthint, inputType, maxLinesEntrada de texto del usuario
Buttontext, onClick, style MaterialAcción principal de la pantalla
ImageViewsrc, scaleType (centerCrop, fitCenter)Imágenes e iconos
CheckBoxchecked, text, OnCheckedChangeListenerSelección múltiple de opciones
RadioButton/Grouporientation, getCheckedRadioButtonId()Selección exclusiva entre opciones
Switchchecked, OnCheckedChangeListenerActivar/desactivar funciones
Spinnerentries (array), OnItemSelectedListenerLista desplegable de opciones
RecyclerViewadapter, layoutManagerListas y cuadrículas de gran volumen
📱 inputType en EditText

El inputType determina qué teclado muestra Android. textEmailAddress muestra teclado con @, textPassword oculta los caracteres, number muestra solo números, phone muestra el marcador telefónico. ¡Usarlo correctamente mejora mucho la UX!

🎨 Material Design 3 (Material You)

Material Design 3 es el sistema de diseño de Google: componentes, colores, tipografía y movimiento. Proporciona coherencia visual entre todas las apps de Android y facilita el cumplimiento de las guías de accesibilidad.

🎨
Colores dinámicos
Android 12+ genera la paleta de colores automáticamente desde el fondo de pantalla del usuario (Material You).
🔲
Componentes Material
MaterialButton, TextInputLayout, CardView, BottomNavigationView, Snackbar, Chip, FAB...
📐
Diseño responsivo
Calificadores de recursos: layout/, layout-sw600dp/ (tablets 7"), layout-land/ (horizontal)...
⚠️ Error frecuente

Usar dimensiones en píxeles (px) fijos en lugar de dp para layouts y sp para textos. Los px no escalan con la densidad de pantalla — en un móvil de alta resolución un botón de 100px quedará microscópico. Usar siempre dp/sp.

🙋 Pregunta para el alumno

¿Qué diferencia hay entre dp y sp? ¿Por qué el texto usa sp en lugar de dp? Pista: piensa en la configuración de accesibilidad "Tamaño de texto" de tu móvil.

📋 Mini resumen

ConstraintLayout recomendado para layouts complejos. View = elemento (Button, TextView). ViewGroup = contenedor (LinearLayout, ConstraintLayout). Controles básicos: TextView, EditText, Button, RecyclerView. Material Design 3 proporciona el lenguaje visual de Android. Siempre dp para layouts, sp para textos.

05
Recursos de la Aplicación
Strings · Colors · Dimens · Themes · i18n · Drawables

📂 El directorio res/: todo lo que no es código

En Android, todo lo que no es lógica de programación va en la carpeta res/: textos, colores, dimensiones, imágenes, layouts, animaciones... Esta separación facilita la localización y la adaptación a diferentes dispositivos.

res/ ├── values/ ← strings.xml, colors.xml, themes.xml, dimens.xml ├── drawable/ ← Imágenes, vectores SVG, shapes XML ├── mipmap/ ← Iconos de la app (múltiples densidades) ├── layout/ ← Ficheros XML de layout (pantallas) ├── menu/ ← Menús XML ├── anim/ ← Animaciones ├── raw/ ← Archivos sin procesar (audio, JSON...) └── xml/ ← XML misceláneos
// Acceder a recursos desde código Kotlin
val texto  = getString(R.string.app_name)
val color  = getColor(R.color.primary)
val margen = resources.getDimensionPixelSize(R.dimen.margin_standard)
val icono  = getDrawable(R.drawable.ic_logo)

📝 strings.xml — Textos de la app

Todos los textos visibles deben estar en strings.xml, nunca escritos directamente en el código o el layout. Esto permite traducir la app a otro idioma simplemente creando una nueva carpeta de recursos.

<!-- res/values/strings.xml -->
<resources>
    <string name="app_name">Mi Aplicación</string>

    <!-- String con parámetro -->
    <string name="hello">¡Hola, %1$s!</string>

    <!-- Array de strings -->
    <string-array name="paises">
        <item>España</item>
        <item>México</item>
    </string-array>

    <!-- Plurales (1 mensaje / 5 mensajes) -->
    <plurals name="num_mensajes">
        <item quantity="one">%d mensaje</item>
        <item quantity="other">%d mensajes</item>
    </plurals>
</resources>

🎨 colors.xml, dimens.xml y themes.xml

<!-- colors.xml — paleta de colores -->
<resources>
    <color name="primary">#6200EE</color>
    <color name="secondary">#03DAC6</color>
    <!-- Transparencia: formato ARGB (80 = 50% opacidad) -->
    <color name="semi_transparent">#80000000</color>
</resources>

<!-- dimens.xml — dimensiones en dp y sp -->
<resources>
    <dimen name="margin_small">8dp</dimen>
    <dimen name="margin_standard">16dp</dimen>
    <dimen name="text_size_title">18sp</dimen>  <!-- sp para textos -->
    <dimen name="button_height">48dp</dimen>   <!-- dp para layouts -->
</resources>

<!-- themes.xml — aspecto visual global -->
<style name="Theme.MiApp"
    parent="Theme.MaterialComponents.DayNight.DarkActionBar">
    <item name="colorPrimary">@color/primary</item>
    <item name="colorSecondary">@color/secondary</item>
</style>
💡 dp vs sp — la diferencia importante

dp (density-independent pixels) — para tamaños de layout. 1dp = mismo tamaño visual en todas las pantallas independientemente de la resolución.
sp (scale-independent pixels) — para tamaños de texto. Como los dp, pero además respeta la configuración de accesibilidad del usuario (tamaño de fuente aumentado).

🌍 Internacionalización (i18n) y Drawables

# i18n — Carpetas por idioma res/values/ ← Idioma por defecto res/values-es/ ← Español res/values-fr/ ← Francés res/values-de/ ← Alemán res/values-pt-rBR/ ← Portugués de Brasil

Android selecciona automáticamente los recursos según el idioma del dispositivo. Solo hay que duplicar el strings.xml en cada carpeta con las traducciones.

<!-- Vector Drawable — icono escalable a cualquier densidad -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="24dp" android:height="24dp"
    android:viewportWidth="24" android:viewportHeight="24">
    <path
        android:fillColor="@color/primary"
        android:pathData="M9,16.17L4.83,12l-1.42,1.41L9,19 21,7l-1.41,-1.41z"/>
</vector>

<!-- Shape Drawable — fondo redondeado sin imagen bitmap -->
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <solid android:color="@color/primary"/>
    <corners android:radius="8dp"/>
    <padding android:left="16dp" android:top="8dp"
             android:right="16dp" android:bottom="8dp"/>
</shape>
📱 Vector Drawables: ¿por qué usarlos?

Las imágenes bitmap (PNG, JPG) necesitan versiones para cada densidad de pantalla (mdpi, hdpi, xhdpi, xxhdpi...). Los Vector Drawables son archivos XML que describen formas matemáticas — escalan perfectamente a cualquier tamaño con un solo archivo.

🙋 Pregunta para el alumno

¿Por qué es importante no escribir strings directamente en el código XML del layout? Piensa en una app que quieres lanzar en España y en México — ¿qué pasos tendrías que dar para que esté en español de ambos países?

📋 Mini resumen

Todo lo no-código va en res/. strings.xml para textos (nunca hardcoded). colors.xml para colores. dimens.xml: dp para layouts, sp para textos. themes.xml para apariencia global. i18n con carpetas values-XX/. Vector Drawables para iconos escalables.

🏋️
Actividades Prácticas
7 ejercicios para consolidar el aprendizaje

Ejercicios en orden creciente de complejidad. Pueden usarse en clase o como tarea.

1
Hello World
Instalar Android Studio, crear proyecto «Hello World» con plantilla Empty Activity, ejecutarlo en el emulador. Localizar en la estructura el archivo MainActivity.kt y activity_main.xml.
2
Exploración del Manifest
Abrir AndroidManifest.xml y build.gradle.kts. Identificar: nombre del paquete, versiones minSdk/targetSdk, permisos declarados y la Activity marcada como MAIN/LAUNCHER.
3
Emulador AVD
Crear un AVD con configuración Pixel 7 / API 34. Lanzar la app. Explorar las opciones de depuración: simular ubicación GPS, cambiar orientación, simular batería baja.
4
UI con ConstraintLayout
Diseñar un layout con ConstraintLayout que incluya: un TextView (título), un EditText (entrada de nombre), un Button (acción) y un ImageView. Todos los textos en strings.xml.
5
Ciclo de vida en Logcat
Implementar Log.d() en todos los métodos del ciclo de vida (onCreate, onStart, onResume, onPause, onStop, onDestroy). Observar el orden en Logcat al girar el teléfono o al recibir una llamada.
6
App con Intents
Crear una app con tres botones que usen Intents implícitos: abrir el navegador web, marcar un número de teléfono y abrir el compartidor de contenido de texto.
7
Recursos completos
Crear strings.xml con 5+ strings, colors.xml con paleta de 4 colores y dimens.xml con márgenes. Referenciarlos desde el layout XML. Añadir soporte para español e inglés.

💬 Reflexiones rápidas para clase

📝 Explica con tus palabras
¿Qué diferencia hay entre un Service y un BroadcastReceiver? Da un ejemplo real de cuándo usarías cada uno.
🔗 Relaciona con app real
Spotify tiene música en segundo plano y notificaciones de control. ¿Qué componente de Android usa para la reproducción? ¿Y para mostrar los controles en el panel de notificaciones?
🔍 Detecta el error
Un alumno crea una Activity nueva pero al ejecutar la app hace crash. El código de la Activity está perfecto. ¿Qué ha olvidado hacer? ¿En qué archivo y qué añadiría exactamente?
🏗️ Completa el esquema
Ordena los métodos del ciclo de vida de Activity de inicio a destrucción. ¿Cuál se llama al girar el teléfono? ¿Y al recibir una llamada cuando estás en la app?
📖
Glosario de términos
Definiciones claras de todos los conceptos técnicos del tema
Android (SO)
Sistema operativo para móviles basado en Linux, desarrollado por Google y publicado como código abierto (AOSP). Lanzado en 2008.
API Level
Número entero que identifica la versión del framework de Android. Cada versión añade o modifica APIs. El desarrollador define minSdkVersion y targetSdkVersion.
ART (Android Runtime)
Entorno de ejecución de apps Android desde Android 5.0. Usa compilación AOT (al instalar) y JIT (en ejecución) para máximo rendimiento.
AOT (Ahead-Of-Time)
Técnica de compilación que traduce el bytecode .dex a código máquina nativo en el momento de la instalación, mejorando el arranque.
JIT (Just-In-Time)
Técnica de compilación que optimiza el código más usado en tiempo de ejecución, completando la optimización que AOT no pudo hacer al instalar.
Activity
Componente Android que representa una pantalla con interfaz de usuario. Tiene su propio ciclo de vida (onCreate, onResume...) que hay que gestionar.
Service
Componente Android para ejecutar tareas en segundo plano sin interfaz visible. Ej: reproducir música, descargar archivos, sincronizar datos.
BroadcastReceiver
Componente que escucha y reacciona a eventos del sistema (batería baja, arranque, cambio de red) o de otras aplicaciones.
ContentProvider
Componente que gestiona y comparte datos entre aplicaciones de forma estructurada. Proporciona API query/insert/update/delete.
AndroidManifest.xml
Archivo de configuración central de cada app Android. Declara permisos, registra componentes y define la Activity de arranque.
Intent
Mensaje que permite la comunicación entre componentes. Explícito: especifica el destino (navegación interna). Implícito: declara la acción y el sistema elige quién la satisface.
Fragment
Porción de UI reutilizable que vive dentro de una Activity. Tiene su propio ciclo de vida. Permite diseños adaptables para diferentes tamaños de pantalla.
Android Studio
IDE oficial de Android, basado en IntelliJ IDEA. Gratuito, multiplataforma (Windows/Mac/Linux). Incluye emulador, editor visual y profiler.
SDK (Software Development Kit)
Conjunto de herramientas de desarrollo Android: compiladores, emulador, APIs, librerías. Gestionado por el SDK Manager de Android Studio.
ADB (Android Debug Bridge)
Herramienta de línea de comandos para comunicarse con un dispositivo (real o emulador). Permite instalar APKs, ver logs, transferir archivos y abrir una shell.
AVD (Android Virtual Device)
Emulador de dispositivo Android creado con el AVD Manager. Permite probar apps en múltiples versiones y tamaños de pantalla sin hardware físico.
ConstraintLayout
Layout de Android que posiciona elementos mediante restricciones entre ellos. Es el más recomendado por Google porque evita anidamiento y mejora el rendimiento.
View / ViewGroup
View = elemento básico de UI (Button, TextView, ImageView). ViewGroup = contenedor que organiza Views (LinearLayout, ConstraintLayout).
dp (density-independent pixels)
Unidad de medida para layouts Android que garantiza el mismo tamaño visual en pantallas de diferente densidad. 1dp ≈ 1px en pantalla de 160dpi.
sp (scale-independent pixels)
Como dp, pero además escala con la preferencia de tamaño de texto del usuario. Se usa exclusivamente para tamaños de tipografía.
Material Design 3
Sistema de diseño de Google para interfaces Android. Define componentes, colores dinámicos, tipografía y movimiento. La versión actual (Material You) genera paletas desde el fondo de pantalla.
R (clase autogenerada)
Clase Java/Kotlin generada automáticamente por Android que proporciona IDs numéricos para todos los recursos: R.string.app_name, R.layout.activity_main, etc.
HAL (Hardware Abstraction Layer)
Capa de abstracción de hardware en la arquitectura Android. Proporciona interfaces estándar para que el framework acceda al hardware sin depender del fabricante.
GMS (Google Mobile Services)
Conjunto de servicios propietarios de Google (Maps, Gmail, Play Store...). Los fabricantes necesitan licencia de Google para incluirlos en sus dispositivos.
AOSP (Android Open Source Project)
El código fuente abierto de Android (licencia Apache 2.0). Huawei y Amazon, por ejemplo, basan sus sistemas en AOSP sin usar los servicios GMS de Google.
Fragmentación (Android)
Coexistencia de múltiples versiones de Android activas en el mercado. Ej: Android 14 (~30%), 13 (~25%), 12 (~18%), 11 o inferior (~27%). Principal reto para desarrolladores.
build.gradle.kts
Archivo de configuración de compilación del proyecto. Define dependencias de librerías, versión mínima y objetivo del SDK, plugins y otras opciones de compilación.
Resumen del Tema 2
Los fundamentos de Android para empezar a desarrollar

Con el Tema 2 dominas los cimientos necesarios para construir cualquier app Android:

01
Historia y Arquitectura
Android = 2003, Google 2005, HTC Dream 2008. 5 capas: Kernel→HAL→ART→Framework→Apps. ART con AOT+JIT. ~3.000M usuarios activos.
02
Entorno de Desarrollo
Android Studio: IDE oficial, gratuito. SDK Manager gestiona versiones. AndroidManifest = registro central. AVD para emulación. ADB para comunicarse con el dispositivo.
03
Componentes de App
4 componentes: Activity (UI), Service (background), BroadcastReceiver (eventos), ContentProvider (datos). Ciclo de vida de Activity crítico. Intents para comunicación.
04
Interfaz de Usuario
ConstraintLayout recomendado. Views y ViewGroups. Controles básicos: TextView, EditText, Button, RecyclerView. Material Design 3. dp para layouts, sp para textos.
05
Recursos
strings.xml (textos), colors.xml, dimens.xml, themes.xml. Internacionalización con values-XX/. Vector Drawables escalables. Acceso por clase R.
Conclusión del tema

Android es el sistema operativo más usado del planeta. Comprenderlo a nivel arquitectónico, dominar su entorno de desarrollo y conocer sus bloques fundamentales (componentes, ciclo de vida, recursos) te da la base para construir apps reales que llegan a más de 3.000 millones de personas. El siguiente paso: construir.

🔗 Recursos oficiales

🤖 Android Developers
developer.android.com — Documentación oficial completa de Android.
🛠️ Android Studio
developer.android.com/studio — Descarga oficial e instalación.
🎨 Material Design
material.io/design — Sistema de diseño oficial de Google.
📊 API Levels
apilevels.com — Referencia rápida de versiones y distribución.
🦺 Kotlin Docs
kotlinlang.org/docs — Documentación oficial del lenguaje Kotlin.