capítulo 1 introducción a los servicios y aplicaciones móviles

271
Servicios móviles Dpto. de Ingeniería de Telecomunicación Área de Ingeniería Telemática Universidad de Jaén Escuela Politécnica Superior de Linares Versión 2.0 Autor: Juan Carlos Cuevas Martínez CAPÍTULO 1 Introducción a los servicios y aplicaciones móviles Primeros pasos para la programación de aplicaciones en Android

Upload: juan-carlos-cuevas-martinez

Post on 14-Jan-2017

32 views

Category:

Internet


8 download

TRANSCRIPT

Page 1: Capítulo 1   introducción a los servicios y aplicaciones móviles

Servicios móviles

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Autor: Juan Carlos Cuevas Martínez

CAPÍTULO 1Introducción a los servicios y aplicaciones móvilesPrimeros pasos para la programación de aplicaciones en Android

Page 2: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

2

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

A. Conocer los orígenes y características más significativas de Android.

B. Requerimientos mínimos del terminar para ejecutar Android.

C. Conocer las diferentes versiones de Android.D. Conocer la información disponible de Android.E. Conocer los distintos métodos para almacenar datos

de manera persistente en Android.F. Conocer la problemática del almacenamiento físico en

Android.G. Conocer el uso de las bases de datos en Android.H. Conocer las bases del manejo de gráficos en 2-D de

Android.

Objetivos

Page 3: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

3

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

I. Conocer el manejo del audio básico.J. Conocer los detalles de las clases de interfaz de

usuario de Android.K. Diseñar interfaces de usuario usando XML o

código ejecutable implementar .L. Manejar los eventos que genera el interfaz de

usuario.M. Crear menús de usuario.N. Conocer los principios del diseño dinámico de

interfaces de usuario basado en Fragmentos.

Objetivos

Page 4: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

4

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

1. Introducción a Android1. Breve historia2. Características3. Plataformas4. Arquitectura5. Herramientas necesarias6. Fuentes de información disponibles

2. Introducción a la programación en Android1. Inicio con Android2. Configuraciones: Crear un AVD3. Crear HolaMundo4. Tipos de aplicaciones Android

3. Actividades

Índice

Page 5: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

5

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

4. Diseño de interfaces1. Layouts2. Controles básicos3. Eventos4. Menús

5. Barra de acción6. Fragmentos

Índice

Page 6: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

6

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

5. Almacenamiento de datos en Android6. Almacenamiento basado en ficheros

1. Preferencias compartidas2. Ficheros de datos3. Ficheros de caché

7. Bases de datos

Índice

Page 7: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

7

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

8. Gráficos 2-D1. Canvas2. Drawable

9. Animación de Drawables1. Frame Animation

10. Animación de Vistas1. Tween animation

11. Audio1. PlayBack de audio y video2. Captura de audio

Índice

Page 8: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

8

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

1. Android Developers – Data Storage. http://developer.android.com/guide/index.html

2. Android SQLite database and content provider – tutorial. Based on Android 4.3. Autor: Lars Vogel, Versión 4.9. http://www.vogella.com/articles/AndroidSQLite/article.html

Referencias

Page 9: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

9

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

1. Breve historia2. Características3. Plataformas4. Arquitectura5. Herramientas necesarias6. Fuentes de información disponibles

1. Introducción a Android

Page 10: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

10

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Android es un sistema operativo desarrollado por Android Inc. basado en una versión modificada del kernel de Linux, busca la abstracción al HW. Android es mantenido como código abierto

en el Android Open Source Project encabezado por Google.

En su mayoría bajo licencia Apache Software License, Version 2.0 ("Apache 2.0").

1. Introducción a Android

El símbolo de Android es el robot, el cual puede ser usado, reproducido y modificado libremente en publicaciones de marketing con una correcta atribución de autoría.

Page 11: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

11

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

1. Breve historia Google compra el SO Android a Android Inc. Noviembre de 2007: primera SDK de Android. Diciembre de 2007: depuración de errores de la SDK. Agosto de 2008: anuncio de Android Market. Octubre de 2008: lanzamiento del primer móvil Android del

mercado. Febrero de 2009: lanzamiento de la versión 1.1 de Android. Abril de 2009: lanzamiento de la versión 1.5 de Android (Cupcake). Septiembre de 2009: lanzamiento de la versión 1.6 de Android

(Donut). Noviembre de 2009: lanzamiento de la versión 2.0/2.1 de Android

(Éclair). Junio de 2010: lanzamiento de la versión 2.2 de Android (Froyo). Diciembre de 2010: lanzamiento de la SDK versión 2.3 de Android

y lanzamiento de los primeros móviles (Gingebread). 2.3.3, Revision 2 (Julio 2011) 

1. Introducción a Android

Page 12: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

12

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

1. Breve historia Android 3.0 (HoneyComb Febrero 2011) API Level:

11 Android 3.1 (Mayo 2011) API Level: 12 Android 3.2 (Julio 2011) API Level: 13 Android 4.0 (Ice Cream Sandwich, Octubre 2011)

API Level: 14 Android 4.0.3  (Marzo 2012) API Level: 15 Android 4.1.2 (JELLY_BEAN, Revisión 3 – Octubre

2012) API Level: 16 Android 4.2.2 (Revisión 2 – Febrero 2013) Level: 17 Android 4.3.1 (Revisión 2 – Agosto 2013) Level: 18 Android 4.4.2 (KitKat - Revisión 2 - Diciembre 2013)

Level: 19

1. Introducción a Android

Page 13: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

13

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

1. Breve historia Android 4.4W.2. (Revisión 2 – octubre 2.014) Level: 20 Android 5.0.1 (LOLLIPOP, Revisión 2 – diciembre 2.014 ) Level: 21 Android 5.1.1 (Revisión 1 – Marzo 2015) Level: 22 Android 6.0 (MARSHMALLOW, Agosto 2.015) Level: 23 Android 7.0 (NOUGAT, Agosto 2.016) Level: 24

Logo de Android 5.0(Lollipop)

1. Introducción a Android

Page 14: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

14

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

1. Breve historia Aparición del soporte para dispositivos diferentes de

móviles y tabletas: Android WEAR. Android TV Android Auto

1. Introducción a Android

Page 15: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

15

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Worldwide Smartphone Sales to End Users by Operating System in 2Q16 (Thousands of Units)

1. Breve historia

Operating System 2Q16 Units

2Q16 Market

Share (%)

2Q15 Units

2Q15 Market

Share (%)

Android 296,912.8 86.2 271,647.0 82.2

iOS 44,395.0 12.9 48,085.5 14.6Windows 1,971.0 0.6 8,198.2 2.5Blackberry 400.4 0.1 1,153.2 0.3Others 680.6 0.2 1,229.0 0.4Total 344,359.7 100.0 330,312.9 100.0

1. Introducción a Android

Fuente: Gartner (Agosto 2016)http://www.gartner.com/newsroom/id/3415117

Page 16: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

16

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

2. Características La mayoría del código de Android es libre y abierto. Máquina virtual:

Pre-Android 5.0: máquina virtual Dalvik, una máquina virtual Java optimizada para dispositivos móviles.

La máquina Dalvik fue actualizada a la máquina Android runtime (ART) en la versión 5 (en la 4.4 de manera experimental).

Programas escritos en Java, lo que permite la reutilización de aplicaciones ya programadas para otras plataformas.

1. Introducción a Android

Page 17: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

17

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

2. Características Navegador web integrado basado en el motor

Chromium a partir de la 4.4 (antes WebKit) de código libre.

Gráficos optimizados: 2D con implementación propia y 3D con OpenGL ES (hasta 3.2 y en Android 7 también Vulkan) (aceleración por hardware opcional). La versión depende del API de Android.

Soporte multimedia para los formatos más comunes de audio, video e imagen : MPEG4, H.264, MP3, AAC, AMR, JPG, PNG, GIF.

Almacenamiento de datos estructurados a través de SQLite 3.

1. Introducción a Android

Page 18: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

18

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

2. Características Comunicaciones: Telefonía GSM, Bluetooth, EDGE, 3G, LTE

y Wifi, WifiDirect, Near Field Communication. Soporte para otros dispositivos: Cámara, GPS, brújula,

acelerómetro, pantallas táctiles. Aplicaciones en Google Play (inicialmente Android

Market), donde los desarrolladores pueden subir las aplicaciones.

En Google Play, no sólo se distribuyen aplicaciones sino Dispositivos, Libros, Revistas, Música y Películas.

1. Introducción a Android

Page 19: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

19

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

3. Plataformas Conexión usuario-desarrollador: las plataformas Android

están asociadas a un nivel API. Nivel de API: Es el nivel de compatibilidad de la aplicación,

y si se usan la bibliotecas de compatibilidad, se pueden hacer aplicaciones compatibles hacia atrás con seguridad.

La manera de proporcionar compatibilidad hacia atrás de nuevas características, como los fragmentos, es a través de la biblioteca de funciones de apoyo (Support Library). Ejemplos:

v4 support: añade el soporte a los fragmentos para APIs anteriores a la 11, entre otros aspectos.

v7 appcompat : por ejemplo añade soporte a la barra de acción (ActionBar) para APIs anteriores a la 11.

1. Introducción a Android

Page 20: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

20

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

3. PlataformasVersión de la plataforma API Level Versión de la

plataforma API Level

Android 3.2 13 Android 4.0 14Android 3.1.x 12 Android 4.0.3 15Android 3.0.x 11 Android 4.1 16Android 2.3.3, Android 2.3.4 10 Android 4.2 17Android 2.3, Android 2.3.1, Android 2.3.2 9 Android 4.3 18Android 2.2.x 8 Android 4.4 19Android 2.1.x 7 Android 5.0 20Android 2.0.1 6 Android 5.0.1 21Android 2.0 5 Android 5.1.1 22Android 1.6 4 Android 6.0 23Android 1.5 3 Android 7.0 24Android 1.1 2Android 1.0 1

1. Introducción a Android

Page 21: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

21

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Estadísticas de tamaños de pantalla

3. Plataformas

1. Introducción a Android

Version Codename API

Distribution

2.2 Froyo 8 0.1%2.3.3 - 2.3.7

Gingerbread 10 1.5%4.0.3 - 4.0.4

Ice Cream Sandwich15 1.4%

4.1.x Jelly Bean 16 5.6%4.2.x 17 7.7%4.3 18 2.3%4.4 KitKat 19 27.7%5.0 Lollipop 21 13.1%5.1 22 21.9%6.0 Marshmallow 23 18.7%

Fuente: https://developer.android.com/about/dashboards/index.html

Data collected during a 7-day period ending on September 5, 2016. Any versions with less than 0.1% distribution are not shown

Page 22: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

22

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Estadísticas de tamaños de pantalla

3. Plataformas

1. Introducción a Android

Fuente: https://developer.android.com/about/dashboards/index.html

ldpi mdpi tvdpi hdpi xhdpi xxhdpi TotalSmall 1.6% 1.6%Normal 3.5% 0.2% 39.5% 28.4% 15.5% 87.1%Large 0.2% 4.1% 2.1% 0.5% 0.5% 7.4%Xlarge 2.9% 0.3% 0.7% 3.9%Total 1.8% 10.5% 2.3% 40.3% 29.6% 15.5%

Data collected during a 7-day period ending on September 5, 2016. Any versions with less than 0.1% distribution are not shown

Page 23: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

23

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

4. Arquitectura Los componentes del SO Android: Basado en la versión 2.6 del kernel de Linux Conjunto de librerías de que usa el SO. Runtime: Cada aplicación se ejecuta en su propio

proceso, una instancia de la maquina virtual Dalvik/ART.

Framework: Acceso completo a la API usada por las aplicaciones base. Permite reutilización de capacidades y componentes publicados.

Aplicaciones: Escritas en Java. Algunas incluidas. Otras disponibles en Google Play.

1. Introducción a Android

Page 24: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

24

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

4. Arquitectura

1. Introducción a Android

Los desarrolladores tienen acceso completo a las mismas APIs usadas por las aplicaciones del núcleo.

La arquitectura de aplicación está diseñada para simplificar el reusado de componentes.

Page 25: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

25

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Framework

4. Arquitectura

Cualquier aplicación puede publicar sus capacidades, y otras aplicaciones pueden usarlas (sujetas a las medidas de seguridad del framework).

Este mecanismo también permite que otros componentes sean reemplazados por el usuario.

1. Introducción a Android

Page 26: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

26

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Framework

4. Arquitectura

Por debajo de todas las aplicaciones existen un conjunto de servicios y sistemas, entre los que se incluyen: Un rico y extensible conjunto de vistas, incluyendo listas, rejillas,

cajas de texto, botones, e incluso un navegador web embebible. Content Providers que permiten publicar datos para que otras

aplicaciones accedan a ellos. Un Resource Manager, que proporciona acceso a recursos fuera

del código como cadenas, imágenes, etc. Un Notification Manager que permite enviar alertas a la barra de

estado Un Activity Manager que maneja el ciclo de vida de las

aplicaciones y provee un pila de llamadas común para la navegación entre aplicaciones (backstack).

1. Introducción a Android

Page 27: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

27

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

5. Herramientas necesarias La forma más sencilla de desarrollar herramientas para Android  es usando

la SDK de Android junto con Android Studio, ya sea en Windows, Mac OS, o Linux.

La SDK tiene los siguientes componentes (entre otros): SDK Tools (<sdk>/tools): Contiene las herramientas necesarias para la

depuración y prueba, además de otras utilidades necesarias para desarrollar aplicaciones. La más útil y común es la utilidad abd (Android Debug Bridge).

SDK Platform (<sdk>/platforms/<android-version>): Archivos android.jar para construir la aplicación Android para cada versión disponible.

Documentación (<sdk>/docs>: Es una copia offline de la última versión de la documentación del API (JavaDocs).

Proyectos de ejemplo (<sdk>/platforms/<android-version>/samples: Código fuente de proyectos de ejemplo (ejemplo: ApiDemo), interesantes para empezar.

usb-drivers: Directorio necesario para conectar el entorno de desarrollo con el dispositivo Android.

APIs de Google

1. Introducción a Android

Page 28: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

28

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

5. Herramientas necesarias También es necesario para compilar y ejecutar la

Máquina Virtual: Dalvik VM o ART Una vez compilada la aplicación, la Android

Developer Tools permiten la aplicación en un paquete incluido en el archivo:

androidManifest.xml SDK Manager: Permite mantener actualizada la

SDK, así como gestionar los paquetes que nos interesan.

AVD Manager: Crea y mantiene los dispositivos virtuales Android (AVDs)

1. Introducción a Android

Page 29: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

29

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

6. Fuentes de información disponibles Android es una plataforma de relativa reciente creación,

pero de constante y rápido desarrollo. Por tanto, las fuente de información disponibles son crecientes y cambiantes día a día.

Páginas soportadas/propiedad de Google:o Página principal de desarrollo de Android:

http://developer.android.com/index.htmlo Página oficial de Android: http://www.android.com/o Android Source Project: http://source.android.com/index.htmlo Google projects for Android: para añadir funciones a la SDK

como Google Maps, http://code.google.com/intl/es-ES/android/

1. Introducción a Android

Page 30: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

30

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

6. Fuentes de información disponibles Otras páginas de la comunidad Android son:o Android Developers: http://android-developers.blogspot.com/index.htmlo Introduction to Android Development:

http://www.ibm.com/developerworks/opensource/library/os-android-devel/

o Android Wiki: http://en.androidwiki.com/wiki/Main_Pageo Android SO: http://en.wikipedia.org/wiki/Android_(operating_system)

Página de Lars Vogel: http://www.vogella.com

1. Introducción a Android

Page 31: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

31

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Índice1. Inicio con Android2. Android Studio3. Crear un programa “HolaMundo”4. Tipos de aplicaciones Android

2. Introducción a la programación en Android

Page 32: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

32

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

1. Inicio con Android Requisitos de

desarrollo: Entorno

de programación: Android Studio.

SDK de Android

Opcionales Herramientas gráficas

(Gimp por ejemplo) Herramientas de

control de versiones (Git por ejemplo).

2. Introducción a la programación en Android

Page 33: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

33

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Instalación del SDK de Android

1. Inicio con Android

Descargar Android Studio de la pagina https://developer.android.com/develop/index.html. Con las descarga e instalación de Android Studio se instala

el gestor de la SDK de Android: SDK Manager. Tener Java instalado en el ordenador, si no descargarlo

en http://www.oracle.com/technetwork/java/javase/downloads/index-jsp-138363.html#javasejdk. Para el API 24 es obligatoria la versión 1.8 de Java SE.

2. Introducción a la programación en Android

Page 34: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

34

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Crear un AVD

2. Android Studio

2. Introducción a la programación en Android

Desarrollo de aplicaciones para Android, tanto en móviles, tablets, TV, Wear o gafas inteligentes.

Compilador Gradle Creación de módulos dentro de un mismo proyecto. Distintas vistas de los proyectos. Gestión de dispositivos. Herramientas de desarrollo visual de interfaces avanzadas.

dependencies {  compile project(':my-library-module')}

Page 35: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

35

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Crear un AVD

2. Android Studio

Para crear un AVD:

En Android Studio,

seleccionar Tools> Android >AVD Manager

Create Virtual Device

2. Introducción a la programación en Android

Page 36: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

36

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

3. Crear un proyecto HolaMundo

En Android Studio seleccionar File>New> New project

Nombre del aplicación, dominio y ruta del proyecto

Elección de la API

Elección de la plantilla

Nombre de la acitivad y recurso para el diseño de pantalla

2. Introducción a la programación en Android

Page 37: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

37

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

3. Crear un proyecto HolaMundo

2. Introducción a la programación en Android

Page 38: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

38

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

3. Crear un proyecto HolaMundo

2. Introducción a la programación en Android

Page 39: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

39

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

3. Crear un proyecto HolaMundo Ante nosotros debería aparecer un código similar

siguiente en el fichero Java:package com.example.helloandroid;

import android.app.Activity;import android.os.Bundle;

public class HelloAndroid extends Activity {    /** Called when the activity is first created.*/    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);    }}

2. Introducción a la programación en Android

Page 40: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

40

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

3. Crear un proyecto HolaMundo El programa por defecto está basado en la clase Activity que se usa para ejecutar acciones, pero el usuario solo interactúa con una a la vez. En el caso de estar empleando las bibliotecas de

soporte por compatibilidad la clase sería: android.support.v4.app.ActivityCompat (novedades

después de API 4) android.support.v13.app.ActivityCompat (novedades

después de API 13) El método onCreate es llamado por el sistema

Android cuando la aplicación empieza. 

2. Introducción a la programación en Android

Page 41: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

41

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

3. Crear un proyecto HolaMundo Añadiendo las siguientes líneas en negrita

usaremos añadiremos un campo de texto:package com.example.helloandroid;import android.app.Activity;import android.os.Bundle;import android.widget.TextView;public class HelloAndroid extends Activity {   /** Called when the activity is first created.*/   @Override   public void onCreate(Bundle savedInstanceState) {       super.onCreate(savedInstanceState);       TextView tv = new TextView(this);       tv.setText("Hello, Android");       setContentView(tv);   }}

2. Introducción a la programación en Android

Page 42: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

42

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

3. Crear un proyecto HolaMundo Una interfaz de usuario de

Android está compuesta de jerarquías de objetos de la clase View.

Cada uno de estos objetos es una subclase de la clase View. Para mostrar textos no

editables se usaría TextView. Un contexto es una llamada al

sistema que provee servicios como resolución de fuentes, obtención de acceso a base de datos y preferencias (setText establece el contexto).

ViewGroup

ViewGroup

View View View

View View

2. Introducción a la programación en Android

Page 43: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

43

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Ejecutar

3. Crear un proyecto HolaMundo

Seleccionar Run > Run Se mostrará un cuadro de

diálogo para elegir un emulador activo o móvil conectado, o bien se permite iniciar un nuevo emulador.

2. Introducción a la programación en Android

Emulador del Nexus 5X con Android 6.0

Page 44: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

44

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

4. Tipos de aplicacionesLos componentes o aplicaciones Android se clasifican en: Activities: Aplicaciones con interfaz gráfica Services: Permiten la ejecución de código sin

necesidad de tener una interfaz gráfica. Aplican el mismo concepto de los demonios de Linux

Content providers: El administrador de información persistente “Servidor de base de datos”, basado en SQLite.

Broadcast receivers: Aplicaciones que responden a determinados eventos producidos por el sistema u otras aplicaciones.

2. Introducción a la programación en Android

Page 45: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

45

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

5. El fichero de manifiesto (AndroidManifest.xml) El fichero de manifiesto es donde el sistema

comprueba la existencia de un componente para poder así ser iniciados.

El fichero AndroidManifest.xml debe estar el directorio raíz de la aplicación (donde están /src y /res).

https://developer.android.com/guide/topics/manifest/manifest-intro.html

2. Introducción a la programación en Android

Page 46: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

46

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Elementos del AndroidManifiest.xml

5. El fichero de manifiesto (AndroidManifest.xml)

El nombre del paquete Java de la aplicación, el cual sirve como identificador único de ésta.

Los permisos de usuario que requiere la aplicación, tales como el acceso a Internet o el acceso de lectura a los permisos de usuario.

Declarar el Nivel de API mínimo de la aplicación, basado en las que la aplicación desea emplear.

Declarar el hardware y el software que emplea la aplicación y que son necesarios para su funcionamiento, como la cámara, servicios bluetooth o pantalla multi-táctil.

Cualquier API que se necesitan para enlazar (aparte de las del framework Android) como Google Maps library.

2. Introducción a la programación en Android

Page 47: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

47

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Elementos del AndroidManifiest.xml

5. El fichero de manifiesto (AndroidManifest.xml)

<?xml version="1.0" encoding="utf-8"?><manifest> <uses-permission /> <permission /> <permission-tree /> <permission-group /> <instrumentation /> <uses-sdk /> <uses-configuration /> <uses-feature /> <supports-screens /> <compatible-screens /> <supports-gl-texture />

<application> <activity> <intent-filter>

<action /> <category /> <data /> </intent-filter> <meta-data /></activity>

<activity-alias> <intent-filter>... </intent-filter> <meta-data /></activity-alias>

<service> <intent-filter>... </intent-filter> <meta-data/> </service>

<receiver> <intent-filter>... </intent-filter> <meta-data /> </receiver>

<provider> <grant-uri-permission /> <meta-data /> <path-permission /> </provider>

<uses-library />

</application></manifest>

2. Introducción a la programación en Android

Page 48: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

48

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Ejemplo de declaración de componentes

5. El fichero de manifiesto (AndroidManifest.xml)

<?xml version="1.0" encoding="utf-8"?><manifest ... >  <application android:icon="@drawable/app_icon.png" ... >    <activity android:name="com.example.project.ExampleActivity“      android:label="@string/example_label" ... >    </activity>      ...    </application></manifest>

2. Introducción a la programación en Android

Page 49: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

49

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Ejemplo de declaración de un filtro para una aplicación de email

5. El fichero de manifiesto (AndroidManifest.xml)

<manifest ... >    ...    <application ... >        <activity android:name="com.example.project.ComposeEmailActivity">           <intent-filter>               <action android:name="android.intent.action.SEND" />               <data android:type="*/*" />               <category android:name="android.intent.category.DEFAULT" />           </intent-filter>        </activity>    </application></manifest>

2. Introducción a la programación en Android

Page 50: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

50

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Ejemplo de permisos y características

5. El fichero de manifiesto (AndroidManifest.xml)

<manifest ... >    <uses-feature android:name="android.hardware.camera.any"                  android:required="true" />    <uses-sdk android:minSdkVersion="15" android:targetSdkVersion="24" /> <uses-permission      android:name="android.permission.WRITE_EXTERNAL_STORAGE"      android:maxSdkVersion="24" />    ...</manifest>

2. Introducción a la programación en Android

Establece la versión máxima a la que aplicar el permiso

Page 51: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

51

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Introducción Una actividad es sin duda el componente más habitual de

las aplicaciones para Android ya que es el que aporta el control de la interfaz de usuario (UI).

Un componente Activity refleja una determinada actividad llevada a cabo por una aplicación Lleva asociada típicamente una ventana o interfaz de usuario El aspecto gráfico forma parte del componente Activity a

través de vistas representadas por clases como ViewGroup, View y sus derivadas.

Este componente se implementa mediante la clase de mismo nombre Activity. La mayoría de las aplicaciones permiten la ejecución de varias

acciones a través de la existencia de una o más pantallas.     

3. Actividades

Page 52: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

52

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Declaración de actividades Para poder pasar de una actividad a otra, y que

la aplicación la reconozca, debemos de declararla en el AndroidManifiest.xml, si no se hace esto, cuando invoquemos la otra actividad la aplicación dará un error y no la mostrará.

<manifest ... > <activity android:name=".Activity_2"></activity> </manifest>

3. Actividades

Page 53: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

53

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Actividad de inicio Para definir la actividad que se debe iniciar en

una aplicación se debe especificar en el fichero de manifiesto:

<activity android:name=".MainActivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" />  <category android:name="android.intent.category.LAUNCHER"/> </intent-filter></activity>

3. Actividades

Page 54: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

54

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Ciclo de vida de las actividades

3. Actividades

Page 55: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

55

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Crear una nueva instancia de una actividad

Ciclo de vida de las actividades

El sistema llama al método onCreate() de la actividad. Debe incluir operaciones básicas de inicialización que se

deben hacer solamente una vez en la vida de la actividad. Después de onCreate() se ejecutan onStart() y

onResume(). Con onStart(), técnicamente la actividad se hace visible. El paso por los estados Created y Started es efímero, y

solo se interactúa con la aplicación en el estado Resumed.

3. Actividades

Page 56: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

56

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Crear una nueva instancia de una actividad

Ciclo de vida de las actividades

3. Actividades

Page 57: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

57

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Crear una nueva instancia de una actividad. Ejemplo

Ciclo de vida de las actividades

3. Actividades

TextView mTextView;

@Overridepublic void onCreate( Bundle savedInstanceState){

    super.onCreate(savedInstanceState);

    setContentView(R.layout.main_activity);       mTextView = (TextView) findViewById(R.id.text_message);         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {               ActionBar actionBar = getActionBar();        actionBar.setHomeButtonEnabled(false);    }}

Inicialización condicionada a la versión.Android 2.0 (API level 5) y superiores 

Donde se reciben los

datos almacenados

tras un re-creado de la

actividad

Page 58: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

58

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Destruir una actividad

Ciclo de vida de las actividades

El sistema llama a onDestroy() método cuando va a eliminar completamente la instancia de la actividad de la memoria.

No es necesario implementar este método ya que la limpieza de recursos se debe hacer prioritariamente en onPause() y onStop().

En onDestroy() se deben eliminar tareas en segundo plano que se crearan en el método onCreate() u otros procesos de larga duración que pueden consumir recursos y que podrían no ser convenientemente eliminados.

El método onDestroy() siempre lo llama el sistema después de onPause() y onStop() salvo en una situación: cuando se ejecuta finish() dentro del método onCreate().

3. Actividades

Page 59: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

59

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Pausar una actividad

Ciclo de vida de las actividades

Cuando el sistema llama al método onPause() de una actividad indica: La actividad es aún parcialmente visible pero el

usuario la está dejando. Pronto será llamado el método onStop().

3. Actividades

Page 60: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

60

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Pausar una actividad

Ciclo de vida de las actividades

Qué se debe hacer en el método onPause(): Parar operaciones que puedan consumir CPU como

animaciones. Almacenar los cambios no guardados, pero solamente si

el usuario espera volver a encontrarlos si vuelve a entrar en la aplicación. Ejemplo: un borrador de un correo electrónico o un documento a medio escribir.

Liberar recursos de sistema como broadcast receivers, sensores (como el GPS) o cualquier otro que puede afectar a la batería mientras la aplicación no lo necesita.

3. Actividades

Page 61: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

61

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Pausar una actividad

Ciclo de vida de las actividades

Qué NO se debería hacer en el método onPause(): Largas y costosas operaciones como almacenamiento

en bases de datos. Almacenar datos temporales de usuario en

almacenamiento persistente (salvo que sí fuera necesario en la aplicación).

Las operaciones en el método onPause() deben ser simples, de manera que permitan un rápida transición entre esa actividad y el siguiente paso del usuario.

3. Actividades

Page 62: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

62

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Ejemplo método onPause()

Ciclo de vida de las actividades

@Overridepublic void onPause() {    super.onPause(); //Siempre llamar a este //método de la superclase primero

    // Liberar la cámara porque no se necesita    // y otras actividades podrán así usarla    if (mCamera != null) {        mCamera.release();        mCamera = null;    }}

3. Actividades

Page 63: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

63

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Retomando la actividad, onResume()

Ciclo de vida de las actividades

El método onResume() se llama siempre que una actividad vuelve al primer plano, incluso la primera vez que se ejecuta.

Se debe emplear para: Inicializar componentes que se liberan en

onPause(). Realizar otros procesos de inicialización necesarios

cuando se vuelve del estado de pausa.

3. Actividades

Page 64: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

64

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Retomando la actividad. Ejemplo

Ciclo de vida de las actividades

@Overridepublic void onResume() {    super.onResume(); //Siempre este método primero    // Obtener una instacia de la cámara    if (mCamera == null) {        initializeCamera(); // Médoto local de

// inicialización de la cámara    }}

3. Actividades

Page 65: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

65

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Parar y reiniciar una Actividad

Ciclo de vida de las actividades

Se debe conseguir que tras parar y reiniciar una aplicación el usuario tenga la sensación de que ésta siempre ha estado activa.

3. Actividades

Page 66: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

66

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Parar y reiniciar una Actividad. Escenarios clave

Ciclo de vida de las actividades

El usuario, a través de Aplicaciones Recientes (AR) cambia a otra aplicación, para más tarde volver a la misma a través del icono en el menú Home o del AR de nuevo.

El usuario realiza una acción en la aplicación que le hace cambiar a una nueva actividad. La primera actividad se para y la nueva se crea. Si el usuario pulsa el botón de Volver(Back) la primera actividad se reinicia.

El usuario recibe una llamada de teléfono cuando está usando una aplicación en su móvil.

3. Actividades

Page 67: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

67

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Parar y reiniciar una Actividad. Métodos

Ciclo de vida de las actividades

En el estado Parado (Stopped) el interfaz de usuario (UI) no está visible de ninguna manera.

El sistema proporciona nos métodos dentro del ciclo de vida: Método onStop(). Método onRestart(): no hay una

guía concreta de qué poner en este método, conviniendo que es mejor realizar las tareas de reinicio en onStart().

3. Actividades

Como el sistema mantiene en memoria a la actividad cuando se para, es posible que no haga falta implementar onStop() y onRestart() e incluso onStart(). Para la mayoría de actividades que son relativamente simples basta con implementar onPause() conforme se ha visto.

Page 68: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

68

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Parar una Actividad. onStop()

Ciclo de vida de las actividades

La actividad ya no es visible. Se deben liberar todos los recursos que no se

van a utilizar mientras el usuario está sin usarlos. El sistema puede destruir la instancia de la

actividad si necesita recuperar memoria. En casos extremos el sistema puede simplemente

matar el proceso de la aplicación, por lo que no se llamaría a onDestroy().

3. Actividades

Page 69: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

69

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Recrear una actividad

Ciclo de vida de las actividades

Existen pocos casos en los que una actividad es destruida: El usuario pulsa el botón

volver y se ejecuta el método finish() porque así se implementó.

La actividad está en el estado Parado y lleva mucho tiempo en segundo plano, o el sistema necesita más recursos y la elimina.

3. Actividades

El sistema estima que como la aplicación ha terminado por su propia iniciativa, no es necesario guardar el estado

El sistema guarda el estado de la aplicación en un objeto de tipo Bundle ya que la aplicación fue eliminada y podría volver a primer plano por la actuación del usuario.

Page 70: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

70

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Recrear una actividad

Ciclo de vida de las actividades

El sistema guarda en el objeto Bundle toda la información que contenían elementos de la interfaz de usuario, como los campos de edición, y el implementador no necesita tenerlos en cuenta. Para esto todas las vistas deben

tener un identificador único.

3. Actividades

El sistema destruye y re-crea una actividad cada vez que el usuario gira la pantalla ya que las dimensiones cambian y la actividad puede necesitar cargar nuevos recursos.

Page 71: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

71

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Recrear una actividad

Ciclo de vida de las actividades

3. Actividades

Page 72: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

72

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Recrear una actividad. Guardar el estado

Ciclo de vida de las actividades

3. Actividades

static final String STATE_SCORE = "playerScore";static final String STATE_LEVEL = "playerLevel";...

@Overridepublic void onSaveInstanceState(Bundle savedInstanceState) {    // Se guarda el estado de algunas variables de usuario    savedInstanceState.putInt(STATE_SCORE, mCurrentScore);    savedInstanceState.putInt(STATE_LEVEL, mCurrentLevel);        // Siempre se debe llamar a la superclase para // guardar el estado de la jerarquía de vistas    super.onSaveInstanceState(savedInstanceState);}

Page 73: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

73

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Recrear una actividad. Recuperar el estado I

Ciclo de vida de las actividades

3. Actividades

@Overrideprotected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState); // Siempre llamar a la // superclase primero       // Se comprueba si se está recreando una instancia // previamente destruida    if (savedInstanceState != null) {        // Restaurar los valores del estado guardado        mCurrentScore = savedInstanceState.getInt(STATE_SCORE);        mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);    } else {        // Iniciar miembros con valores por defecto // para una nueva instancia    }    ...}

Page 74: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

74

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Recrear una actividad. Recuperar el estado II

Ciclo de vida de las actividades

3. Actividades

@Overridepublic void onRestoreInstanceState(Bundle savedInstanceState) {    // Siempre se debe llamar a la superclase para // restaurar la jerarquía de vistas    super.onRestoreInstanceState(savedInstanceState);       // Restaurar los valores del estado guardado    mCurrentScore = savedInstanceState.getInt(STATE_SCORE);    mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);}

Page 75: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

75

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Comunicación entre actividades Este código sería la llamada desde la primera actividad, donde

ACTIVIDAD ACTUAL es la actividad donde nos encontramos ACTIVIDAD SIGUIENTE sería el nombre de la siguiente actividad

donde queremos ir. IDENTIFICADOR es el dato que queremos pasar desde

ACTIVIDAD ACTUAL a ACTIVIDAD SIGUIENTE. El código “id” es el nombre con el cual llamaremos en

ACTIVIDAD SIGUIENTE para recuperar el valor.

Intent intent = new Intent(ACTIVIDAD ACTUAL,ACTIVIDAD SIGUIENTE );intent.putExtra("id", IDENTIFICADOR);startActivity(intent);

3. Actividades

Page 76: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

76

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Comunicación Este código habría que ejecutarlo al inicio de la

segunda actividad, en el método onCreate() por ejemplo, y recoge los datos que le has enviado anteriormente, en este caso al haber añadido un entero hay que poner getInt().

Bundle bundle = getIntent().getExtras();if(bundle!=null){

id = extras.getInt("id");}

3. Actividades

Page 77: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

77

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

En Android, la interfaz de usuario se crea utilizando objetos View y ViewGroup.

Hay muchos tipos de View y ViewGroup, cada uno de los cuales es descendiente de la clase View.

Los Views y ViewGroups han de estar contenidos en algún elemento. Estos elementos son los diseños o

planos (layout), que contienen otros elementos presentes en una vista.

4. Diseño de interfaces

Page 78: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

78

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

View: una estructura de datos que permite establecer el layout y el contenido de la pantalla. Maneja las medidas, el diseño, los gráficos, el enfoque de los

elemento, el desplazamiento y las interacciones dentro de la pantalla en la que reside.

Funciona como base para artilugios o widgets: (conjunto de subclases ya implementadas en Java que permiten mostrar elementos de pantalla interactivos).

ViewGroup: objetos cuya función es almacenar y manejar conjuntos de objetos View y ViewGroup hijos.

4. Diseño de interfaces

Page 79: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

79

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Jerarquía de elementos

4. Diseño de interfaces

79

Este sería un ejemplo de la jerarquía de elementos de visualización en un layout típico.

ViewGroup

View View ViewGroup

View

View

Page 80: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

80

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

2. Layouts Los layouts son elementos no visuales

destinados a controlar la distribución, posición y dimensiones de los controles que se insertan en su interior.

Extienden a la clase base ViewGroup, como muchos otros componentes contenedores

Es capaz de contener a otros controles.

4. Diseño de interfaces

Page 81: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

81

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

2. Layouts En Android, el diseño y la lógica de una pantalla

están separados en dos ficheros distintos. Un fichero donde tenemos el diseño puramente visual de

la pantalla, definido como fichero XML, Un fichero que contiene el código java que determina la

lógica de la pantalla, normalmente derivando de la clase Activity.

4. Diseño de interfaces

Page 82: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

82

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

2. LayoutsLos principales tipos de Layout que se van

a estudiar en este apartado son: Linear Layout. Table Layout. Relative Layout. Frame Layout.

4. Diseño de interfaces

Page 83: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

83

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

2. Layouts Existen otros tipos diferentes de layout, que no

serán vistos aquí, que permiten interfaces más ricos y vistosos. Podrán ser encontrados en el material de referencia

o en la web, y Entre otros:

View flipper View Switcher Coordinator Layout ConstraintLayout RecyclerView

4. Diseño de interfaces

Page 84: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

84

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

LinearLayout

2. Layouts

Es uno de los layout más simples que se pueden utilizar. Los elementos se irán colocando uno a continuación de

otro. Se puede indicar si la colocación lineal se hará de forma: Vertical u horizontal.

En la propiedad “orientación” asume los valores horizontal o vertical.

4. Diseño de interfaces

Page 85: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

85

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

LinearLayout. Ejemplo

2. Layouts

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical" android:layout_width="match_parent"android:layout_height="match_parent">

<Button android:text="Button01" android:id="@+id/Button01"android:layout_width="wrap_content"android:layout_height="wrap_content" />

</LinearLayout>

4. Diseño de interfaces

Page 86: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

86

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

LinearLayout. Weight y Gravity

2. Layouts

La propiedad weight permite asignar importancia a las vistas contenidas en un layout para que el espacio libre se reparta proporcionalmente al peso asignado a cada una. Así, en un linear layout con un botón con weight=1 y dos

campos de texto con weight=0, el botón se repartirá todo el espacio libre restante.

La propiedad gravity permite alinear la vista con respecto a su contenedor Es básicamente un alineamiento: derecha, izquierda, arriba,

abajo…

4. Diseño de interfaces

Page 87: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

87

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

TableLayout

2. Layouts

Es un modelo de organización basado en Tablas.

El diseño se organiza en filas y dentro de cada fila se incluyen los elementos.

No dibuja líneas de separación entre filas, columnas o celdas.

Puede haber celdas vacías, pero no se pueden agrupar celdas como en las tablas HTML.

Cada fila de una tabla es una nueva vista de la clase TableRow

4. Diseño de interfaces

Page 88: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

88

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

TableLayout. TableRow

2. Layouts

Pueden tener ninguna o más celdas. Cada celda es una vista de otro tipo, incluso un ViewGroup,

como un nuevo TableLayout. Las celdas se pueden ocultar (collapse), estirarse (stretch)

para que se repartan el espacio o encogerse (shrink) para que quepan en la vista. android:collapseColumns = "1,3" android:stretchColumns = "1" android:shrinkColumns = "*"

4. Diseño de interfaces

Page 89: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

89

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Table layout. Ejemplo

2. Layouts

<?xml version="1.0" encoding="utf-8"?><TableLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:stretchColumns="1">    <TableRow>        <TextView            android:text="@string/table_layout_4_open"            android:padding="8dp" />        <TextView            android:text="@string/table_layout_4_open_shortcut"            android:gravity="right"            android:padding="8dp" />    </TableRow>

…    </TableLayout>

4. Diseño de interfaces

Page 90: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

90

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Relative layout

2. Layouts

Es el mas flexible de todos. Los elementos se colocan relativos a otro elemento o a otro layout.

4. Diseño de interfaces

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:id="@+id/e19_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:text="@string/e19_title"/> <Button android:id="@+id/e19_connect" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/e19_title" android:layout_centerHorizontal="true" android:layout_marginTop="@dimen/activity_vertical_margin" android:onClick="onConnect" android:text="@string/e19_button_connect" /></RelativeLayout>

Page 91: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

91

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Frame layout

2. Layouts

Este layout consiste en un marco que ocupa toda la pantalla y donde los controles se disponen a partir de la esquina superior izquierda, hay que tener cuidado de no dejar elementos ocultos por otros elementos.

Se utiliza como base para otros layout complejos o animados como los desplegables (Drawers)

4. Diseño de interfaces

Page 92: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

92

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

3. Controles básicos En las siguientes diapositivas vamos a hacer un

repaso de los diferentes controles que la plataforma de desarrollo Android pone a nuestra disposición. Botones: Button, ToggleButton, ImageButton. ImageView. TextView. EditText. Interfaz Spanned. CheckBox. RadioButton.

4. Diseño de interfaces

Page 93: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

93

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Botón normal (Button)

3. Controles básicos

Un control de tipo Button es el botón más básico que podemos utilizar.

Sus propiedades mas usuales: android:text para indicar el texto del botón. android:background, indicar el fondo. android:typeface, estilo de la fuente. android:textSize, tamaño de la fuente.

<Button android:id="@+id/BtnBoton1"android:text="Púlsame"android:layout_width="wrap_content"android:layout_height="wrap_content" />

4. Diseño de interfaces

Page 94: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

94

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Botón con estado (ToggleButton)

3. Controles básicos

Este tipo de botón que puede permanecer en dos estados, pulsado o no pulsado

En vez de definir un sólo texto para el control definiremos dos, dependiendo de su estado. Así, podremos asignar las propiedades android:textOn y android:textoOff para definir ambos textos.

<ToggleButton android:id="@+id/BtnBoton2"android:textOn="ON"android:textOff="OFF"android:layout_width="wrap_content"android:layout_height="wrap_content" />

4. Diseño de interfaces

Page 95: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

95

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Botón de imagen (ToggleButton)

3. Controles básicos

Un ImageButton, con este control podremos definir una imagen a mostrar en vez de un texto, para lo que deberemos asignar la propiedad android:src. Normalmente asignaremos esta propiedad con el descriptor de

algún recurso que hayamos incluido en la carpeta /res/drawable.

<ImageButton android:id="@+id/BtnBoton3"android:layout_width="wrap_content"android:layout_height="wrap_content"android:src="@drawable/ok" />

4. Diseño de interfaces

Page 96: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

96

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Botones. Eventos

3. Controles básicos

Aunque estos controles pueden lanzar muchos otros eventos, el más común de todos ellos y el que querremos capturar en la mayoría de las ocasiones es el evento onClick.

Para definir la lógica de este evento tendremos que implementarla definiendo un nuevo objeto View.OnClickListener() y asociándolo al botón mediante el método setOnClickListener().

La forma más habitual de hacer esto es la siguiente:

final Button btnBoton1 = (Button)findViewById(R.id.BtnBoton1);btnBoton1.setOnClickListener(new View.OnClickListener() {

@Overridepublic void onClick(View arg0){lblMensaje.setText("Botón 1 pulsado!");}});

4. Diseño de interfaces

Page 97: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

97

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Botones. Eventos

3. Controles básicos

En el caso de un botón de tipo ToggleButton suele ser de utilidad conocer en qué estado ha quedado el botón tras ser pulsado, para lo que podemos utilizar su método isChecked().

En el siguiente ejemplo se comprueba el estado del botón tras ser pulsado y se actúa según el resultado.

final ToggleButton btnBoton2 = ToggleButton)findViewById(R.id.BtnBoton2);btnBoton2.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View arg0){if(btnBoton2.isChecked()) lblMensaje.setText("Botón 2: ON");else lblMensaje.setText("Botón 2: OFF");} });

4. Diseño de interfaces

Page 98: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

98

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Control ImageView

3. Controles básicos

El control ImageView permite mostrar imágenes en la aplicación. Las propiedades más interesante del control: android: src, se indica el origen de la imagen a mostrar. Lo

normal será indicar una imagen de la carpeta /res/drawable de nuestro proyecto.

android:maxWidth, indica el ancho máximo. android:maxHeight, indica la altura máxima.

<ImageView android:id="@+id/ImgFoto"android:layout_width="wrap_content"android:layout_height="wrap_content"android:src="@drawable/icon" />

4. Diseño de interfaces

Page 99: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

99

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Control TextView

3. Controles básicos

El control TextView, las etiquetas de texto, se utiliza para mostrar un determinado texto al usuario.

El control tiene las siguientes propiedades:android:text, nos permite indicar el texto del control. android:background, color de fondo. android:textColor, color del texto.android:textSize, tamaño de la fuente. android:typeface, estilo del texto: negrita, cursiva, …

<TextView android:id="@+id/LblEtiqueta"android:layout_width="fill_parent"android:layout_height="wrap_content"android:text="Escribe algo:"android:background="#AA44FF"android:typeface="monospace" />

4. Diseño de interfaces

Page 100: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

100

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Control EditText

3. Controles básicos

El control EditText es el componente de edición de texto que proporciona la plataforma Android.

Permite la introducción y edición de texto por parte del usuario.

La propiedad más interesante a establecer, en tiempo de diseño, es el texto a mostrar, atributo android:text.<EditText android:id="@+id/TxtTexto"android:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_below="@id/LblEtiqueta" />

4. Diseño de interfaces

Page 101: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

101

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Interfaz Spanned

3. Controles básicos

Un objeto de tipo Spanned es como una cadena de caracteres en la que podemos insertar otros objetos a modo de marcas o etiquetas (spans) asociados a rangos de caracteres.

De esta interfaz deriva la interfaz Spannable, que permite la modificación de estas marcas.

Existen muchos tipos de spans predefinidos en la plataforma Android que podemos utilizar para dar formato al texto, entre ellos: TypefaceSpan, modifica el tipo de fuente. StyleSpan, modifica el estilo del texto (negrita, cursiva, …). ForegroudColorSpan, modifica el color del texto. AbsoluteSizeSpan, modifica el tamaño de fuente.

4. Diseño de interfaces

Page 102: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

102

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Interfaz Spanned

3. Controles básicos

Los controles EditText poseen este interfaz y permiten modificaciones de este tipo.

Sin embargo los controles TextView no poseen esta capacidad.

//Creamos un nuevo objeto de tipo EditableEditable str = Editable.Factory.getInstance().newEditable("Esto es un simulacro.");//Marcamos cono fuente negrita la palabra "simulacro"str.setSpan(new StyleSpan(android.graphics.Typeface.BOLD), 11, 19, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

4. Diseño de interfaces

Page 103: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

103

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Control CheckBox

3. Controles básicos

Un control CheckBox se suele utilizar para marcar o desmarcar opciones en una aplicación. La forma de definirlo en nuestra interfaz y los métodos disponibles para manipularlos desde nuestro código son análogos a los ya comentados para el control ToggleButton.<CheckBox android:id="@+id/ChkMarcame"

android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Márcame!" />

4. Diseño de interfaces

Page 104: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

104

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Control CheckBox

3. Controles básicos

En el código de la aplicación podremos hacer uso de los métodos isChecked() para conocer el estado del control, y setChecked(estado) para establecer un estado concreto para el control.

if (checkBox.isChecked()) {

checkBox.setChecked(false);}

4. Diseño de interfaces

Page 105: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

105

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Control CheckBox

3. Controles básicos

En cuanto a los posibles eventos que puede lanzar este control, el más interesante es el que informa de que ha cambiado el estado del control, que recibe el nombre de onCheckedChanged.

Un ejemplo de implementación:final CheckBox cb = (CheckBox)findViewById(R.id.chkMarcame);cb.setOnCheckedChangeListener(new CheckBox.OnCheckedChangeListener() {public void onCheckedChanged(CompoundButton buttonView,boolean isChecked) {

if (isChecked) {cb.setText("Checkbox marcado!");}else {cb.setText("Checkbox desmarcado!");

}}});

4. Diseño de interfaces

Page 106: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

106

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Control RadioButton

3. Controles básicos

Un RadioButton es un grupo de opciones donde una, y sólo una, de ellas debe estar marcada obligatoriamente, es decir, que si se marca una de ellas se desmarcará automáticamente la que estuviera activa anteriormente.

Un grupo de botones RadioButton se define mediante un elemento RadioGroup, que a su vez contendrá todos los elementos RadioButton necesarios. <RadioGroup android:id="@+id/gruporb"

android:orientation="vertical"android:layout_width="fill_parent"android:layout_height="fill_parent" ><RadioButton android:id="@+id/radio1” android:text="Opción 1" /><RadioButton android:id="@+id/radio2“ android:text="Opción 2" />

</RadioGroup>

4. Diseño de interfaces

Page 107: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

107

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Control RadioButton

3. Controles básicos

Una vez definida la interfaz podremos manipular el control haciendo uso de los diferentes métodos del control RadioGroup, los más importantes: check(id), para marcar una opción determinada mediante su

ID. clearCheck(), para desmarcar todas las opciones. getCheckedRadioButtonId(), que devuelve el ID de la opción

marcada.

final RadioGroup rg = (RadioGroup)findViewById(R.id.gruporb);rg.clearCheck();rg.check(R.id.radio1);int idSeleccionado = rg.getCheckedRadioButtonId();

4. Diseño de interfaces

Page 108: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

108

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Control RadioButton

3. Controles básicos

En cuanto a los eventos lanzados, el más importante será el que informa de los cambios en el elemento seleccionado, llamado onCheckedChange.

Un ejemplo de lógica asociada al evento:

final RadioGroup rg = (RadioGroup)findViewById(R.id.gruporb);rg.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {public void onCheckedChanged(RadioGroup group, int checkedId) {lblMensaje.setText("ID opcion seleccionada: " + checkedid);}});

4. Diseño de interfaces

Page 109: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

109

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Controles de selección

3. Controles básicos

Al igual que en otros frameworks, Android dispone de diversos controles que nos permiten seleccionar una opción dentro de una lista de posibilidades. Spinner, listas desplegables. ListView, listas fijas. GridView, tablas. Gallery, controles específicos de la plataforma, galerías

de imágenes.

4. Diseño de interfaces

Page 110: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

110

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Adaptadores en Adroid (adapters)

3. Controles básicos

Un elemento importante y común a todos los controles de selección, son los adaptadores. Un adaptador representa algo así como una interfaz común al

modelo de datos que existe por detrás de todos los controles de selección que hemos comentado.

Dicho de otra forma, todos los controles de selección accederán a los datos que contienen a través de un adaptador.

Además de proveer de datos a los controles visuales, el adaptador también será responsable de generar, a partir de estos datos, las vistas específicas que se mostrarán dentro del control de selección.

4. Diseño de interfaces

Page 111: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

111

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Adaptadores en Adroid (adapters)

3. Controles básicos

Android proporciona de forma estándar varios tipos de adaptadores sencillos que permiten manejar la información que muestran los controles que derivan de AdapterView , tales como ListView, GridView, Spinner o Gallery. Aunque podemos extender su funcionalidad fácilmente para adaptarlos a nuestras necesidades. Los adaptadores más comunes son los siguientes: ArrayAdapter, es el más sencillo, y provee de datos a un control de

selección a partir de un array de objetos de cualquier tipo. SimpleAdapter, se utiliza para mapear datos sobre los diferentes

controles definidos en un fichero XML de layout. SimpleCursorAdapter, se utiliza para mapear las columnas de un

cursor sobre los diferentes elementos visuales contenidos en el control de selección.

4. Diseño de interfaces

Page 112: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

112

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Adaptador ArrayAdapter

3. Controles básicos

final String[] datos = new String[]{"Elem1","Elem2","Elem3","Elem4","Elem5"};ArrayAdapter<String> adaptador =new ArrayAdapter<String>(this,android.R.layout.simple_spinner_item, datos);

La primera línea contiene la definición del array con los datos a mostrar. En la segunda línea se crea el adaptador, al que pasamos 3 parámetros:

El contexto (this), que normalmente será una referencia a la actividad donde se crea el adaptador.

El ID (android.R.layout.simple_spinner_item), del layout sobre el que se mostrarán los datos del control. En este caso le pasamos el ID de un layout predefinido en Android, pero podríamos pasarle el ID de cualquier layout de nuestro proyecto.

El array (datos) que contiene los datos a mostrar. Con esto ya tendríamos creado nuestro adaptador.

4. Diseño de interfaces

Page 113: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

113

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Control Spinner

3. Controles básicos

Las listas desplegables en Android se llaman Spinner. Funcionan de forma similar al de cualquier control de este tipo, el

usuario selecciona la lista, se muestra una especie de lista emergente con todas las opciones disponibles y al seleccionarse una de ellas ésta queda fijada en el control.

<Spinner android:id="@+id/CmbOpciones"android:layout_width="match_parent"android:layout_height="wrap_content" />

4. Diseño de interfaces

Page 114: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

114

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Control Spinner

3. Controles básicos

Para enlazar el adaptador, y por tanto los datos, a este control utilizaremos el siguiente código java:

final Spinner cmbOpciones = (Spinner)findViewById(R.id.CmbOpciones);adaptador.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);cmbOpciones.setAdapter(adaptador);

4. Diseño de interfaces

Page 115: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

115

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Control Spinner

3. Controles básicos

En cuanto a los eventos lanzados por el control Spinner, el más utilizado será el generado al seleccionarse una opción de la lista desplegable, onItemSelected.

Para capturar este evento se procede de forma similar a lo ya visto para otros controles, asignándole su controlador mediante el método setOnItemSelectedListener():

4. Diseño de interfaces

Page 116: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

116

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Control Spinner

3. Controles básicos

cmbOpciones.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {

public void onItemSelected(AdapterView<?> parent,android.view.View v, int position, long id){lblMensaje.setText("Seleccionado: " + datos[position]); }public void onNothingSelected(AdapterView<?> parent) {lblMensaje.setText(""); }

});

Para este evento definimos dos métodos, (onItemSelected) que será llamado cada vez que se seleccione una opción en la lista desplegable, y el segundo (onNothingSelected) que se llamará cuando no haya ninguna opción seleccionada.

4. Diseño de interfaces

Page 117: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

117

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Control ListView

3. Controles básicos

El control ListView muestra al usuario una lista de opciones seleccionables directamente sobre el propio control. En caso de existir más opciones de las que se pueden mostrar sobre el control se podrá hacer scroll sobre la lista para acceder al resto de elementos.

<ListView android:id="@+id/LstOpciones"android:layout_width="wrap_content"android:layout_height="wrap_content" />

4. Diseño de interfaces

Page 118: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

118

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Control ListView

3. Controles básicos

Para enlazar los datos con el control definiremos primero un array con nuestros datos, crearemos posteriormente el adaptador de tipo ArrayAdapter y lo asignaremos al control mediante el método setAdapter().

final String[] datos =new String[]{"Elem1","Elem2","Elem3","Elem4","Elem5"};ArrayAdapter<String> adaptador = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, datos);ListView lstOpciones = (ListView)findViewById(R.id.LstOpciones);lstOpciones.setAdapter(adaptador);

4. Diseño de interfaces

Page 119: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

119

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Control ListView

3. Controles básicos

Si quisiéramos realizar cualquier acción al pulsarse sobre un elemento de la lista creada tendremos que implementar el evento onItemClick.

lstOpciones.setOnItemClickListener(new OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> a, View v, int position, long id) {//Acciones necesarias al hacer click}});

4. Diseño de interfaces

Page 120: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

120

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Control GridView

3. Controles básicos

El control GridView de Android presenta un conjunto de opciones seleccionables distribuidas de forma tabular, o dicho de otra forma, divididas en filas y columnas. Dada la naturaleza del control las propiedades más importantes: android:numColumns, indica el número de columnas de la tabla. android:columnWidth, indica el ancho de las columnas de la tabla. android:horizontalSpacing, indica el espacio horizontal entre celdas. android:verticalSpacing, indica el espacio vertical entre celdas. android:stretchMode, indica qué hacer con el espacio horizontal sobrante.

Si se establece al valor “columnWidth” este espacio será absorbido a partes iguales por las columnas de la tabla. Si por el contrario se establece a “spacingWidth” será absorbido a partes iguales por los espacios entre celdas.

4. Diseño de interfaces

Page 121: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

121

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Control GridView

3. Controles básicos

Ejemplo de definición de un GridView:

<GridView android:id="@+id/GridOpciones" android:layout_width="fill_parent" android:layout_height="fill_parent" android:numColumns="auto_fit" android:columnWidth="80dp" android:horizontalSpacing="5dp" android:verticalSpacing="10dp" android:stretchMode="columnWidth" />

4. Diseño de interfaces

Page 122: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

122

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Control GridView

3. Controles básicos

La forma de asignar los datos desde el código de la aplicación es análoga a la comentada para las listas desplegables o para las listas estáticas: creamos un array genérico que contenga nuestros datos de

prueba, declaramos un adaptador de tipo ArrayAdapter pasándole en

este caso un layout genérico (simple_list_item_1, compuesto por un simple TextView) y asociamos el adaptador al control GridView mediante su método setAdapter():

4. Diseño de interfaces

Page 123: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

123

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Control GridView

3. Controles básicos

private String[] datos = new String[25];//...for(int i=1; i<=25; i++)datos[i-1] = "Dato " + i;ArrayAdapter<String> adaptador =new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, datos);final GridView grdOpciones = (GridView)findViewById(R.id.GridOpciones);grdOpciones.setAdapter(adaptador);

Por defecto, los datos del array se añadirán al control GridView ordenados por filas, si no caben todos en la pantalla se podrá hacer scroll sobre la tabla.

4. Diseño de interfaces

Page 124: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

124

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Control GridView

3. Controles básicos

En cuanto a los eventos disponibles, el más interesante es el lanzado al seleccionarse una celda determinada de la tabla: onItemSelected.

Este evento podemos capturarlo de la misma forma que hacíamos para los otros controles.grdOpciones.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {public void onItemSelected(AdapterView<?> parent,android.view.View v, int position, long id) {lblMensaje.setText("Seleccionado: " + datos[position]);}public void onNothingSelected(AdapterView<?> parent) {lblMensaje.setText("");}});

4. Diseño de interfaces

Page 125: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

125

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

4. Eventos En Android como en otros sistemas la interacción del usuario con el

sistema es modelada con eventos. Si una aplicación quiere enterarse y responder a una interacción del

usuario ha de añadir la lógica apropiada para detectar y procesar el evento.

Un evento encapsula la información necesaria para que el manejador de la aplicación pueda tratar esa entrada.

Android trata los eventos mediante: Event Handler: maneja los eventos de entrada sin importar donde está el foco.

No están necesariamente asociados a una vista. Ej: pulsar el Botón atrás, tocar la pantalla. Distintos ejemplos de eventos: onKeyUp: Se libera una tecla onKeyDown: Se pulsa una tecla onTouchEvent: Se toca la pantalla onTrackballEvent: Se aprieta/mueve el trackball onBackPressed: Se pulsa el botón atrás etc.

4. Diseño de interfaces

Page 126: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

126

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Event Listener

4. Eventos

Event Listener: escuchan eventos generados por una View o ViewGroup. Cada Event Listener tiene solo un método callback, que será llamado por el framework Android cuando el usuario interactúa con la vista. Ej.: onClick, onLongClick, onFocusChanged.

Un EventListener escucha eventos generados por una vista. Previamente es necesario registrarlo mediante el método setOnXXXListener apropiado.

Ya se han definido varios ejemplos de manejo de eventos en la exposición anterior de los distintos controles.

4. Diseño de interfaces

Page 127: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

127

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

5. Menús Los menús son una parte importante de una aplicación que

proporciona una interfaz sencilla para que el usuario pueda acceder a las distintas funciones de las aplicaciones.

Android ofrece una interfaz de programación fácil para el desarrollo de menús.

Android ofrece tres tipos de menús: Options Menu, es el menú principal de un Activity, aparece cuando el

usuario pulsa la tecla Menú del dispositivo. Contex Menu, es un menú flotante que el usuario crea en una

aplicación y que es desplegado dentro de determinados contextos. Pop-up Menu, menús que aparecen cuando el usuario pulsa

determinados elementos de un menú.

4. Diseño de interfaces

Page 128: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

128

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Nota sobre el uso del botón Menú

5. Menús

Desde la versión de Android 3.0 (API level 11), los dispositivos que usen Android no se les exige que proporcionen un botón exclusivo de Menú.

Las aplicaciones migraron para proporcionar una barra de acción para las acciones comunes de usuario en vez del típico panel de menú de 6 elementos.

Sin embargo, a pesar de que el diseño y la experiencia de usuario cambiaron, la forma de definir las acciones y opciones basadas en menús siguen siendo a través del API de Menús.

4. Diseño de interfaces

Page 129: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

129

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Options menu

5. Menús

El menú de opciones es donde se deben incluir las opciones básicas de una aplicación y los elementos necesarios para la navegación. El usuario puede abrir el menú de opciones con la tecla de menú del

dispositivo, o a través de la barra de acción en versiones 3.0 o superiores.

Se pueden definir menús de opciones tanto en una Activity como en un Fragment. Si tanto la Activity como los fragmentos que la forman declaran un

menú, todos aparecerán, primero los de la Activity y luego los de los fragmentos en el orden en el que se añadieron a la Activity.

Si se quiere establecer un orden concreto para los elementos de un menú se puede añadir la opción android:orderInCategory a los elementos de un menú que se deseen.

4. Diseño de interfaces

Page 130: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

130

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Forma de aparición de los menús en la UI

5. Menús

Si la aplicación ha sido desarrollada para Android 2.3.x (API level 10) o menor, el contenido del menú de opciones aparecerá en la parte baja de la pantalla cuando el usuario presione el botón Menú. Android ubicará hasta un máximo de seis

elementos Si el menú tiene más elementos, se

mostrarán sólo cinco y el resto se accederá en un menú adicional (overflow menu) pulsando el botón “Más (More)”.

4. Diseño de interfaces

Page 131: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

131

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Forma de aparición de los menús en la UI

5. Menús

Si la aplicación ha sido desarrollada para Android 3.0 (API level 11) y superiores, los elementos del menú de opciones aparecerán en la barra de acción. Por defecto, la aplicación coloca todos los elementos en el botón de

desbordamiento de acciones (action overflow – tres putitos verticales en la parte derecha de la barra de acción).

Se puede dar mayor facilidad de acceso a algunos de esos elementos a través de la propiedad android:showAsAction="ifRoom“ en el elemento <item> correspondiente.

4. Diseño de interfaces

Page 132: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

132

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Options menu

5. Menús

Cuando el usuario abre el menú de opciones, por primera vez, Android hace una llamada al método onCreateOptionsMenu() del Activity.

Los Fragments tienen su propio onCreateOptionsMenu() que es el que debe ser usado con el fin de mostrar su menú.

Cuando se selecciona un elemento de menú, el sistema llama al método onOptionsItemSelected(). Este método pasa el MenuItem seleccionado. Se puede identificar el

elemento de menú seleccionado con la llamada a getItemId(), que devuelve el identificador del elemento seleccionado.

4. Diseño de interfaces

Page 133: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

133

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Options menu

5. Menús

Crear un menú de opciones desde un recurso XML@Override public boolean onCreateOptionsMenu(Menu menu) {

MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.main_menu, menu); return true;

}

4. Diseño de interfaces

Page 134: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

134

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Options menu. Ejemplo

5. Menús

<menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/menu_settings" android:title="@string/menu_settings" android:orderInCategory="100"/> <item android:id="@+id/menu_help" android:title="@string/menu_help" android:orderInCategory="200" android:icon="@drawable/ic_menu_help"/></menu>

4. Diseño de interfaces

Page 135: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

135

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Options menu

5. Menús

Crear un menú con código fuente:

public boolean onCreateOptionsMenu(Menu menu){

menu.add(0,EDIT_CONTACT,0,"Edit Contact");menu.add(0,DELETE_CONTACT,0,"Delete Contact");menu.add(0,EXIT,0,"Exit");return true;

}

4. Diseño de interfaces

Page 136: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

136

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Options menu – Manejar los eventos

5. Menús

public boolean onOptionsItemSelected (MenuItem item){switch (item.getItemId()){case EDIT_CONTACT:/* Actions in case that Edid Contacts is pressed */return true;case DELETE_CONTACT :/* Actions in case that Delete Contact is pressed */return true;}

}

4. Diseño de interfaces

Page 137: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

137

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Context menu

5. Menús

Un menú contextual es conceptualmente similar al menú que aparece cuando se pulsa "botón derecho del ratón“. Se debe usar un menú contextual para proporcionar acceso a las acciones que

pertenecen a un elemento específico en la interfaz de usuario. En Android, un menú contextual se muestra cuando el usuario realiza una

"pulsación larga" (mantener presionado) sobre un elemento de un menú. Se puede crear un menú contextual para cualquier View, aunque los

menús contextuales más a menudo se utilizan para los controles ListView.

Cuando se esté desarrollando para Android 3.0 (API level 11) o superior se debe usar el modo de acción contextual para para permitir las acciones en el contenido seleccionado. Este modo muestra las acciones disponibles que afectan al contenido seleccionado en una barra en la parte superior de la pantalla, permitiendo además la selección de múltiples elementos.

4. Diseño de interfaces

Page 138: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

138

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Context menu

5. Menús

Para que un elemento pueda ofrecer un menú contextual:1. Se debe "registrar" el elemento mediante una llamada a

registerForContextMenu() y pasar el elemento que deseamos registrar. Una vez registrado, cuando recibe una pulsación larga se muestra un menú contextual. Ejemplo: registerForContextMenu(getListView());

2. Creamos el menú contextual.

@Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo){

super.onCreateContextMenu(menu, v, menuInfo); menu.add(0, DELETE_ID, 0, R.string.menu_delete);

}

4. Diseño de interfaces

Page 139: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

139

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Context menu

5. Menús

3. Capturamos la pulsación.

@Overridepublic boolean onContextItemSelected(MenuItem item) {

switch(item.getItemId()){ case DELETE_ID: AdapterContextMenuInfo info = (AdapterContextMenuInfo)item.getMenuInfo(); mDbHelper.deleteNote(info.id); fillData(); return true; } return super.onContextItemSelected(item);

}

4. Diseño de interfaces

Page 140: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

140

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Pop-up menu

5. Menús

Un pop-up menu es un menú que el usuario puede abrir mediante la selección de un elemento en otro menú. Se puede agregar un submenú a cualquier menú (con excepción de un

submenú). Los submenús son útiles cuando la aplicación tiene muchas funciones que pueden ser organizados en temas.

Cuando se selecciona un elemento de un submenú, el menú principal recibe el evento del elemento seleccionado. Por ejemplo, si el menú principal es un menú de opciones, el

onOptionsItemSelected() es llamado cuando un elemento de submenú se selecciona.

4. Diseño de interfaces

Page 141: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

141

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Pop-up menu

5. Menús

public boolean onCreateOptionsMenu(Menu menu) {boolean result = super.onCreateOptionsMenu(menu); SubMenu fileMenu = menu.addSubMenu("File"); SubMenu editMenu = menu.addSubMenu("Edit"); fileMenu.add("new"); fileMenu.add("open"); fileMenu.add("save"); editMenu.add("undo"); editMenu.add("redo"); return result; }

4. Diseño de interfaces

Page 142: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

142

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

6. Barra de acción La Barra de acción o ActionBar, es una característica de la ventana que

identifica donde está el usuario además de proporcionar acciones y modos de navegación al usuario.

La adaptación a los diferentes tipo de ventana la proporciona el sistema. Funciones clave:

Espacio dedicado para identificar una aplicación e indicar la localización del usuario dentro de la aplicación.

Hace más visibles y accesibles acciones importantes como por ejemplo los botones de búsqueda.

Soporta de manera consistente la navegación e intercambio de vistas dentro de una aplicación a través de pestañas o listas desplegables.

4. Diseño de interfaces

1: Icono de la aplicación.2: Control de vistas

3: Botones de acción4: Botón de desbordamiento de acciones

Page 143: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

143

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

6. Barra de acción El API a partir del cual fue añadida la barra de acción fue en la versión

Android 3.0 (API level 11). Está disponible a través de la Support Library para hacerla compatible

desde la versión Android 2.1 (API level 7). Uso de la barra de acción en aplicaciones Android 3.0 o superiores:

Basta con usar el tema Holo ( o cualquiera de sus descendientes), el cual es el tema por defecto1.

Llamar a requestFeature(FEATURE_ACTION_BAR). Declararla en un nuevo tema a través de la propiedad windowActionBar. Si no se quiere barra de acción en una activity se puede hacer a través del tema:

Theme.Holo.NoActionBar. Ocultar/mostrar la barra de acción: El método getActionBar() devuelve una

instancia a la barra (Clase ActionBar) y entonces se pueden usar los métodos hide(), para ocultarla, o show() para mostrarla.

1. Como es el tema por defecto, si se los atributos targetSdkVersion o minSdkVersion se establecen a «11» o un valor superior.

4. Diseño de interfaces

Page 144: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

144

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Añadir la barra de acción en aplicaciones usando la Support Library

6. Barra de acción

Configurar la biblioteca  appcompat v7. Crear una activity derivando de la clase:

android.support.v7.app.AppCompatActivity (Actualizado en la V22.1, antes era ActionBarActivity) .

Añadir o extender el tema: Theme.AppCompat

Ocultar/mostrar la barra de acción: El método getSupportActionBar() devuelve una instancia a la barra (Clase ActionBar) y entonces se pueden usar los métodos hide(), para ocultarla, o show() para mostrarla.

4. Diseño de interfaces

<activity android:theme="@style/Theme.AppCompat.Light« ... >

Page 145: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

145

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Otros aspectos de la barra de acción

6. Barra de acción

Consideraciones sobre la ocultación y muestra de la barra de acción: Cada vez que se oculte o muestre la barra de acción la actividad se tiene que

recomponer y distribuir el espacio para el layout y la ausencia o presencia de la barra de acción.

La barra de acción se puede configurar para que se superponga al layout (overlay) a través del atributo de la actividad windowActionBarOverlay puesto a true.

Usar un logo en vez del icono. La barra de acción usa normalmente el icono definido en el atributo icon de

<application> o <activity>, pero puede usar igualmente un logo, estableciendo el deseado en las partes anteriores.

Un logo normalmente es más ancho y debe evitar texto innecesario, pero está liberado de las proporciones cuadradas de los iconos.

4. Diseño de interfaces

Page 146: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

146

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Añadir elementos de acción

6. Barra de acción

El espacio disponible se rellena con los elementos definidos en un recurso menú a través de la llamada al método onCreateOptionsMenu(). Al igual que se vio para los menús.

Aquellos botones u opciones que no dispongan de espacio suficiente podrán ser accedidos por el botón de desbordamiento.

Para mostrar el texto aun teniendo icono: <item yourapp:showAsAction="ifRoom|withText" ... />

4. Diseño de interfaces

<menu xmlns:android="http://schemas.android.com/apk/res/android"      xmlns:yourapp="http://schemas.android.com/apk/res-auto" >    <item android:id="@+id/action_search"          android:icon="@drawable/ic_action_search"          android:title="@string/action_search"          yourapp:showAsAction="ifRoom"  />    ...</menu> Para la Support API

Page 147: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

147

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Cambiar a ToolBar

6. Barra de acción

La barra de acción presenta problemas en cuanto a su aspecto en distintas versiones, incluso con la biblioteca de soporte.

No soporta Material Design a menos que se cree un proyecto Android 5 o superior.

Por eso se creó la ToolBar: Soporte completo desde API 7 Soporte a Material Design. Misma experiencia de uso en diferentes versiones.

4. Diseño de interfaces

Page 148: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

148

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Usar una ToolBar en vez de la barra de acción

6. Barra de acción

1. Usar la biblioteca de soporte v7 appcompat.2. Emplear la actividad herede de AppCompatActivity.3. Usar un tema que no muestre la barra de acción para

impedir su uso de forma nativa:

4. Diseño de interfaces

<application  android:theme="@style/Theme.AppCompat.Light.NoActionBar"/>

Page 149: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

149

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Usar una ToolBar en vez de la barra de acción

6. Barra de acción

4. Añadir la ToolBar al layout de la actividad

4. Diseño de interfaces

<android.support.v7.widget.Toolbar   android:id="@+id/my_toolbar"   android:layout_width="match_parent"   android:layout_height="?attr/actionBarSize"   android:background="?attr/colorPrimary"   android:elevation="4dp"   android:theme="@style/ThemeOverlay.AppCompat.ActionBar"   app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/>

Page 150: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

150

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Usar una ToolBar en vez de la barra de acción

6. Barra de acción

5. Establecer la toolbat como barra de aplicación en el método onCreate() de la actividad con setSupportActionBar().

4. Diseño de interfaces

@Overrideprotected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_my);    Toolbar myToolbar = (Toolbar) findViewById(R.id.my_toolbar);    setSupportActionBar(myToolbar);    }

Page 151: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

151

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

7. Fragmentos Los Fragmentos (Fragments) permiten crear aplicaciones

multi-panel que gestionen el espacio disponible en pantalla de manera automática.

Así pues, con la clase Fragment se pueden crear como aplicaciones anidadas con su propio layout y ciclo de vida.

Un fragmento tiene su propio layout y puede diseñarse en conjunto con otros fragmentos dentro de una Activity para controlar la forma en que se muestran, pero si hay espacio disponible se mostrarán varios fragmentos a la vez.

4. Diseño de interfaces

Page 152: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

152

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

7. Fragmentos Fueron introducidos para dar cobertura a los

tablets con Android Honeycomb (febrero de 2011, Android 3.0 API level 11)

Pero gracias a la Android Support Library se pueden usar desde Android 1.6 (API level 4).

Para usarla mirar en:http://developer.android.com/training/basics/fragments/support-lib.html

4. Diseño de interfaces

Page 153: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

153

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

7. Fragmentos Un Fragment puede verse como un módulo o sub-actividad de

una Activity con su propio ciclo de vida y eventos de entrada que puede ser activada o desactivada cuando se necesita.

Aspectos a tener en cuenta: Un Fragment siempre debe estar incluido en una Activity. Cada fragmento en una Activity está afectado por el ciclo de vida de

esta, así si es pausada o destruida, todos los fragmentos también lo son.

Sin embargo, cuando la Activity está en ejecución (estado resumed) cada fragmento puede ser manipulado separadamente, de manera que se puede añadir o eliminar.

Las operaciones sobre los fragmentos pueden añadirse a la back stack que es manejada por la Activity para poder navegar por los estados pasados de los fragmentos.

4. Diseño de interfaces

Back stack: pila que se gestiona para almacenar las llamadas a actividades o fragmentos y que es accedida cada vez que se presiona el botón back de un dispositivo.

Page 154: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

154

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Añadir fragmentos a una actividad

7. Fragmentos

Cuando un fragmento es parte del layout de una Activiy el forma parte de un ViewGroup dentro de la jerarquía de vistas de la Activity.

Un fragmento puede ser añadido al layout de un Activity de dos formas: Directamente en el código XML del layout de la Activity a

través de la marca <fragment> Desde el código de la actividad en tiempo de ejecución.

Un fragmento no necesita tener interfaz de usuario, pudiendo actuar de manera invisible para llevar a cabo tareas que no necesiten interacción visual.

4. Diseño de interfaces

Page 155: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

155

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Crear un fragmento

7. Fragmentos

Para crear un fragmento se debe crear un subclase de Fragment (o una subclase que ya exista).

La clase Fragment tiene un aspecto similar a una Activity ya que contiene métodos de llamada similares, tales como onCreate(), onStart(), onPause() y onStop().

Nota: Es posible reutilizar el código de actividades existentes en fragmentos simplemente moviendo el código a los métodos de llamada correspondientes del fragmento.

4. Diseño de interfaces

Page 156: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

156

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Ciclo de vida de un fragmento

7. Fragmentos

Los siguientes métodos deberían ser siempre implementados en un fragmento: onCreate(): El sistema llama a este método al crear el fragmento.

En su implementación se deben inicializar componentes esenciales del fragmento que se quieran retener cuando éste se pause o se para y más tarde activado (resumed).

onCreateView(): El sistema llama este método cuando se necesita dibujar la interfaz de usuario del fragmento la primera vez. Este método debe devolver un objeto de la clase View que sea la raíz del layout del fragmento. Se puede devolver null para indicar que el fragmento no tiene interfaz de usuario.

onPause(): El sistema llama a este método como primer síntoma de que el usuario está dejando el fragmento, lo cual no implica que siempre el fragmento sea destruido. En este método se deben guardar todos aquellos datos que deban ser persistentes durante la sesión de trabajo del usuario debido a que el usuario puede no volver.

4. Diseño de interfaces

Page 157: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

157

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Ciclo de vida de un fragmento

7. Fragmentos

4. Diseño de interfaces

Page 158: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

158

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Subclases de Fragment

7. Fragmentos

Existen algunas subclases de la clase Fragment que añaden funcionalidades útiles que pueden ser interesantes para hacer una implementación más rápida y consistente.

DialogFragment: Muestra un cuadro de diálogo flotante. Usar esta clase puede ser una buena alternativa a los métodos normales de creación de cuadros de diálogos debido a que un DialogFragment puede ser incorporado a la pila de llamadas (back stack) de una Activity permitiendo al usuario volver a él si fuera necesario.

ListFragment: Muestra una lista de objetos gestionada por un adaptador (tal como un SimpleCursorAdapter), similar a un ListActivity. Este tipo de fragmentos proporcionan varios métodos para gestionar la lista tales como onListItemClick() para controlar los eventos de pulsación.

PreferenceFragment: Muestra la jerarquía de Preferencias como una lista similar a un PreferenceActivity. Es útil a la hora de crear un activity de configuración a una aplicación.

4. Diseño de interfaces

Page 159: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

159

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Añadir fragmentos a una Activity a través de su layout

7. Fragmentos

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="match_parent">

<fragment android:name="com.example.news.ArticleListFragment" android:id="@+id/list" android:layout_weight="1" android:layout_width="0dp" android:layout_height="match_parent" />

<fragment android:name="com.example.news.ArticleReaderFragment" android:id="@+id/viewer" android:layout_weight="2"android:layout_width="0dp" android:layout_height="match_parent" />

</LinearLayout>

4. Diseño de interfaces

Fichero de layout de la Activity

Fragmento 1

Fragmento 2

Page 160: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

160

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Añadir fragmentos a una Activity a través de su layout

7. Fragmentos

El atributo android:name debe contener el nombre de la clase que instanciará el fragmento.

Cuando el sistema crea el layout de la Activity, cada fragmento que se ha especificado en el layout se instancia y llama el método onCreateView() para obtener el elemento View que devuelve dicho método directamente en el lugar especificado por en elemento <fragment>

Cada fragmento requiere un identificador único para que el sistema pueda restaurarlo si la actividad reinicia o para hacer transacciones con él. Esto se puede hacer: A través de android:id. O de un android:tag con una cadena única. Si no se proporciona ninguno de los anteriores el sistema usa el ID de

la vista contenedora.

4. Diseño de interfaces

Page 161: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

161

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Añadir fragmentos a una Activity a través de su layout

7. Fragmentos

Código en un fragmento que carga un layout desde un XMLpublic static class ExampleFragment extends Fragment{

@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){

// Inflate the layout for this fragment return inflater.inflate(R.layout.example_fragment, container, false); }

}

4. Diseño de interfaces

Page 162: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

162

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Añadir fragmentos a una Activity a través del código

7. Fragmentos

Mientras una activity esté en ejecución, se puede añadir un fragmento a un ViewGroup existente. Para poder hacer transacciones en una activity, tales como añadir, eliminar o reemplazar un fragmento, se debe usar el API disponible con FragmentTransaction.

FragmentManager fragmentManager = getFragmentManager() FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

4. Diseño de interfaces

Page 163: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

163

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Añadir fragmentos a una Activity a través del código

7. Fragmentos

A continuación se puede añadir un fragmento de la siguiente manera:ExampleFragment fragment = new ExampleFragment(); fragmentTransaction.add(R.id.fragment_container, fragment); fragmentTransaction.commit();

El primer parámetro del método add es el ID del ViewGroup y el segundo el fragmento a añadir.

También podremos eliminarlos con remove() y reemplazar con replace().

Para que la transacción se lleva a cabo es necesario la ejecución de commit().

4. Diseño de interfaces

Page 164: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

164

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Crear fragmentos directamente en el código de una Activity

7. Fragmentos

Los fragmentos deben tener un contenedor de tipo View disponible antes de su creación (puede ser un simple FrameLayout vacío):<FrameLayout xmlns:android=http://schemas.android.com/apk/res/androidandroid:id="@+id/fragment_container" android:layout_width="match_parent" android:layout_height="match_parent" />

Y dentro de la aplicación llamar a getSupportFragmentManager() para obtener un FragmentManager si se usa las Support Library APIs.

Usar el método beginTransaction() para crear una  FragmentTransaction  Después llamar al método add().

4. Diseño de interfaces

Page 165: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

165

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Crear fragmentos directamente en el código de una Activity

7. Fragmentos

public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.news_articles);

if (findViewById(R.id.fragment_container) != null) { if (savedInstanceState != null) { return; }

firstFragment = new HeadlinesFragment(); firstFragment.setArguments(getIntent().getExtras());

getSupportFragmentManager().beginTransaction().add(R.id.fragment_container, firstFragment).commit();

}}

4. Diseño de interfaces

Page 166: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

166

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Gestionar fragmentos

7. Fragmentos

Para gestionar otros aspectos de los fragmentos, a parte de añadir/eliminar/reemplazar se usa también  FragmentManager.

Para obtenerlo llamar getFragmentManager() desde la activity Otras operaciones que se pueden hacer son:

Obtener los fragmentos que existen en una activity con findFragmentById(), para los que tienen un ID en el layout de la activity o  findFragmentByTag() para los que no proporcionan un UI.

Sacar fragmentos de la back stack con popBackStack(), de esta manera se simula la pulsación del botón Back por el usuario.

Registrar un listener para los cambios en la back stack con addOnBackStackChangedListener().

4. Diseño de interfaces

Page 167: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

167

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Gestión de fragmentos. Orientación

7. Fragmentos

if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {

// PORTRAIT ORIENTATIONsetupPortraitView();

} else {// LANDSCAPE ORIENTATIONsetupLandscapeView();

}

4. Diseño de interfaces

Page 168: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

168

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Comunicación Fagment-Activity

7. Fragmentos

Un fragmento está ligado directamente a la activity que lo contiene, pudiendo acceder a esta a través del método getActivity().

View listView = getActivity().findViewById(R.id.list); A su vez, la activity puede usar métodos del fragmento a través

de FragmentManager, usando findFragmentById() o findFragmentByTag().

4. Diseño de interfaces

Fragment1 fragment = (Fragment1) getFragmentManager().findFragmentById(R.id.example_fragment);

Page 169: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

169

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Crear eventos de notificación para la activity

7. Fragmentos

Un fragmento puede enviar notificaciones al Activity que lo contiene a través de la implementación de un interfaz común:

La Activity deberá luego implementar dicho interface y los métodos en él declarados.

4. Diseño de interfaces

public static class FragmentA extends ListFragment{... // Container Activity must implement this interface public interface OnArticleSelectedListener{

public void onArticleSelected(Uri articleUri); } ...

}

Page 170: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

170

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Crear eventos de notificación para la activity

7. Fragmentos

Para asegurar que la activity padre implementa el interfaz se debe hacer una comprobación en el método onAttach() del fragmento, haciendo un casting a la activity llamante:public static class FragmentA extends ListFragment {

OnArticleSelectedListener mListener; ... @Override public void onAttach(Activity activity) {

super.onAttach(activity); try {

mListener = (OnArticleSelectedListener) activity; } catch (ClassCastException e) {

throw new ClassCastException(activity.toString() + " must implement OnArticleSelectedListener"); }

} ...

}

4. Diseño de interfaces

Page 171: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

171

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Crear eventos de notificación para la activity

7. Fragmentos

Posteriormente, si no hay excepción, el fragmento puede usar su interfaz para enviar eventos a la activity:

4. Diseño de interfaces

public static class FragmentA extends ListFragment {

OnArticleSelectedListener mListener; ... @Override public void onListItemClick(ListView l, View v, int position, long id) { …// Send the event and Uri to the host activity mListener.onArticleSelected(noteUri); }

... }

Page 172: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

172

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Fragmentos y la barra de acción

7. Fragmentos

Un fragmento puede contribuir con elementos a la barra de acción (o menú) implementando el método onCreateOptionsMenu().

Para que un fragmento reciba la notificación para crear un menú y se llame el método onCreateOptionsMenu() debe llamar a setHasOptionsMenu().

Los elementos añadidos por el fragmento, cuando son seleccionados hacen que se llame al método onOptionsItemSelected() del mismo.

La Activity será la primera en recibir el evento de la pulsación, y si esta no lo procesa, entonces pasará al fragmento.

4. Diseño de interfaces

Page 173: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

173

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Fragmentos y la barra de acción

7. Fragmentos

También se puede registrar una vista del layout del fragmento para tener un menú contextual llamando a registerForContextMenu(). Cuando el usuario abre el menú el fragmento recive una llamada a

onCreateContextMenu(). Cuando el usuario selecciona un elemento el fragmento recibe una

llamada a onContextItemSelected().

4. Diseño de interfaces

Page 174: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

174

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Android proporciona diversas opciones para grabar los datos de una aplicación de manera persistente.

La solución a elegir depende de las necesidades específicas de la aplicación, así como de las del diseñador. Elecciones típicas son por ejemplo:

Si la información será privada a la aplicación o visible a otras (e incluso al usuario).

Cuanto espacio se requerirá. Etc.

El tipo de almacenamiento se puede dividir en ficheros (internos y externos), bases de datos y a acceso remoto a través de la red. De entre una de estas propiedades se verán las distintas soluciones implementadas en Android.

Incluso la nueva Backup API permite la sincronización de datos en la nube.

5. Almacenamiento de datos en Android

Page 175: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

175

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Tipos de almacenamiento Basadas en ficheros:

Preferencias Compartidas (Shared Preferences): Almacenan datos privados en un formato de pares de clave y valor.

Almacenamiento interno: Almacena ficheros privados en la memoria no volátil del dispositivo.

Almacenamiento externo: Almacenar ficheros en un dispositivo externo compartido, de manera pública, y que puede no estar siempre disponible.

Bases de datos Bases de Datos SQLite: Es la manera de almacenar datos de manera

estructurada en una base de datos privada a la aplicación. A través de la red: Con una conexión de red podremos guardar la

información remotamente en cualquier servidor con este servicio, como por ejemplo un servidor FTP.

5. Almacenamiento de datos en Android

Page 176: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

176

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Tipos de almacenamiento Android proporciona una manera de exponer los datos privados

de una aplicación para que puedan ser accedidos por cualquier otra aplicación a través de content providers.

Un content provider es un componente opcional que proporciona acceso de lectura/escritura a los datos de una aplicación, sujeto siempre a las restricciones que se hayan querido imponer.

5. Almacenamiento de datos en Android

Page 177: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

177

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Preferencias compartidas (Shared preferences) La clase SharedPreferences proporciona el marco general que

permite el almacenar y recuperar pares de valores persistentes a través de claves concretas de tipos de datos primitivos (boolean, float, int, long y String). Estos valores persistirán entre distintas sesiones de usuario, incluso si la aplicación es eliminada de memoria.

Para obtener un objeto de la clases SharedPreferences se puede usar uno de estos dos métodos:

getSharedPreferences() - Esta función se usa si se necesitan varios ficheros de preferencias identificados por un nombre, el cual se especifica en el primer parámetro.

getPreferences() - Si tan sólo se necesita un fichero de preferencias para una Activity este es el método a usar. Debido a que tan sólo habrá un fichero, no es necesario proporcionarle el nombre.

6. Almacenamiento basado en ficheros

Page 178: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

178

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Para escribir valores

Preferencias compartidas (Shared preferences)

Llamar al método edit() para obtener un SharedPreferences.Editor.

Añadir valores con métodos tales como putBoolean() o putString().

Confirmar los nuevos valores con la llamada al método commit().

6. Almacenamiento basado en ficheros

Page 179: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

179

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Use los métodos de SharedPreferences tales como getBoolean() o getString().

Preferencias compartidas (Shared preferences)Para leer valores

6. Almacenamiento basado en ficheros

Page 180: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

180

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Ejemplo

Preferencias compartidas (Shared preferences)

@Overrideprotected void onCreate(Bundle state){  super.onCreate(state);   . . .    // Restore preferences       SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);       boolean silent = settings.getBoolean("silentMode", false);       setSilent(silent); }

@Overrideprotected void onStop(){  super.onStop();         SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);   SharedPreferences.Editor editor = settings.edit();   editor.putBoolean("silentMode", mSilentMode);

   // Commit the edits!   editor.commit();   }

6. Almacenamiento basado en ficheros

Al crear/iniciar

Al salir

Page 181: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

181

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

public interface SharedPreferences

Preferencias compartidas (Shared preferences)

Valor devuelto Métodoabstract Map<String, ?> getAll()Retrieve all values from the preferences.

abstract boolean getBoolean(String key, boolean defValue)abstract float getFloat(String key, float defValue)

abstract int getInt(String key, int defValue)abstract long getLong(String key, long defValue)

abstract String getString(String key, String defValue)abstract Set<String> getStringSet(String key, Set<String>

6. Almacenamiento basado en ficheros

Métodos públicos

Page 182: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

182

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Preferencias compartidas (Shared preferences)public static interface SharedPreferences.Editor

Métodos públicosValor devuelto Método

abstract void apply()Commit your preferences changes back from this Editor to the SharedPreferences object it is editing.

abstract SharedPreferences.Editor

clear()Mark in the editor to remove all values from the preferences.

abstract boolean commit()Commit your preferences changes back from this Editor to the SharedPreferences object it is editing.

abstract SharedPreferences.Editor

putBoolean(String key, boolean value)Set a boolean value in the preferences editor, to be written back once commit() or apply() are called.

6. Almacenamiento basado en ficheros

Page 183: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

183

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Preferencias compartidas (Shared preferences)public static interface SharedPreferences.Editor

Métodos públicosValor devuelto Métodoabstract SharedPreferences.Editor putFloat(String key, floatabstract SharedPreferences.Editor putInt(String key, int value)abstract SharedPreferences.Editor putLong(String key, long value)abstract SharedPreferences.Editor putString(String key, String value)abstract SharedPreferences.Editor putStringSet(String key, Set<String>

values)abstract SharedPreferences.Editor remove(String key)Mark in the editor that

a preference value should be removed, which will be done in the actual preferences once commit() is called.

6. Almacenamiento basado en ficheros

Page 184: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

184

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Preferencias compartidas (Shared preferences) Las preferencias compartidas no son

estrictamente la manera de almacenar las preferencias de usuario de una aplicación, tales como el tono de llamada elegido o la imagen de fondo.

Para crear preferencias de usuario es a través de PreferenceActivity, la cual proporciona una plataforma para una Activity para crear preferencias de usuario, las cuales serán automáticamente persistentes usando preferencias compartidas.

6. Almacenamiento basado en ficheros

Page 185: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

185

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Ficheros privados

Almacenamiento interno

Se pueden grabar ficheros directamente en los dispositivos de almacenamiento de que disponga el dispositivo. Por defecto, todos estos ficheros serán privados y

tan sólo accesibles por la aplicación que los creó, no pudiendo ser leídos por otras aplicaciones, ni por el usuario.

Además, estos ficheros serán eliminados si el usuario desinstala la aplicación.

6. Almacenamiento basado en ficheros

Page 186: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

186

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Ficheros privados

Almacenamiento interno

Para crear y escribir en un fichero privado es tan sencillo como lo siguiente: Llamar a openFileOutput() con el nombre del fichero y el modo de

operación. Esto devolverá un FileOutputStream. Escribir en él con write(). Y cerrar lo con close().

Para leer de un fichero privado: Llamar a openFileInput() con el nombre del fichero a leer. Esto

devolverá un FileInputStream. Leer bytes del fichero usando read(). Y cerrarlo después con close().

6. Almacenamiento basado en ficheros

Page 187: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

187

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

try {FileOutputStream os = openFileOutput(filename, MODE_PRIVATE| MODE_APPEND);DataOutputStream dos = new DataOutputStream(os);dos.writeUTF(texto);dos.writeInt(n);dos.flush();dos.close();os.close();

} catch (IOException ex) {…}

Almacenamiento internoFicheros privados. Ejemplo: Grabar datos

6. Almacenamiento basado en ficheros

Page 188: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

188

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

try {FileInputStream os = openFileInput(filename);DataInputStream dos = new DataInputStream(os);int n = dos.available();texto = "Leidos (" + n + " bytes)\r\n";while (dos.available() > 0) {

texto = texto + " clave: " + dos.readUTF() + " valor:"+ dos.readInt() + "\r\n";}resultado.setText(texto);dos.close();os.close();

} catch (IOException ex) {…}

Almacenamiento internoFicheros privados. Ejemplo: Leer datos

6. Almacenamiento basado en ficheros

Page 189: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

189

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Si se quiere tener un fichero no modificable en una aplicación en tiempo de compilación, se puede grabar en la carpeta del proyecto res/raw/.

Este fichero se puede abrir con openRawResource(), pasándole el identificador de recurso R.raw.<filename>. Este método devuelve un InputStream que se puede usar para leer del fichero (el fichero original no se puede modificar)

Almacenamiento internoFicheros privados: Ficheros como recursos

6. Almacenamiento basado en ficheros

Page 190: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

190

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

MODE_PRIVATE creará el fichero o reemplazará uno del mismo nombre.

Otros modos disponibles son:  MODE_APPEND, MODE_WORLD_READABLE MODE_WORLD_WRITEABLE.

Almacenamiento internoFicheros privados. Ejemplos

String FILENAME = "hello_file";String string = "hello world!";

FileOutputStream fos = openFileOutput(FILENAME, Context.MODE_PRIVATE);fos.write(string.getBytes());fos.close();

6. Almacenamiento basado en ficheros

Page 191: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

191

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Ficheros de caché

Almacenamiento interno

Si los ficheros tan sólo se necesitan durante un periodo de tiempo limitado se deben usar ficheros de caché.

Se obtiene acceso a ellos con la llamada getCacheDir() que devuelve un File que representa el directorio interno donde una aplicación debe guardar sus ficheros temporales de caché.

Estos ficheros pueden ser eliminados para recuperar espacio cuando un dispositivo Android le queda poca capacidad de almacenamiento interno.

6. Almacenamiento basado en ficheros

Page 192: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

192

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Ficheros de caché

Almacenamiento interno

No se debe delegar en el sistema para que estos ficheros sean eliminados, por lo que deben ser gestionados por la aplicación y mantener el espacio ocupado dentro de unos límites razonables, como por ejemplo 1 Mbyte.

Cuando el usuario desinstala la aplicación estos ficheros de caché son borrados, al igual que los ficheros privados.

6. Almacenamiento basado en ficheros

Page 193: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

193

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Ficheros de caché

Almacenamiento interno

Para crear un nuevo archivo basta con usar la instancia a File devuelta getCacheDir() y llamar a los métodos:

6. Almacenamiento basado en ficheros

public static File createTempFile (String prefix,String suffix,File directory)

public static File createTempFile (String prefix,String suffix)

Page 194: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

194

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Disponibles en la clase Context.public abstract class Context extends Object getFilesDir(): Obtiene la ruta absoluta al directorio del

sistema de archivos donde los ficheros internos de una aplicación serán almacenados.

getDir(): Crea (o abre un directorio existente) dentro del espacio de almacenamiento interno de una aplicación.

deleteFile(): Borra un fichero del almacenamiento interno.

fileList(): Devuelve un array de ficheros que almacena actualmente una aplicación.

Almacenamiento interno Métodos útiles

6. Almacenamiento basado en ficheros

Page 195: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

195

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Almacenamiento externo Cada dispositivo compatible con Android soporta algún

formato de almacenamiento externo compartido, que puede ser usado para almacenar ficheros. Este dispositivo de almacenamiento puede ser una tarjeta

SD o dispositivos internos no removibles. Los archivos grabados en el dispositivo de

almacenamiento externo pueden ser accedidos por cualquier aplicación.

Además, pueden ser modificados por el usuario cuando este habilita el acceso de transferencia masivo a través de USB al conectarlo a un ordenador.

6. Almacenamiento basado en ficheros

Page 196: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

196

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Los ficheros externos desaparecen cuando el usuario monta el almacenamiento externo en un ordenador o lo quita del dispositivo Android

No hay medidas de seguridad especiales para los ficheros en el almacenamiento externo, ya que como se ha comentado, cualquier aplicación o usuario puede leerlos, modificarlos, o incluso eliminarlos.

Para evitar que el escáner de medios de Android incluya ficheros de una aplicación en la Galería o en la Música se puede poner un fichero vacío denominado .nomedia.

Almacenamiento externoPrecauciones con el almacenamiento externo

6. Almacenamiento basado en ficheros

Page 197: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

197

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Para que una aplicación pueda usar el almacenamiento externo debe incluir ciertos permisos en su AndroidManifiest.xml: Leer: android.permission.READ_EXTERNAL_STORAGE Escribir: android.permission.WRITE_EXTERNAL_STORAGE (lleva implícita la

lectura)

<manifest...>...   <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />...</manifest>

Nota: desde Android 4.4, estos permisos no son requeridos si los ficheros son privadas a la aplicación.

Almacenamiento externoObtener permiso para acceder al almacenamiento externo

6. Almacenamiento basado en ficheros

Page 198: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

198

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Antes de realizar cualquier tarea con el almacenamiento externo, se debe llamar al método estático getExternalStorageState() de la clase Environment para comprobar si el dispositivo está disponible. Este método devuelve diversos valores en función del estado del soporte de almacenamiento, pudiendo usarlo tan sólo para leer o escribir si el valor Environment.MEDIA_MOUNTED, y tan sólo leer si el valor es Environment.MEDIA_MOUNTED_READ_ONLY. Otros valores aparecen a continuación.

Almacenamiento externoComprobar la existencia de un medio de almacenamiento

6. Almacenamiento basado en ficheros

Page 199: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

199

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Almacenamiento externoComprobar la existencia de un medio de almacenamiento

Constante

Clase Environment

String MEDIA_BAD_REMOVAL El dispositivo fue removido antes de ser desmontado

String MEDIA_CHECKING El medio se está comprobando

String MEDIA_MOUNTED El medio está montado y disponible para leer/escribir

String MEDIA_MOUNTED_READ_ONLY El medio está montado pero en un punto de solo lectura

String MEDIA_NOFS El medio está en blanco o tiene un sistema de archivos incorrecto

6. Almacenamiento basado en ficheros

Page 200: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

200

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Almacenamiento externoComprobar la existencia de un medio de almacenamiento

Constante

Clase Environment

String MEDIA_REMOVED No hay medio

String MEDIA_SHARED El medio está presente pero no está montado y compartido por USB

String MEDIA_UNMOUNTABLE El medio no puede ser montado

String MEDIA_UNMOUNTED El medio está presente pero no montado

6. Almacenamiento basado en ficheros

Page 201: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

201

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

boolean mExternalStorageAvailable = false;boolean mExternalStorageWriteable = false;String state = Environment.getExternalStorageState();

if (Environment.MEDIA_MOUNTED.equals(state)){// We can read and write the mediamExternalStorageAvailable = mExternalStorageWriteable = true;

} else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)){  // We can only read the media  mExternalStorageAvailable = true;  mExternalStorageWriteable = false;} else {    // Something else is wrong. It may be one of many other states, but all we need    //  to know is we can neither read nor write    mExternalStorageAvailable = mExternalStorageWriteable = false;}

Almacenamiento externoComprobar la existencia de un medio de almacenamiento. Ejemplo

6. Almacenamiento basado en ficheros

Page 202: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

202

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Se debe usar getExternalFilesDir() para obtener un File que representa el directorio del almacenamiento externo donde la aplicación debería almacenar los ficheros. El parámetro de este método especifica el tipo de subdirectorio que se

quiere, tales como DIRECTORY_MUSIC o DIRECTORY_RINGTONES. Este método creará el directorio apropiado si es necesario. Especificando el tipo de directorio se asegura que el escáner de medios de Android clasificará apropiadamente los archivos en el sistema (por ejemplo los tonos de llamada serán tonos de llamada y no música).

Si se pasa null, se obtiene el directorio raíz del directorio de la aplicación.

Almacenamiento externoAPI 8 o superior. Acceder a ficheros en el almacenamiento externo.

6. Almacenamiento basado en ficheros

Page 203: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

203

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Si el usuario desinstala la aplicación, los directorios creados por este medio y todo su contenido serán borrados.

No se deben utilizar para almacenar ficheros que el usuario podría querer acceder desde otras aplicaciones, como fotografías, música, etc.

Almacenamiento externoAPI 8 o superior. Acceder a ficheros en el almacenamiento externo.

6. Almacenamiento basado en ficheros

Tipos de directoriosDIRECTORY_MUSICDIRECTORY_PODCASTSDIRECTORY_RINGTONES

DIRECTORY_ALARMSDIRECTORY_NOTIFICATIONSDIRECTORY_PICTURESDIRECTORY_MOVIES

Page 204: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

204

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Se debe usar getExternalStorageDirectory() para abrir un File que represente la raíz del almacenamiento externo. Los datos deben ser escritos en el siguiente directorio:

/Android/data/<package_name>/files/ Donde <package_name>  es el nombre del paquete en el estilo

de Java, tal como "com.example.android.app". Si el usuario está ejecutando un API nivel 8 o superior y

desinstala la aplicación, el directorio y todo su contenido será eliminado.

Almacenamiento externoAPI 7 o inferior. Acceder a ficheros en el almacenamiento externo.

6. Almacenamiento basado en ficheros

Page 205: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

205

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Environment.getExternalStoragePublicDirectory(String type): devuelve el directorio raíz del almacenamiento externo de un determinado tipo.

El usuario tendrá aquí sus ficheros, por lo que se deben tratar con cuidado y evitar borrados o reemplazos accidentales.

En dispositivos con varios usuarios cada uno tiene un espacio separado en el almacenamiento externo.

Almacenamiento externoDirectorio público de almacenamiento compartido

6. Almacenamiento basado en ficheros

Tipos (no debería ser null)DIRECTORY_MUSICDIRECTORY_PODCASTSDIRECTORY_RINGTONESDIRECTORY_ALARMSDIRECTORY_NOTIFICATIONSDIRECTORY_PICTURESDIRECTORY_MOVIESDIRECTORY_DOWNLOADSDIRECTORY_DCIM

Page 206: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

206

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Directorio público de almacenamiento compartido

Almacenamiento externo

6. Almacenamiento basado en ficheros

File path = Environment.getExternalStoragePublicDirectory(            Environment.DIRECTORY_PICTURES);File file = new File(path, "DemoPicture.jpg");

try { // Comprobar que el directorio aún existe. path.mkdirs(); InputStream is = new FileInputStream(file);    OutputStream os = new FileOutputStream(file); …} catch (IOException e) { …}

Page 207: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

207

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Para conseguir que un archivo recién creado esté rápidamente disponible al usuario se puede llamar al gestor de medios.

MediaScannerConnection.scanFile(this, new String[] { file.toString() }, null, new MediaScannerConnection.OnScanCompletedListener(){     public void onScanCompleted(String path, Uri uri)       Log.i("ExternalStorage", "Scanned " + path + ":");       Log.i("ExternalStorage", "-> uri=" + uri);            }        });

Almacenamiento externoGestor de medios - MediaManager

6. Almacenamiento basado en ficheros

Page 208: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

208

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Android proporciona acceso a bases de datos a través de SQLite.

Cualquier clase de la aplicación podrá acceder a una bases de datos creada por la misma, pero ninguna otra aplicación tendrá acceso.

Android no impone ninguna limitación adicional más allá de lo dispuesto por SQLite.

Recomendaciones: Incluir un identificador único autoincrementado

(ID). No es obligatorio para las bases de datos privadas, pero es obligatorio para los Content provider

7. Bases de datos

Page 209: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

209

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Diseñado para ser simple, de administrar, operar, introducir en programas, de mantener y personalizar.

SQLite está pensado para sustituir a fopen(), no a Oracle.

Diseñada para ocupar un solo fichero en el sistema de archivos.

Alta concurrencia: SQLite soporte cualquier número de lectores a la vez, pero solamente un escritor.

Bases de datos SQLite

7. Bases de datos

Page 210: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

210

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Transacciones atómicas, consistentes, aisladas y duraderas (en inglés ACID).

No se necesita configuración ni administración. Implementa casi al completo SQL92 (las características

omitidas aparecen en www.sqlite.org/omitted.html). Permite bases de datos de terabytes y cadenas o

BLOBs(Binary Large Objets) de gigabytes. Ligero, rápido y API sencilla, escrita en ANSI-C, libre, auto-

contenida y multi-plataforma. Proporciona una interfaz de línea de comandos que

permite gestionar las bases de datos.

Bases de datos SQLiteCaracterísticas

7. Bases de datos

Page 211: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

211

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Para el formateo de ficheros específicos de aplicaciones.

Para aplicaciones y dispositivos empotrados. Páginas web. Reemplazo de ficheros ad-hoc de aplicaciones. Gestión de bases de datos temporales internas.Entre otras…

Bases de datos SQLiteUsos apropiados de SQLite

7. Bases de datos

Page 212: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

212

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Aplicaciones cliente/servidor. Sitios web con gran volumen de accesos, una

base de datos basada en cliente/servidor en una máquina diferente puede ayudar.

Contenidos muy grandes: SQLite está limitada a 140 terabytes. Al almacenarse en un solo fichero, podría estar limitado por el sistema operativo.

Bases de datos SQLiteSituaciones en las que SQLite no es apropiado

7. Bases de datos

Page 213: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

213

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

NULL. Valor nulo (NULL). INTEGER. Entero con signo almacenado en 1, 2, 3,

4, 6, u 8 bytes, dependiendo de la magnitud del valor.

REAL. Punto flotante almacenado según el formato de 8-bytes del IEEE.

TEXT. Cadena de texto almacenada codificada en UTF-8, UTF-16BE o UTF-16LE.

BLOB. Objeto binario grande, almacenado tal cual se ha escrito.

Bases de datos SQLiteTipos de datos

7. Bases de datos

Page 214: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

214

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Android proporciona acceso a bases de datos a través de SQLite.

Cualquier clase de la aplicación podrá acceder a una bases de datos creada por la misma, pero ninguna otra aplicación tendrá acceso.

Dado que se administran como un fichero, su acceso puede ser lento y se recomienda realizar las operaciones con ellas de manera asíncrona.

El paquete android.database.sqlite contiene todas las clases para manejo de bases de datos SQLite.

Creación y manejo de una base de datos

7. Bases de datos

Page 215: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

215

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

La manera que se recomienda crear una base de datos es a través de la creación de una clase que herede de SQLiteOpenHelper, codificando su método onCreate.

Creación y manejo de una base de datos

7. Bases de datos

Page 216: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

216

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

public class RecordsSQLiteHelper extends SQLiteOpenHelper{private static final String DATABASE_NAME = "recordslist";

private static final int DATABASE_VERSION = 1;

public static final String TABLA_RECORDS = "records"; public static final String COLUMNA_ID = "_id"; public static final String COLUMNA_ETIQUETA = "label"; public static final String COLUMNA_VALOR = "value";

private static final String DATABASE_CREATE = "create table " + TABLA_RECORDS + "(" + COLUMNA_ID + " integer primary key autoincrement, " + COLUMNA_ETIQUETA + " text not null, " + COLUMNA_VALOR + " integer nor null);";

…}

Creación y manejo de una base de datosEjemplo de creación de una base de datos

Sentencia en SQL

7. Bases de datos

Page 217: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

217

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

public class RecordsSQLiteHelper extends SQLiteOpenHelper{… public RecordsSQLiteHelper(Context context) {

super(context, DATABASE_NAME, null, DATABASE_VERSION); }

@Override public void onCreate(SQLiteDatabase database) { database.execSQL(DATABASE_CREATE); }

…}

Creación y manejo de una base de datosEjemplo de creación de una base de datos

Creación de la base de datos

7. Bases de datos

Page 218: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

218

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Cuando el código de versión se incrementa en el código de una aplicación se llama el método onUpgrade().

En este método se pueden borrar o alterar el esquema de la base de datos para que más tarde sea creada en onCreate().

Para mantener una implementación limpia se recomienda crear una clase por cada tabla.

Creación y manejo de una base de datosActualizar una base de datos

7. Bases de datos

Page 219: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

219

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)

{ Log.w(RecordsSQLiteHelper.class.getName(),"Upgrading database from

version " + oldVersion + " to "+ newVersion + ", which will destroy all old data");

db.execSQL("DROP TABLE IF EXISTS " + TABLA_RECORDS); onCreate(db);}

Creación y manejo de una base de datosEjemplo de actualización de una base de datos

7. Bases de datos

Page 220: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

220

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

La clase SQLiteOpenHelper proporciona los métodos getReadableDatabase() y getWriteableDatabase() que permiten el acceso a un objeto SQLiteDatabase para realizar operaciones de lectura y escritura.

getWriteableDatabase() devuelve un objeto SQLiteDatabase que permite tanto operaciones de lectura como de escritura.

getReadableDatabase() devuelve el mismo objeto que el método anterior salvo situaciones, como la falta de espacio de almacenamiento, en la que devuelve un objeto que no tiene permitidas las operaciones de escritura.

Nota: Ambos métodos pueden tardar mucho tiempo para completarse, por lo que se recomienda no ejecutarlos en la hebra de ejecución principal.

Creación y manejo de una base de datosLeer o escribir de una base de datos

7. Bases de datos

Page 221: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

221

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Es la clase que proporciona Android para trabajar con las bases de datos SQLite. Concretamente proporciona los métodos: insert(). update(). delete(). execSQL() que permite la ejecución de sentencias SQL directamente.

La clase ContentValues permite definir pares de clave/valor. La clave representará el identificador de columna y el valor el

contenido del registro almacenado en esa columna. ContentValues se puede usar en inserciones y actualizaciones de

entradas de una base de datos.

Creación y manejo de una base de datosClase SQLiteDatabase

7. Bases de datos

Page 222: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

222

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Las peticiones pueden ser creadas a través de  los métodos rawQuery() y query() o a través de la clase SQLiteQueryBuilder. rawQuery(): acepta directamente como

entrada una sentencia select de SQL. query(): proporciona una interfaz estructurada para

especificar peticiones SQL. SQLiteQueryBuilder: es una clase muy

recomendable, ya que ayuda a la construcción de peticiones SQL.

Creación y manejo de una base de datosClase SQLiteDatabase. Peticiones (queries)

7. Bases de datos

Page 223: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

223

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Ejemplo de rawQuery()

Creación y manejo de una base de datosClase SQLiteDatabase. Peticiones (queries)

Cursor cursor = getReadableDatabase(). rawQuery("select * from usarios where _id = ?", new String[] { id });

7. Bases de datos

Page 224: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

224

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Ejemplo de query()

Creación y manejo de una base de datosClase SQLiteDatabase. Peticiones (queries)

return database.query(DATABASE_TABLE, new String[] { KEY_ROWID, KEY_CATEGORY, KEY_SUMMARY, KEY_DESCRIPTION }, null, null, null, null, null);

7. Bases de datos

Page 225: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

225

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Clase SQLiteDatabase. Método query

Creación y manejo de una base de datos

El método query tiene cuatro prototipos:Cursor query(String table, String[] columns, String selection, String[]

 selectionArgs, String groupBy, String having, String orderBy, String limit)

Cursor query(boolean distinct, String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit, CancellationSignal cancellationSignal)

Cursor query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy)

Cursor query(boolean distinct, String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit)

7. Bases de datos

Page 226: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

226

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Cuando se está implementando una aplicación donde se quieren realizar un dibujo especializado y/o controlar una animación, se debe realizar a través de un Canvas.

Un canvas (lienzo) funciona como interfaz de la superficie sobre la que los gráficos serán dibujados, recibiendo todas las llamadas de métodos de dibujo.

A través de Canvas, el dibujo es realizado realmente sobre un Bitmap subyacente, el cual es colocado en la ventana.

Canvas

8. Gráficos en 2-D

Page 227: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

227

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Todo el proceso de dibujo se realizará en la llamada al método de callback onDraw(), donde el Canvas se proporciona para su modificación y/o actualización a través de llamadas a métodos de dibujo sobre él.

También se puede adquirir un Canvas a través de la llamada al método SurfaceHolder.lockCanvas(), cuando se esté usando un objeto SurfaceView.

Sin embargo si se necesita crear un nuevo Canvas, se debe definir el Bitmap sobre el cual se realizará realmente el dibujo. El Bitmap siempre es requerido para un Canvas.

Canvas

8. Gráficos en 2-D

Page 228: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

228

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Se puede crear un nuevo Canvas de la siguiente manera:Bitmap b = Bitmap.createBitmap(100,100,Bitmap.Config.ARGB_8888);Canvas c = new Canvas(b);

Ahora el Canvas puede dibujar sobre el Bitmap previamente definido. Una vez terminado el dibujo sobre el Canvas, se puede llevar el Bitmap a otro Canvas a través de métodos como Canvas.drawBitmap(Bitmap,...). Se recomienda que se dibujen el gráfico definitivo a través de un Canvas conseguido a través de métodos como View.onDraw() o SurfaceHolder.lockCanvas().

Canvas. Ejemplo de creación

8. Gráficos en 2-D

Page 229: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

229

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

La clase Canvas tienes su propio conjunto de métodos de dibujo tales como: drawBitmap(...), drawRect(...), drawText(...), y otros muchos.

Otras clases que se pueden usar también proporcionan métodos de dibujo, como los objetos Drawable que se pueden poner en un Canvas. La clase Drawable tiene sus propios métodos draw() que toman el Canvas que los incorpora como argumento.

Canvas. Ejemplo de creación

8. Gráficos en 2-D

Page 230: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

230

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Android ofrece una biblioteca de gráficos 2D personalizados para dibujar y animar formas e imágenes.

Los paquetes android.graphics.drawable y android.view.animation es donde se encuentran las clases más comunes utilizadas para el dibujo y la animación en dos dimensiones.

Vamos ver el uso del objeto Drawable para dibujar gráficos, así cómo utilizar un par de subclases de la clase Drawable y cómo crear animaciones que permitan mover, estirar y rotar un gráfico o animación de una serie de gráficos

Drawables

8. Gráficos en 2-D

Page 231: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

231

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Drawable es una abstracción general de "algo que se puede elaborar“. La clase Drawable se extiende para definir una variedad de

tipos específicos de gráficos, incluyendo BitmapDrawable, ShapeDrawable, PictureDrawable, LayerDrawable y otros más.

Por supuesto, también puede ampliarse para definir sus propios objetos personalizados.

Hay tres maneras de definir y crear instancias de Drawable: El uso de una imagen guardada en los recursos del proyecto, Mediante un archivo XML que define las propiedades del

Drawable. Con los constructores de clase normal.

Drawables

8. Gráficos en 2-D

Page 232: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

232

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Una forma sencilla de añadir gráficos es por referencia a un archivo de imagen de los recursos del proyecto.

Los tipos de archivo admitidos son: PNG (preferido), JPG (aceptable) y GIF (desaconsejado). Esta técnica es la aconsejable para los iconos de aplicaciones,

logotipos u otros gráficos, como los utilizados en un juego. Para utilizar un recurso de imagen, sólo tiene que añadir el

archivo al directorio res/drawable/ del proyecto. Desde allí, puede hacer referencia a ella desde el código o el diseño de XML.

El código siguiente muestra cómo construir un ImageView que utiliza una imagen de recursos del proyecto.

DrawablesCreación de gráficos a partir de una imagen

8. Gráficos en 2-D

Page 233: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

233

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

LinearLayout mLinearLayout;protected void onCreate(Bundle savedInstanceState){

super.onCreate(savedInstanceState);//Create a LinearLayout in which to add the ImageViewmLinearLayout = new LinearLayout(this);

//Instantiate an ImageView and define its propertiesImageView i = new ImageView(this);i.setImageResource(R.drawable.my_image);i.setAdjustViewBounds(true);

i.setLayoutParams(new Gallery.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));

//Add the ImageView to the layout// and set the layout as the content view

    mLinearLayout.addView(i);setContentView(mLinearLayout);

}

DrawablesCreación de gráficos a partir de una imagen. Ejemplo

<ImageView     android:layout_width="wrap_content"  android:layout_height="wrap_content"  android:tint="#55ff0000"  android:src="@drawable/my_image"/>

8. Gráficos en 2-D

Page 234: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

234

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Creación de gráficos mediante XML

Drawables

Si sabemos que las propiedades de los gráficos pueden cambiar durante el diseño de la aplicación, es conveniente la definición del objeto mediante XML, lo que nos permitirá cambiar sus propiedades cada vez que se instancie.

Definido el objeto en XML, se guarda el archivo en el directorio res/drawable del proyecto. Se crea una instancia del objeto mediante una llamada a Resources.getDrawable() y le pasamos el identificador de recurso del archivo XML.

8. Gráficos en 2-D

Page 235: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

235

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Se pueden definir mapas de bits que estén referenciados en XML para aportar características adicionales, como el entrelazado (dither) y el replicado (tiling).

También permite filtrado cuando la imagen está deformada.

El recurso será gestionado con la clase BitmapDrawable. Referencia en Java:

R.drawable.filename Referencia en XML:

@[package:]drawable/filename

DrawablesXML Bitmap

Dithering Tiling

8. Gráficos en 2-D

Page 236: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

236

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

<?xml version="1.0" encoding="utf-8"?> <bitmap xmlns:android=http://schemas.android.com/apk/res/android

android:src="@[package:]drawable/drawable_resource" android:antialias=["true" | "false"] android:dither=["true" | "false"] android:filter=["true" | "false"] android:gravity=["top" | "bottom" | "left" | "right" | "center_vertical" | "fill_vertical" | "center_horizontal" | "fill_horizontal" | "center" | "fill" | "clip_vertical" | "clip_horizontal"] android:tileMode=["disabled" | "clamp" | "repeat" | "mirror"] />

Ejemplo:<?xml version="1.0" encoding="utf-8"?> <bitmap xmlns:android="http://schemas.android.com/apk/res/android" android:src="@drawable/icon" android:tileMode="repeat" />

DrawablesXML Bitmap. Definición

8. Gráficos en 2-D

Page 237: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

237

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Un gráfico NinePatchDrawable es una imagen de mapa de bits elástico, que Android cambiará automáticamente de tamaño para acomodar el contenido de la vista en la que la han colocado como fondo.

Un ejemplo de uso de un NinePatch son los fondos utilizados de forma estándar en los botones de Android, los botones deben estirarse para acomodar cadenas de longitudes diferentes.

También se puede definir en un XML:<?xml version="1.0" encoding="utf-8"?> <nine-patch xmlns:android="http://schemas.android.com/apk/res/android" android:src="@[package:]drawable/drawable_resource" android:dither=["true" | "false"] />

DrawablesNine-patch

8. Gráficos en 2-D

Page 238: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

238

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Un NinePatch es una imagen PNG estándar que incluye un borde adicional de 1 píxel de ancho.

Se deben guardar con la extensión 0.9.png, y se guarda en el directorio res/drawable/ del proyecto.

DrawablesCrear un Nine-patch

8. Gráficos en 2-D

Page 239: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

239

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

La línea de borde se utiliza para definir el área que debe definir la imagen. Se indica una sección extensible por una (o más) de líneas negras de 1 píxel de ancho en la parte izquierda y borde superior.

Opcionalmente de pueden definir dos líneas a la derecha y debajo del Nine-path, para definir un área efectiva de dibujo, de forma que si queremos meter un texto dentro de este área, se ajustará a la misma, si no existen estas líneas el dibujo se extiende hasta ajustare al texto.

DrawablesCrear un Nine-patch

8. Gráficos en 2-D

Page 240: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

240

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Cuando se quiere dibujar un gráfico en 2D dinámicamente, el objeto ShapeDrawable es el más indicado.

Un ShapeDrawable es una extensión de Drawable, puede utilizarse en lugar de Drawable, por ejemplo para el fondo de una pantalla, con la opción setBackgroundDrawable().

La clase ShapeDrawable (al igual que muchos otros tipos Drawable en el paquete android.graphics.drawable) permite definir sus propiedades con los métodos públicos.

También puede definir las formas Drawable utilizando XML.

DrawablesShape Drawable

8. Gráficos en 2-D

Page 241: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

241

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android=http://schemas.android.com/apk/res/androidandroid:shape=["rectangle" | "oval" | "line" | "ring"] > <corners

android:radius="integer" android:topLeftRadius="integer" android:topRightRadius="integer" android:bottomLeftRadius="integer" android:bottomRightRadius="integer" /> …

DrawablesShape Drawable. Definición

8. Gráficos en 2-D

Page 242: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

242

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

<gradient android:angle="integer" android:centerX="integer" android:centerY="integer" android:centerColor="integer" android:endColor="color" android:gradientRadius="integer" android:startColor="color" android:type=["linear" | "radial" | "sweep"] android:useLevel=["true" | "false"] />

DrawablesShape Drawable. Definición

8. Gráficos en 2-D

Page 243: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

243

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

<padding android:left="integer" android:top="integer" android:right="integer" android:bottom="integer" />

<size android:width="integer" android:height="integer" />

DrawablesShape Drawable. Definición

<solid android:color="color" /> <stroke

android:width="integer" android:color="color" android:dashWidth="integer" android:dashGap="integer" />

</shape>

8. Gráficos en 2-D

Page 244: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

244

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

DrawablesShape Drawable. Ejemplo

<?xml version="1.0" encoding="UTF-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android"

android:shape="rectangle"> <stroke

android:width="2dp" android:color="#FFFFFFFF" />

<gradient android:endColor="#DDBBBBBB" android:startColor="#DD777777" android:angle="90" />

<corners android:bottomRightRadius="7dp" android:bottomLeftRadius="7dp" android:topLeftRadius="7dp" android:topRightRadius="7dp" />

</shape>

8. Gráficos en 2-D

Page 245: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

245

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Un StateListDrawable es un drawable que permite usar imágenes diferentes para un mismo gráfico en función del estado del mismo.

Definición:<?xml version="1.0" encoding="utf-8"?> < selector xmlns:android="http://schemas.android.com/apk/res/android" android:constantSize=["true" | "false"] android:dither=["true" | "false"] android:variablePadding=["true" | "false"] >

<item>…</item><item>…</item>

</selector >

DrawablesStateList Drawable

8. Gráficos en 2-D

Page 246: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

246

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

<itemandroid:drawable="@[package:]drawable/drawable_resource" android:state_pressed=["true" | "false"]android:state_focused=["true" | "false"]android:state_hovered=["true" | "false"] android:state_selected=["true" | "false"] android:state_checkable=["true" | "false"]android:state_checked=["true" | "false"] android:state_enabled=["true" | "false"] android:state_activated=["true" | "false"] android:state_window_focused=["true" | "false"] />

DrawablesStateList Drawable (items)

8. Gráficos en 2-D

Page 247: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

247

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

8. Gráficos en 2-DOtros tipos de Drawables Layer List: un Drawable que gestiona un array de otros

Drawables. Estos Drawables son dibujados en el orden del array, siendo el que

tiene el índice mayor el que se dibuja encima de los demás. Crea un objeto LayerDrawable.

Level List: Es un fichero XML que define una serie de Drawables que pueden ser mostrados alternativamente a través de la asignación de un valor numérico o «nivel» . El Drawable a mostrar será aquel que coincida con un nivel mayor o

igual al establecido. Crea un objeto LevelListDrawable. Se puede establecer el nivel con

setLevel() de Drawable o setImageLevel() de ImageView.

Page 248: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

248

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

8. Gráficos en 2-DOtros tipos de Drawables Inset Drawable: Es un fichero XML que define un drawable que

incrusta otro drawable a una distancia especificadas. Útil para vistas que necesitan un fondo más pequeño que sus

dimensiones actuales. Clip Drawable: Es un fichero XML que define un drawable que es

un recorte de otro basándose en el nivel actual de ese Drawable (Drawable.setLevel(), valor máximo 10000, la imagen no está recortada, nivel 0 totalmente recortada). Crea un ClipDrawable.

Scale Drawable: Un XML que cambia la escala de un drawable en función de su nivel actual. Crea un ScaleDrawable.

Page 249: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

249

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Esta es una animación tradicional . Se que crea con una secuencia de imágenes diferentes y se

reproducen en orden como un rollo de película. La clase AnimationDrawable es la base de Frame Animation. Se pueden definir el frame de animación mediante código

usando la clase AnimationDrawable, pero es mas simple definirlas en un fichero XML y almacenarlo en el directorio res/drawable del proyecto.

El archivo XML se compone de un elemento <animation-list> como el nodo raíz y una serie de nodos hijos <item> que cada uno define un frame: una imagen para el frame.

 

Frame Animation

9. Animación de drawables

Page 250: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

250

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Ejemplo. Archivo XML para una animación fotograma por fotograma

Frame Animation

<animation-list xmlns:android="http://schemas.android.com/apk/res/android"android:oneshot="true"><item android:drawable="@drawable/rocket_thrust1" android:duration="200" /><item android:drawable="@drawable/rocket_thrust2" android:duration="200" /><item android:drawable="@drawable/rocket_thrust3" android:duration="200" /></animation-list>

9. Animación de drawables

Page 251: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

251

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

A la Activity se le añade una animación a un objeto ImageView (archivo XML rocket_thrust.xml)

AnimationDrawable rocketAnimation;

public void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  setContentView(R.layout.main);  ImageView rocketImage = (ImageView) findViewById(R.id.rocket_image);  rocketImage.setBackgroundResource(R.drawable.rocket_thrust);  rocketAnimation = (AnimationDrawable) rocketImage.getBackground();}

Frame AnimationEjemplo de Activity al que se le añade una animación

9. Animación de drawables

Page 252: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

252

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

public boolean onTouchEvent(MotionEvent event) {  if (event.getAction() == MotionEvent.ACTION_DOWN) {rocketAnimation.start();return true;  }  return super.onTouchEvent(event);}

Frame AnimationEjemplo. Continua

9. Animación de drawables

Page 253: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

253

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

No se puede llamar al método start() del AnimationDrawable dentro del método onCreate() de la Activity, ya que el AnimationDrawable no está completamente adjuntado a la ventana.

La animación se podrá iniciar a través de cualquier acción del usuario posteriormente.

Si se quiere iniciar la animación automáticamente al inicio de la Activity se debe hacer en el método onWindowFocusChanged() de la Activity, el cual se llama cuando Android otorga el foco a su ventana.

Frame AnimationNota sobre la implementación

9. Animación de drawables

Page 254: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

254

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Con las transiciones TransitionDrawable se pueden generar efectos de transición entre dos imágenes, pero tan solo dos.

Definición XML:<?xml version="1.0" encoding="utf-8"?> <transition xmlns:android="http://schemas.android.com/apk/res/android”><item android:drawable="@[package:]drawable/drawable_resource"

android:id="@[+][package:]id/resource_name" android:top="dimension" android:right="dimension" android:bottom="dimension" android:left="dimension" />

</transition>

TransicionesCreación de transiciones mediante XML

9. Animación de drawables

Page 255: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

255

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

res/drawable/transition.xml<transition

xmlns:android="http://schemas.android.com/apk/res/android"><item android:drawable="@drawable/image_expand“ /><item android:drawable="@drawable/image_collapse“ />

</transition> Se aplica este drawable a un ImageButton

<ImageButton android:id="@+id/button" android:layout_height="wrap_content" android:layout_width="wrap_content" android:src="@drawable/transition" />

TransicionesCreación de transiciones mediante XML. Ejemplo

9. Animación de drawables

Page 256: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

256

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Se instancia el TransitionDrawable y se configura como el contenido de un ImageView.

ImageButton button = (ImageButton) findViewById(R.id.button); TransitionDrawable drawable = (TransitionDrawable) button.getDrawable(); drawable.startTransition(500);//tiempo en milisegundos

TransicionesCreación de transiciones mediante XML

9. Animación de drawables

Page 257: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

257

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Una Tween Animation puede realizar una serie de transformaciones simples (posición, tamaño, rotación y transparencia) sobre el contenido de un objeto View.

El animation_package ofrece todas las clases que se utilizan en un Tween Animation.

Tween Animation

Por ejemplo en un objeto TextView, se puede mover, rotar, ampliar o reducir el tamaño del texto, si tiene una imagen de fondo, la imagen se modificará con el texto.

10. Animación de vistas

Page 258: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

258

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

La definición de instrucciones de animación, como los layout, es más recomendable que se incluyan en ficheros XML, que en instrucciones de Android, pues son más fáciles de leer, reutilizar e intercambiar.

El fichero XML de animación es almacenado en el directorio res/anim del proyecto.

El archivo XML debe tener un único elemento raíz, este será un solo elemento <alpha>, <scale>, <translate>, <rotate>, o el elemento <set> que contiene grupos de estos elementos (pueden incluir otro <set>).

Por defecto, todas las instrucciones de animación se aplican simultáneamente.

Tween Animation

10. Animación de vistas

Page 259: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

259

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

<set android:shareInterpolator="false">   <scale  android:interpolator="@android:anim/accelerate_decelerate_interpolator"  android:fromXScale="1.0"  android:toXScale="1.4"  android:fromYScale="1.0"  android:toYScale="0.6"  android:pivotX="50%"  android:pivotY="50%"  android:fillAfter="false"  android:duration="700" /> 

Tween AnimationEjemplo: Ensancha, gira y rota simultáneamente una vista

10. Animación de vistas

Page 260: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

260

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

…   <set android:interpolator="@android:anim/decelerate_interpolator">  <scale android:fromXScale="1.4"  android:toXScale="0.0" android:fromYScale="0.6" android:toYScale="0.0"  android:pivotX="50%” android:pivotY="50%"  android:startOffset="700" android:duration="400"  android:fillBefore="false"/>   

Tween AnimationEjemplo: Ensancha, gira y rota simultáneamente una vista

…   <rotate  android:fromDegrees="0"  android:toDegrees="-45" android:toYScale="0.0"  android:pivotX="50%"  android:pivotY="50%" android:startOffset="700" android:duration="400" />   </set></set>

10. Animación de vistas

Page 261: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

261

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Para aplicar la animación se ejecuta el siguiente código java.

 

Tween AnimationEjemplo: Ensancha, gira y rota simultáneamente una vista

ImageView spaceship = (ImageView) findViewById(R.id.spaceshipImage);Animation hyperspaceJumpAnimation =

AnimationUtils.loadAnimation(this, R.anim.hyperspace_jump);spaceship.startAnimation(hyperspaceJumpAnimation);

10. Animación de vistas

Page 262: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

262

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Android permite reproducir audio y video de varios tipos de fuentes de datos. Puede reproducir audio o vídeo de los archivos multimedia

almacenados en los fuentes de la aplicación (archivos raw) A partir de archivos del sistema. O de una secuencia de datos a través de una conexión de red.

Para reproducir contenido multimedia (audio o vídeo) se usa la clase MediaPlayer.

La plataforma también permite grabar audio y vídeo cuando sea soportado por el hardware del dispositivo.

Para grabar audio o vídeo se utiliza la clase MediaRecorder.

11. Audio

Page 263: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

263

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

SoundPool

PlayBack de audio

Para la reproducción de audio también se usa la clase SoundPool.

Solo es posible reproducir en los dispositivos de salida estándar: altavoz o auriculares Bluetooth.

Se emplea para audio de baja latencia. No es posible reproducir archivos de sonido mientras se mantiene

una conversación de audio.

11. Audio

Page 264: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

264

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

SoundPool. Ejemplo – Inicialización de sonidos

PlayBack de audio

11. Audio

public static void initSounds(Context context) {

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {

AudioAttributes audioAttrib = new AudioAttributes.Builder() .setUsage(AudioAttributes.USAGE_GAME) .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION) .build(); mSoundPool = new SoundPool.Builder().setAudioAttributes(audioAttrib).setMaxStreams(2).build(); } else { mSoundPool = new SoundPool(2, AudioManager.STREAM_MUSIC, 0); }

mSoundPoolMap = new HashMap<Integer,Integer>(3);

mSoundPoolMap.put(S1, mSoundPool.load(context, R.raw.s1, 1)); mSoundPoolMap.put(S2, mSoundPool.load(context, R.raw.s2, 2)); mSoundPoolMap.put(S3, mSoundPool.load(context, R.raw.s3, 3));

}

Page 265: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

265

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

SoundPool. Ejemplo – Reproducción de un sonido del “pool”

PlayBack de audio

11. Audio

public static void playSound(Context context, int soundID) { if (mSoundPool == null || mSoundPoolMap == null) { initSounds(context); } float volume = 1.0f;// whatever in the range = 0.0 to 1.0

// play sound with same right and left volume, with a priority of 1, // zero repeats (i.e play once), and a playback rate of 1f mSoundPool.play((Integer) mSoundPoolMap.get(soundID), volume, volume, 0, 0, 1f);}

final int play(int soundID, float leftVolume, float rightVolume, int priority, int loop, float rate)

Play a sound from a sound ID.

Page 266: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

266

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

SoundPool. Método play()

PlayBack de audio

final int play (int soundID, float leftVolume, float rightVolume, int priority, int loop, float rate)

Con este método se reproduce un sonido con un identificador concreto.

11. Audio

soundID int un soundID devuelto por la función load()leftVolume float volumen del lado izquierdo (rango= 0.0 a 1.0)rightVolume float volumen del lado derecho (rango = 0.0 a 1.0)priority int prioridad del stream (0 = prioridad más baja)loop int veces a repetir (0 = sin bucle, -1 = bucle infinito)rate float velocidad de reproducción (1.0 = normal, rango de 0.5 a

2.0)

Page 267: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

267

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Nos permite reproducir, sobre todo, sonido dentro de la aplicaciones. Para hacer esto: Poner el archivo de sonido en el directorio res/raw del proyecto. Crear una instancia de MediaPlayer y hacer referencia a ese recurso usando

MediaPlayer.create y luego llamar a start() en la instancia:

MediaPlayer mp = MediaPlayer.create(context, R.raw.sound_file_1);mp.start();

Para hacer uso de las distintas funciones de reproducción se puede llamar los distintos métodos de MediaPlayer: stop(), reset(), pause(), etc.

PlayBack de audioReproducción desde archivos raw

11. Audio

Page 268: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

268

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Se pueden reproducir archivos desde el sistema de ficheros o desde una URL. Para hacer esto: Crear una instancia de MediaPlayer. Llamar a setDataSource con la cadena que contenga el path o url

donde se encuentra el archivo para reproducir. Llamar a prepare() y despues start() de la instancia.

MediaPlayer mp = new MediaPlayer();mp.setDataSource(PATH_TO_FILE);mp.prepare();mp.start();

El resto de funciones es igual que para la reproducción de archivos raw.

PlayBack de audioReproducción desde archivo o stream

11. Audio

Page 269: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

269

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Para capturar audio desde el dispositivo se necesitan estos pasos:1. Crear una instancia de android.media.MediaRecorder.2. Crear una nueva instancia de android.content.ContentValues y

poner algunas de las propiedades estándar, como TÍTULO, TIMESTAMP, y todos los importantes MIME_TYPE.

3. Definir la ruta del archivo de datos (se puede usar android.content.ContentResolver para crear una entrada en la base de datos de contenido y conseguir que se asigne automáticamente una ruta que se pueda utilizar).

4. Ajustar la fuente de audio mediante MediaRecorder.setAudioSource().

5. Formatear el archivo de salida utilizando MediaRecorder.setOutputFormat().

Captura de audio

11. Audio

Page 270: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

270

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

Para capturar audio desde el dispositivo se necesitan estos pasos:6. Ajuste el codificador de audio con

MediaRecorder.setAudioEncoder().7. Llamar a prepare() en la instancia

MediaRecorder.8. Para iniciar la captura de audio llamar a start().9. Para detener la captura de audio, llamar a stop().10.Al terminar liberar la instancia llamando a

release().

Captura de audio

11. Audio

Page 271: Capítulo 1   introducción a los servicios y aplicaciones móviles

Introducción a los servicios y aplicaciones móviles Servicios Móviles

271

Dpto. de Ingeniería de TelecomunicaciónÁrea de Ingeniería Telemática

Universidad de JaénEscuela Politécnica Superior de Linares

Versión 2.0

El siguiente ejemplo ilustra cómo configurar la captura de audio.

// could use setPreviewDisplay() to display a preview to suitable View here

recorder.setAudioSource(MediaRecorder.AudioSource.MIC);recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);recorder.setOutputFile(path);

recorder.prepare();recorder.start();

Para parar la grabación:

recorder.stop();recorder.release();

Captura de audio

11. Audio