Prólogo
1. Introducción 17
2. ¿A quién se dirige este libro? 18
3. Conocimientos previos necesarios para abordar este libro 18
4. Objetivos 19
5. Descarga 20
6. Información complementaria 20
7. Recursos 21
El universo Android
1. Introducción 23
2. Presentación de Android 23
2.1 Open Handset AllianceTM 24
2.2 Historia 24
2.3 Versiones de Android 26
2.3.1 Cronología de las versiones 26
2.3.2 Reparto de las distribuciones Android 30
2.4 Arquitectura 31
3. Entorno de desarrollo 33
3.1 Requisitos previos 33
3.2 Android Studio 34
3.2.1 Descarga 34
3.2.2 Instalación 35
Primeros pasos
1. Primer proyecto de Android 47
1.1 Creación del proyecto 47
1.2 Organización del proyecto 54
1.3 Compilación de la aplicación 55
1.4 Ejecución de la aplicación 55
1.4.1 En el emulador de Android 56
1.4.2 En un dispositivo Android 58
2. Estructura de un proyecto Android 65
2.1 Estructura del proyecto 65
2.2 El manifiesto 68
2.2.1 Etiqueta manifest 70
2.2.2 Etiquetas uses-sdk 70
2.2.3 Etiqueta application 71
2.3 Los recursos 72
Descubrir la interfaz de usuario
1. Introducción 77
2. Pantallas 78
3. Actividades y Layout 85
4. Modo programático y modo declarativo 87
5. Vistas 89
6. Layouts 91
6.1 Creación en modo declarativo 92
6.2 Creación en modo programático 95
7. Widgets 96
7.1 Declaración 96
7.2 Uso 97
7.3 Descubrir algunos widgets 98
7.3.1 TextView (campo de texto) 98
7.3.2 EditText (campo para introducir texto) 101
7.3.3 Button (Botón) 102
7.3.4 Otros widgets 106
Los fundamentos
1. Introducción 107
2. Intención 108
2.1 Intención explícita 111
2.2 Intención implícita 112
2.2.1 Creación 112
2.2.2 Filtro de intención 113
2.3 Intención pendiente 116
3. Actividad 117
3.1 Declaración 117
3.2 Ciclo de vida 120
3.2.1 onCreate 120
3.2.2 onStart 121
3.2.3 onResume 122
3.2.4 onPause 122
3.2.5 onStop 123
3.2.6 onRestart 124
3.2.7 onDestroy 125
3.3 Ejecución 126
3.4 Salvaguarda y restauración del estado 128
3.5 Pila de actividades 129
Completar la interfaz de usuario
1. Introducción 133
2. Estilos y temas 133
3. Menús 135
3.1 Declaración 135
3.2 Uso 138
3.3 Menú de actividad 139
3.3.1 Creación 139
3.3.2 Uso 140
3.4 Menú contextual 142
3.4.1 Creación 142
3.4.2 Uso 143
4. Barra de acción 143
4.1 Opciones de menú 144
4.2 Icono de la aplicación 145
5. Notificaciones 146
5.1 Toast 146
5.2 Caja de diálogo 148
5.2.1 Generalidades 148
5.2.2 Caja de diálogo de alerta 149
5.3 Barra de notificación 153
5.3.1 Creación de una notificación 154
5.3.2 Envío de una notificación 158
6. Internacionalización 159
Componentes principales de la aplicación
1. Introducción 163
2. Fragmento 163
2.1 Integración del fragmento 165
2.1.1 Modo declarativo 165
2.1.2 Modo programático 166
2.2 Fragmentos y representación adaptativa 169
2.3 Ciclo de vida 171
2.3.1 onAttach 171
2.3.2 onCreateView 171
2.3.3 onActivityCreated 172
2.3.4 onDestroyView 173
2.3.5 onDetach 173
2.4 Salvaguarda y restauración del estado 174
2.5 Pila de fragmentos 174
3. Servicio 176
3.1 Declaración 177
3.2 Uso directo 178
3.3 Uso estableciendo una conexión 179
3.4 Ciclo de vida 182
3.4.1 onCreate 182
3.4.2 onStartCommand 183
3.4.3 onBind 183
3.4.4 onUnbind 184
3.4.5 onDestroy 185
4. Receptor de eventos 185
4.1 Evento 186
4.2 Declaración 187
4.3 Ciclo de vida 189
5. Lista 190
5.1 Implementación estándar 191
5.1.1 Layout de los elementos de la lista 192
5.1.2 Adaptadores 192
5.1.3 Implementación 193
5.2 Implementación específica 196
5.2.1 Layout de los elementos de la lista 197
5.2.2 Adaptador 197
5.3 Selección de un elemento 201
La persistencia de los datos
1. Introducción 203
2. Archivos de preferencias 203
2.1 Preparar el archivo 204
2.2 Lectura 205
2.3 Escritura 206
2.4 Borrado 208
3. Archivos 209
3.1 Almacenamiento interno 209
3.1.1 Escritura 209
3.1.2 Lectura 210
3.1.3 Eliminar un archivo 211
3.2 Almacenamiento externo 211
3.2.1 Disponibilidad del soporte 212
3.2.2 Accesos y ubicaciones 213
3.2.3 Archivos comunes 215
3.3 Archivos temporales 215
3.3.1 Almacenamiento interno 216
3.3.2 Almacenamiento externo 216
4. Bases de datos SQLite 217
4.1 Creación de una base de datos 217
4.2 Procedimientos y consultas SQL 219
4.2.1 Navegar los resultados 220
4.2.2 Lectura de datos 221
4.3 Actualizaciones 222
4.4 Optimización para la búsqueda de texto 224
4.4.1 Creación y completado de la tabla 225
4.4.2 Consulta 226
5. Proveedor de contenidos 228
5.1 Interfaz y URI 228
5.2 Consultas 229
5.3 Agregar un registro 232
5.4 Borrado de registros 232
6. Copia de seguridad en la nube 233
6.1 Suscribirse a Android Backup Service 234
6.2 Configuración de la clave 236
6.3 Agente de copia de seguridad 237
6.3.1 Configuración 238
6.3.2 BackupAgentHelper 238
6.4 Gestor de copia de seguridad 241
6.4.1 Solicitar una copia de seguridad 242
6.4.2 Probar el servicio 242
7. Tratamiento de JSON 243
7.1 Presentación del formato JSON 243
7.2 Interpretación del formato JSON 245
Construir interfaces complejas
1. Introducción 249
2. Crear sus propios componentes 250
2.1 Sobrecargar un componente existente 250
2.1.1 Extender una clase del paquete android.widget 250
2.1.2 Integrar el nuevo componente en un layout 252
2.1.3 Agregar atributos personalizados 252
2.2 Reunir un conjunto de componentes 255
2.3 Construir completamente un componente 256
2.3.1 Implementar onDraw() 256
2.3.2 Implementar onMeasure() 257
2.3.3 Obtener las dimensiones de la pantalla 258
3. Utilizar el Navigation Drawer 259
3.1 Implementar el panel de navegación 260
3.2 Usar el panel de navegación 262
3.2.1 Detectar los eventos de apertura/cierre 263
3.2.2 Navigation Drawer y ActionBar 264
3.2.3 Integrar el botón de apertura/cierre 265
3.2.4 Forzar la apertura del panel cuando se inicia la actividad 267
4. Crear imágenes redimensionables 267
4.1 Las imágenes 9-patch 267
4.1.1 Presentación 267
4.1.2 Crear imágenes 9-patch 270
4.2 Los drawables XML 273
4.2.1 Definir una forma en XML 273
4.2.2 Modificar la forma inicial 276
4.2.3 Combinar varias formas 280
5. Representación en pantalla compleja 282
5.1 Seleccionar el layout 282
5.2 Posicionamiento relativo 283
5.3 Utilizar los pesos 285
5.4 Un último detalle 290
Concurrencia, seguridad y red
1. Introducción 293
2. Procesos 293
2.1 android:process 294
2.2 Compartición de proceso 295
3. Programación concurrente 297
3.1 AsyncTask 298
3.2 Thread 302
3.2.1 Creación 302
3.2.2 runOnUIThread 304
3.2.3 Comunicación interthread 304
4. Seguridad y permisos 307
4.1 Los permisos antes de Marshmallow 308
4.2 Los permisos en Marshmallow 309
4.3 Declaración de los permisos 311
4.4 Restricción de uso 312
5. Red 314
5.1 Agente usuario 315
5.2 AndroidHttpClient 319
5.3 Uso de la biblioteca Volley 322
5.3.1 Integración de Volley 322
5.3.2 Peticiones de tipo cadena de caracteres 327
5.3.3 Agregar parámetros 330
5.3.4 Peticiones en formato JSON 330
5.3.5 Peticiones en formato Image 332
5.3.6 Otras peticiones 333
Redes sociales
1. Introducción 335
2. Integración estándar 336
2.1 Con Android 2.x y 3.x 336
2.2 Con Android 4.x 337
3. Integración completa 341
3.1 Obtener las claves de API 341
3.1.1 Crear una aplicación para Facebook 342
3.1.2 Otras redes sociales 344
3.2 Instalar el SDK SocialAuth-Android 345
3.2.1 Integración de las librerías con el proyecto 345
3.2.2 Uso de la API 346
Trazas, depuración y pruebas
1. Introducción 353
2. Registro de eventos 354
2.1 Consultar los eventos 355
2.2 Escribir eventos 357
3. Depuración 358
3.1 Depuración paso a paso 358
3.2 Android Device Monitor 359
3.2.1 Vista Emulator Control 363
3.2.2 Vista Threads 364
3.2.3 Vista Heap 365
3.2.4 Vista Allocation Tracker 366
3.2.5 Vista File Explorer 367
4. Pruebas unitarias y funcionales 367
4.1 Creación de un proyecto de pruebas 368
4.2 Creación de una clase de pruebas unitarias locales 369
4.3 Creación de una prueba para una actividad 371
5. Prueba del mono 374
Publicar una aplicación
1. Introducción 377
2. Preliminares 379
2.1 Versión de la aplicación 379
2.1.1 android:versionCode 379
2.1.2 android:versionName 380
2.1.3 Sobrecarga por Gradle 381
2.2 Filtros para el mercado 382
2.2.1 uses-feature 383
2.2.2 uses-configuration 384
3. Firma digital de la aplicación 384
3.1 Compilación en modo debug 385
3.2 Compilación en modo release 386
3.2.1 Protección del código 387
3.2.2 Firmar la aplicación 388
3.2.3 Instalar la aplicación 390
4. Producción de varias versiones 392
5. Publicación de la aplicación en Play Store 396
5.1 Inscripción 396
5.2 Publicación 405
5.2.1 Archivo .apk 407
5.2.2 Ficha en Google Play Store 407
5.2.3 Tarifas y disponibilidad 409
5.2.4 Coordenadas 410
5.2.5 Aceptar 410
5.3 ¿Y después? 411
Sensores y geolocalización
1. Introducción 413
2. Fundamentos 414
3. Detectar un sensor 414
4. Obtener los valores 417
5. Localización geográfica 420
5.1 Permisos 421
5.2 Gestor de localización 422
5.3 Recuperar los datos de localización 423
5.3.1 En caché 426
5.3.2 Una sola vez 426
5.3.3 Periódicamente 427
5.3.4 Detener las actualizaciones 429
6. Google Maps 429
6.1 Implementación 430
6.1.1 Instalación del SDK 430
6.1.2 Configuración de la aplicación 431
6.1.3 Obtener una clave de uso 431
6.2 Uso 435
6.2.1 Declaración de la vista 435
6.2.2 MapActivity 436
6.2.3 Geolocalización 437
La tecnología NFC
1. Introducción 441
2. La tecnología NFC 441
2.1 Los escenarios de uso de NFC 442
2.2 Los tags NFC 442
3. Compatibilidad con NFC 444
3.1 Usar con un emulador 444
3.2 Detectar si el dispositivo es compatible con NFC 445
3.2.1 Filtrado por dispositivo 445
3.2.2 Comprobación en tiempo de ejecución 446
3.2.3 Activación por el usuario 446
4. Descubrir un tag NFC 446
4.1 Compatibilidad con una intenciónACTION_NDEF_DISCOVERED 448 4.2 Compatibilidad con una intención ACTION_TECH_DISCOVERED 449 4.3 Compatibilidad con una intención ACTION_TAG_DISCOVERED 451
4.4 Android Application Records 452
4.5 Foreground dispatch 452
5. Leer un tag NFC 455
5.1 Determinar el contenido de un tag NDEF 455
5.2 Leer una URI 456
5.3 Leer una cadena de caracteres 458
5.4 Leer un tipo MIME 459
5.5 Leer un tag de tipo TNF_WELL_KNOWN 459
6. Escribir un tag NFC 460
6.1 Definir un registro NdefRecord con la API 9 461
6.1.1 Contruir un payload de tipo texto 462
6.1.2 Construir un payload de tipo URI 463
6.2 Definir un registro NdefRecord con las API 14 y 16 464
Objetos conectados
1. Introducción 467
2. Detección y conexión 468
2.1 Permisos 468
2.2 Inicialización 469
2.3 Búsqueda de dispositivos BLE 470
2.3.1 Búsqueda en Jelly Bean 470
2.3.2 Búsqueda en Lollipop 472
2.3.3 Aplicar filtros durante la búsqueda 474
2.4 Conexión 478
3. Intercambio de información/interacciones 480
3.1 Descubrir los servicios 480
3.2 Leer una característica 483
3.3 Escribir un valor 486
Funcionalidades avanzadas
1. Introducción 489
2. App Widget 489
2.1 Creación 490
2.2 Declaración 491
2.3 Configuración 492
2.4 Ciclo de vida 494
2.4.1 onEnabled 495
2.4.2 onDisabled 495
2.4.3 onUpdate 496
2.4.4 onDeleted 496
2.5 RemoteViews 497
2.6 Actividad de configuración 499
2.6.1 Declaración 500
2.6.2 Creación 501
3. Proteger las aplicaciones de pago 503
3.1 Instalación de la LVL 504
3.1.1 Descarga 504
3.1.2 Integración de la LVL en el código fuente 506
3.2 Uso de la LVL 506
3.2.1 Política 506
3.2.2 Ofuscación 507
3.2.3 Verificación de la licencia 509
3.3 Probar 511
3.3.1 Probar en un dispositivo Android 516
3.3.2 Probar en un emulador 517
4. Proponer compras integradas 517
4.1 Preparación 518
4.2 Uso del pago integrado 520
4.2.1 Iniciar la comunicación con Play Store 520
4.2.2 Obtener la lista de productos 521
4.2.3 Comprobar que un producto se ha solicitado 523
4.2.4 Solicitar un producto 524
índice 527