Buch lesen: «El gran libro de Android»
El gran libro de Android
Jesús Tomás Gironés
Beatriz Tirado Gil
El gran libro de Android
Jesús Tomás Gironés
Beatriz Tirado Gil
El gran libro de Android
Séptima edición, 2018
Primera reimpresión revisada, 2020
© 2018 Jesús Tomás Gironés y Beatriz Tirado Gil
© MARCOMBO, S.A. 2018
Diseño de la cubierta: ENEDENÚ DISEÑO GRÁFICO
Corrección: Raquel Sayas Lloris
Cualquier forma de reproducción, distribución, comunicación pública o transformación de esta obra solo puede ser realizada con la autorización de sus titulares, salvo excepción prevista por la ley. Diríjase a CEDRO (Centro Español de Derechos Reprográficos, www.cedro.org) si necesita fotocopiar o escanear algún fragmento de esta obra.
ISBN: 978-84-26727-37-4
Producción del ebook: booqlab.com
Para Bea, con amor y gratitud.
Mis agradecimientos a los alumnos y lectores que con sus sugerencias y correcciones han ayudado a mejorar este libro.
Índice general
Lista de siglas y acrónimos
¿Cómo leer este libro?
CAPÍTULO 1. Visión general y entorno de desarrollo
1.1. ¿Qué hace que Android sea especial?
1.2. Los orígenes
1.3. Comparativa con otras plataformas
1.4. Arquitectura de Android
1.4.1. El núcleo Linux
1.4.2. Runtime de Android
1.4.3. Librerías nativas
1.4.4. Entorno de aplicación
1.4.5. Aplicaciones
1.5. Instalación del entorno de desarrollo
1.5.1. Instalación de la máquina virtual Java
1.5.2. Instalación de Android Studio
1.5.3. Creación de un dispositivo virtual Android (AVD)
1.6. Las versiones de Android y niveles de API
1.6.1. Las primeras versiones
1.6.2. Cupcake
1.6.3. Donut
1.6.4. Éclair
1.6.5. Froyo
1.6.6. Gingerbread
1.6.7. Honeycomb
1.6.8. Ice Cream Sandwich
1.6.9. Jelly Bean
1.6.10. KitKat
1.6.11. Lollipop
1.6.12. Marshmallow
1.6.13. Android Nougat
1.6.14. Android Oreo
1.6.15. Android Pie
1.6.16. Android 10
1.6.17. Elección de la plataforma de desarrollo
1.6.18. Las librerías de compatibilidad (support library)
1.7. Creación de un primer programa
1.8. Ejecución del programa
1.8.1. Ejecución en el emulador
1.8.2. Ejecución en un terminal real
1.9. Ficheros y carpetas de un proyecto Android
1.10. Componentes de una aplicación
1.10.1. Vista (View)
1.10.2. Layout
1.10.3. Actividad (Activity)
1.10.4. Fragmentos (Fragment)
1.10.5. Servicio (Service)
1.10.6. Intención (Intent)
1.10.7. Receptor de anuncios (Broadcast Receiver)
1.10.8. Proveedores de contenido (Content Provider)
1.11. Documentación y aplicaciones de ejemplo
1.11.1. Dónde encontrar documentación
1.11.2. Repositorio de ejemplos en GitHub
1.12. Depurar
1.12.1. Depurar con el entorno de desarrollo
1.12.2. Depurar con mensajes Log
1.13. Introducción Java/Kotlin y aplicación Mis Lugares
1.13.1. La clase Lugar
1.13.2. Tipos enumerados
1.13.3. Las colecciones I
1.13.4. Las colecciones II
CAPÍTULO 2. Diseño de la interfaz de usuario: vistas y layouts
2.1. Creación de una interfaz de usuario por código
2.2. Creación de una interfaz de usuario usando XML
2.2.1. Edición visual de las vistas
2.2.2. Los atributos de las vistas
2.3. Layouts
2.3.1. Uso de ConstraitLayout
2.4. Una aplicación de ejemplo: Asteroides
2.5. La aplicación Mis Lugares
2.6. Recursos alternativos
2.7. Tipos de recursos y recursos del sistema
2.7.1. Tipos de recursos
2.7.2. Acceso a los recursos
2.7.3. Recursos del sistema
2.8. Estilos y temas
2.8.1. Los estilos
Heredar de un estilo propio
2.8.2. Los temas
2.9. Uso práctico de vistas y layouts
2.9.1. Acceder y modificar propiedades de las vistas por código
2.10. Uso de tabs (pestañas)
CAPÍTULO 3. Actividades e intenciones
3.1. Creación de nuevas actividades
3.2. Comunicación entre actividades
3.3. Añadiendo un menú a una actividad
3.4. La barra de acciones (Toolbar)
3.5. Acceder a objetos globales de la aplicación
3.5.1. La clase Application
3.5.2. Uso del patrón Singleton
3.6. Uso de la arquitectura Clean en Mis Lugares
Capa de Modelo
Capa de Datos
Capa de Casos de Uso
Capa de Presentación
Organizando las clases en paquetes
3.7. Creando actividades en Mis Lugares
3.7.1. Creando la actividad VistaLugarActivity
3.7.2. Creando la actividad EdicionLugarActivity
3.8. Creación y uso de iconos
3.9. Añadiendo preferencias de usuario
3.9.1. Organizando preferencias
3.9.2. Cómo se almacenan las preferencias de usuario
3.9.3. Accediendo a los valores de las preferencias
3.9.4. Verificar valores correctos<opcional>
3.10. Añadiendo una lista de puntaciones en Asteroides
3.11. Creación de listas con RecyclerView
3.12. Las intenciones
3.12.1. Añadiendo fotografías en Mis Lugares
Cargar fotografías grandes de forma eficiente
CAPÍTULO 4. Gráficos en Android
4.1. Clases para gráficos en Android
4.1.1. Canvas
4.1.2. Paint
Definición de colores
4.1.3. Path
4.1.4. Drawable
BitmapDrawable
VectorDrawable
GradientDrawable
TransitionDrawable
ShapeDrawable
AnimationDrawable
4.2. Creación de una vista en un fichero independiente
4.3. Creando la actividad principal de Asteroides
4.3.1. La clase Gráfico
4.3.2. La clase VistaJuego
4.3.3. Introduciendo la nave en VistaJuego
4.4. Representación de gráficos vectoriales en Asteroides
4.5. Animaciones
4.5.1. Animaciones de vistas
4.5.2. Animaciones de propiedades
CAPÍTULO 5. Hilos de ejecución, pantalla táctil y sensores
5.1. Uso de hilos de ejecución (threads)
5.1.1. Introducción a los procesos e hilos de ejecución
5.1.2. Hilos de ejecución en Android
5.1.3. Creación de nuevos hilos con la clase Thread
5.1.4. Introduciendo movimiento en Asteroides
5.1.5. Ejecutar una tarea en un nuevo hilo con AsyncTask
5.1.6. Mostrar un cuadro de progreso en un AsyncTask
5.1.7. El método get() de AsyncTask
5.2. Manejando eventos de usuario
5.2.1. Escuchador de eventos de la clase View
5.2.2. Manejadores de eventos
5.3. El teclado
5.4. La pantalla táctil
5.4.1. Manejo de la pantalla táctil multi-touch
5.4.2. Manejo de la nave con la pantalla táctil
5.5. Los sensores
5.5.1. Un programa que muestra los sensores disponibles y sus valores en tiempo real
5.5.2. Utilización de los sensores en Asteroides
5.5.3. Restricciones al uso de sensores en segundo plano en Android 9
5.6. Introduciendo un misil en Asteroides
CAPÍTULO 6. Multimedia y ciclo de vida de una actividad
6.1. Ciclo de vida de una actividad
6.1.1. ¿Qué proceso se elimina?
6.1.2. Guardando el estado de una actividad
6.2. Utilizando multimedia en Android
6.3. La vista VideoView
6.4. La clase MediaPlayer
6.4.1. Reproducción de audio con MediaPlayer
6.5. Un reproductor multimedia paso a paso
6.6. Introduciendo efectos de audio con SoundPool
6.7. Grabación de audio
CAPÍTULO 7. Seguridad y posicionamiento
7.1. Los tres pilares de la seguridad en Android
7.1.1. Ejecución en procesos independientes Linux
7.1.2. Firma digital de los apks
7.1.3. El esquema de permisos en Android
7.1.4. Permisos desde Android 6 Marshmallow
7.1.5. Permisos definidos por el programador en Android
7.1.6. Cambios relacionados con la privacidad en Android 9
7.2. Localización
7.2.1. Sistemas de geolocalización en dispositivos móviles
7.2.2. La API de localización de Android
7.2.3. Emulación del GPS con Android Studio
7.2.4. Estrategias para escoger un proveedor de localización
7.2.5. Límites de ubicación en segundo plano
7.3. Google Maps
7.3.1. Obtención de una clave Google Maps
7.4. Fragmentando los asteroides
CAPÍTULO 8. Servicios, notificaciones y receptores de anuncios
8.1. Introducción a los servicios en Android
8.1.1. Ciclo de vida de un servicio
8.1.2. Permisos
8.2. Un servicio para ejecución en segundo plano
8.2.1. El método onStartCommand()
8.3. Un servicio en un nuevo hilo con IntentService
8.3.1. La clase IntentService
8.4. Las notificaciones de la barra de estado
8.4.1. Configurando tipos de avisos en las notificaciones
Asociar un sonido
Añadiendo vibración
Añadiendo parpadeo de LED
8.4.2. Servicios en primer plano
8.5. Receptores de anuncios
8.5.1. Receptor de anuncios registrado en AndroidManifest.xml
8.5.2. Arrancar una actividad en una nueva tarea desde un receptor de anuncio
8.5.3. Arrancar un servicio tras cargar el sistema operativo
8.5.4. Anuncios broadcast permanentes
8.6. Un receptor de anuncios como mecanismo de comunicación
8.7. Un servicio como mecanismo de comunicación entre aplicaciones
8.7.1. Crear la interfaz en AIDL
8.7.2. Implementar la interfaz
8.7.3. Publicar la interfaz en un servicio
8.7.4. Llamar a una interfaz remota
CAPÍTULO 9. Almacenamiento de datos
9.1. Alternativas para guardar datos permanentemente en Android
9.2. Añadiendo puntuaciones en Asteroides
9.3. Preferencias
9.4. Accediendo a ficheros
9.4.1. Sistema interno de ficheros
9.4.2. Sistema de almacenamiento externo
Verificando acceso a la memoria externa
Almacenando ficheros específicos de tu aplicación en el almacenamiento externo
Almacenando ficheros compartidos en el almacenamiento externo
Almacenando externo con varias unidades
9.4.3. Acceder a un fichero de los recursos
9.5. Trabajando con XML
9.5.1. Procesando XML con SAX
9.5.2. Procesando XML con DOM
9.6. Trabajando con JSON
9.6.1. Procesando JSON con la librería Gson
9.6.2. Procesando JSON con la librería org.json
9.7. Bases de datos con SQLite
9.7.1. Los métodos query() y rawQuery()
9.7.2. Uso de bases de datos en Mis Lugares
9.7.3. Adaptadores para bases de datos
Operaciones con bases de datos en Mis Lugares
Loaders y LoaderManager
9.7.4. Bases de datos relacionales
9.7.5. El método onUpgrade de la clase SQLiteOpenHelper
9.8. Content Provider
9.8.1. Conceptos básicos
El modelo de datos
Las URI
9.8.2. Acceder a la información de un ContentProvider
Leer información de un ContentProvider
Escribir información en un ContentProvider
Borrar y modificar elementos de un ContentProvider
9.8.3. Creación de un ContentProvider
Definir la estructura de almacenamiento del ContentProvider
Extendiendo la clase ContentProvider
Declarar el ContentProvider en AndroidManifest.xml
9.8.4. Acceso a PuntuacionesProvider desde Asteroides
CAPÍTULO 10. Internet: sockets, HTTP y servicios web
10.1. Comunicaciones en Internet mediante sockets
10.1.1. La arquitectura cliente/servidor
10.1.2. ¿Qué es un socket?
Sockets stream (TCP)
Sockets datagram (UDP)
10.1.3. Un ejemplo de un cliente/servidor de ECHO
10.1.4. Un servidor por sockets para las puntuaciones
10.2. La web y el protocolo HTTP
10.2.1. El protocolo HTTP
10.2.2. Versión 1.0 del protocolo HTTP
10.2.3. Utilizando HTTP desde Android
10.2.4. Uso de HTTP con AsyncTask
10.3. La librería Volley
10.3.1. Descargar un String con Volley
10.3.2. Paso de parámetros con el método POST
10.3.3. Descargar imágenes con Volley
10.4. Servicios web
10.4.1. Alternativas en los servicios web
Servicios web basados en SOAP
Servicios web basados en REST
10.4.2. Acceso a servicios web de terceros
10.4.3. Un servicio web con Apache, PHP y MySQL
Utilizando el servicio web PHP desde Asteroides
Creación de un servicio web en un servidor de hosting
Utilizando AsyncTask de forma síncrona
10.4.4. Comparativa sockets/servicios web
ANEXO A. Fragments
ANEXO B. Diálogos de fecha y hora
Clases para trabajar con fechas en Java
ANEXO C. Referencia Java
ANEXO D. Referencia de la clase View y sus descendientes
ANEXO E. Sufijos utilizados en recursos alternativos
Lista de siglas y acrónimos
AIDL | Android Interface Definition Language |
API | Application Programming Interface |
AVD | Android Virtual Device |
ART | Android RunTime |
CSS | Cascading Style Sheets |
CORBA | Common Object Request Broker Architecture |
CPU | Central Processing Unit |
DOM | Document Object Model |
DTD | Document Type Definition |
FTP | File Transfer Protocol |
GPU | Graphic Processing Unit |
GPS | Global Positioning System |
GSM | Global System for Mobile communications |
HTML | HyperText Markup Language |
HTTP | HyperText Transfer Protocol |
IDE | Integrated Development Environment |
IMEI | International Mobile Equipment Identity |
IMSI | International Mobile Subscriber Identity |
IU | Interfaz de Usuario |
JAR | Java ARchive |
JDK | Java Development Kit |
JRE | Java Runtime Environment |
JSON | JavaScript Object Notation |
JVM | Java Virtual Machine |
MCC | Mobile Country Code |
MNC | Mobile Network Code |
MIME | Multipurpose Internet Mail Extensions |
MTP | Media Transfer Protocol |
NFC | Near Field Communication |
NDK | Native Development Kit |
OpenGL | Open Graphic Library |
PCM | Pulse-Code Modulation |
PDA | Personal Digital Assistant |
PNG | Portable Network Graphics |
PHP | Hypertext Pre-processor |
PTP | Picture Transfer Protocol |
RAM | Random Access Memory |
REST | Representational State Transfer |
RMI | Remote Method Invocation |
RPC | Remote Procedure Calls |
SAX | Simple API for XML |
SD | Secure Digital |
SDK | Software Developers Kit |
SMS | Short Message Service |
SIM | Subscriber Identity Module |
SO | Sistema Operativo |
SOA | Service-Oriented Architecture |
SOAP | Simple Object Access Protocol |
SQL | Structured Query Language |
SVG | Scalable Vector Graphics |
TCP | Transmission Control Protocol |
UI | User Interface |
URL | Universal Resource Locator |
URI | Uniform Resource Identifier |
USB | Universal Serial Bus |
UTC | Universal Time Coordinate |
UICC | Universal Integrated Circuit Card |
W3C | World Wide Web Consortium |
WSDL | Web Services Description Language |
WWW | World Wide Web |
XML | Extensible Markup Language |
¿Cómo leer este libro?
Este libro quiere ser una guía para aquellos lectores que pretendan introducirse en la programación de Android. Se ha estructurado en 10 capítulos que abordan aspectos específicos del desarrollo de aplicaciones. Resulta conveniente realizar una lectura secuencial de estos capítulos, dado que muchos de los conceptos que se abordan se comprenderán mejor si se han leído los capítulos anteriores. Además, a lo largo del libro se desarrollan dos proyectos de ejemplo: el mítico juego Asteroides y la aplicación Mis Lugares. Para que muchos de los ejercicios funcionen correctamente, resulta imprescindible realizar los anteriores. Si el lector está interesado en un texto que aborde aspectos específicos de la programación en Android, le recomendamos otros libros de esta misma colección: El gran libro de Android Avanzado, Firebase: Trabajando en la nube, Plataformas Android: Wear, TV, Auto y Google Play Games y Android Things y Visión Artificial. Todos publicados en esta misma editorial.
El libro que tienes entre las manos no ha sido concebido solo para ser leído. Es más bien una guía estructurada que te irá proponiendo una serie de ejercicios, actividades, vídeos explicativos, test de autoevaluación, etc. Todo este material y muchos más recursos adicionales están disponibles en la web www.androidcurso.com. En ella se publicarán las novedades, erratas e información complementaria relativas a este libro. Por lo tanto, resulta imprescindible para sacarle partido a este libro un ordenador con el SDK de Android instalado para hacer los ejercicios y acceso a Internet para el material en línea.
A lo largo del libro se utilizan los siguientes iconos para indicar los tipos de actividades:
Objetivos: Antes de empezar cada capítulo, lee con detenimiento la introducción y los objetivos.
Vídeo[tutorial]: Más de 80 vídeos grabados por el autor del libro donde se exponen de forma didáctica los aspectos clave del sistema Android. Se utiliza una moderna herramienta desarrollada en la Universidad Politécnica de Valencia que te permitirá ver simultáneamente las presentaciones y al profesor mientras se desarrollan los conceptos de cada capítulo.
Ejercicio: La mejor forma de aprender es haciendo. No tendrás más que ir siguiendo los pasos uno tras otro para descubrir cómo se resuelve el ejercicio propuesto. Para que no se te haga pesado teclear todo el código, te proponemos que lo copies y pegues desde la página web del curso.
Práctica: Este será el momento de que tomes la iniciativa y trates de resolver el problema que se propone. Recuerda que para aprender hay que practicar.
Asteroides: Ejercicios y prácticas que te permitirán desarrollar el videojuego Asteroides.
Mis Lugares: Ejercicios y prácticas que te permitirán desarrollar la aplicación Mis Lugares.
Solución: Te será de ayuda si tienes problemas al resolver una práctica, o si simplemente quieres comparar tu solución con otra diferente.
Nota sobre Java: Si no dominas el lenguaje de programación Java, podrás seguir este libro. Cada vez que aparezca algún concepto complejo sobre Java trataremos de aclararlo. NOTA: Sí que resulta imprescindible disponer de conocimientos sobre programación.
Recursos adicionales: Te proporcionamos la información clave que te ayudará en el desarrollo de tus aplicaciones.
Enlaces de interés: Internet te será de gran ayuda para completar la información necesaria para programar en Android. Te proponemos las páginas más interesantes de cada apartado.
Preguntas de repaso: ¿Has comprendido correctamente los aspectos clave? Sal de dudas haciendo los test de autoevaluación.
Referencias rápidas: Utiliza los anexos para localizar rápidamente esa palabra clave o esa clase que no recuerdas.
Trivial programación Android: Instálate esta app y mide tus conocimientos jugando en red contra otros oponentes.
De forma adicional, en la web www.androidcurso.com encontrarás:
• Tutoriales sobre Java: ¿Sabes lo que es la herencia, el polimorfismo o la sobrecarga en Java? Si no dominas el lenguaje de programación Java, te recomendamos que realices alguno de los tutoriales propuestos.
• Código abierto de proyectos Android: Muchos alumnos que han realizado un curso basado en este libro han tenido la generosidad de compartir sus proyectos con todos nosotros. Te recomendamos que consultes la lista de proyectos disponibles de código abierto: puedes aprender mucho estudiando su código. Cuando termines de leer este libro, también tú podrás hacer un proyecto como los que se muestran.
• Material adicional sobre Android: Encontrarás, además, nuevos tutoriales, vídeos, referencias, etc., no incluidos en el libro.
• Cursos online: Si te interesa ampliar tu formación, puedes matricularte en cursos sobre Android impartidos por la Universidad Politécnica de Valencia en la plataforma EdX. Incluso puedes obtener un título de Especialización o de Máster de forma 100 % online.