Vous êtes sur la page 1sur 160

DESARROLLO DE

APLICACIONES
MÓVILES I
DESARROLLO DE APLICACIONES MÓVILES I 2

CARRERAS PROFESIONALES CIBERTEC


DESARROLLO DE APLICACIONES MÓVILES I 3

Índice
Presentación 05
Red de contenidos 07
UNIDAD 1. ANDROID: INTRODUCCIÓN A LA PLATAFORMA 09
1.1 Plataforma Android 09
1.1.1 Introducción a Android, versiones 11
1.1.2 Características y Arquitectura Android. 13
1.1.3 Máquina virtual Dalvik Virtual Machine y ART 15
1.1.4 Open Handset Alliance 17
1.1.5 Creación de emuladores 17

1.2 IDE Android Studio 18


1.2.1 Android Studio características y funciones. 19
1.2.2 Creando la primera aplicación Hola Mundo. 23
1.2.3 Controles básicos Button, EditText, TextView 25
1.2.4 Depuración de código en Android. 29
Resumen de la unidad 31

UNIDAD 2. ANDROID: COMPONENTES 32


2.1 Fundamentos de aplicaciones Android 34
2.1.1 Arquitectura de la plataforma Android. 35
2.1.2 Estructura de un proyecto Android. 35
2.1.3 Que es un Gradle 43

2.2 Componente de una pantalla: Views y ViewGroups 44


2.2.1 Componente de una pantalla: Views y ViewGroups 44
2.2.2 Distribución de los ViewGroups: LinearLayout, AbsoluteLayout,
TableLayout, Relative Layout, FrameLayout y ScrollView. 45
2.2.3 Widgets 51
2.2.4 Controles básicos Android 51

2.3 Componente Activity e Intent: definición y características 56


2.3.1 Activity 56
2.3.2 Ciclo de vida de la clase activity 58
2.3.3 Introducción a los Intent . 60
2.3.4 Funcionalidad y uso de Intents 61
2.3.5 Resolviendo problemas de pantalla. 63

2.4 Orientación del dispositivo 66


2.4.1 Adaptación de la interface de usuario a la orientación del dispositivo 67
2.4.2 Manejar cambios en la orientación del dispositivo. 68

2.5 Dialogos y notificaciones 69


2.5.1 Notificaciones Toast 70
2.5.2 Notificaciones en la barra de estado. 71
2.5.3 Dialogos personalizados basados en clases. 73

UNIDAD 3. PERSISTENCIA DE DATOS EN ANDROID 84


3.1 Acceso a recursos y archivos 85
3.1.1 Tipos de recursos en Android 86
3.1.2 Almacenamiento privado y compartido. 88
3.1.3 Grabar y cargar datos de Preferencias de Usuario. 89
3.1.4 File, FileOutputStream, OutputStreamWriter, PrintWriter 91
3.1.5 Environment uso de métodos básicos para acceso a recursos. 94

3.2 Persistencia de Datos usando SQLite


3.2.1 Introducción a adaptadores de datos 94

CIBERTEC CARRERA DE ELECTRICIDAD


DESARROLLO DE APLICACIONES MÓVILES I 4

3.2.2 Introducción a SQLite 96


3.2.3 Gestión de bases de datos con SQLite. Uso del componente
SQLiteOpenHelper. 98
3.2.4 La clase ContentValues 99
3.2.5 Mantenimiento de datos Insert, Update, Delete rawQuery 100

3.3 Aplicando el Modelo Vista controlador con SQLite


3.3.1 Clases de acceso a datos basados en el modelo vista controlador. 102

UNIDAD 4. NETWORKING EN ANDROID


4.1 Consumiendo servicios web
4.1.1 SOAP (Simple Object Access Protocol) Mensajes SOAP, Estructura 104
4.1.2 Uso del protocolo HTTP para consumir web services. 106
4.1.3 Obtención de data de archivos XML. 108
4.1.4 Clases de acceso a web services 115
4.1.5 Thead Manejando hilos 117

UNIDAD 5. Servicios basados en localización


5.1 Manejo de fragments
5.1.1 Que es Fragment 129
5.1.2 Creating a Fragment, administrar Fragments,Flagment class 132
5.1.3 Eventos fragment, Aplicación fragment 131

5.1 Servicios basados en localización


5.1.1 Utilizar Google Maps en la aplicación. 137
5.1.2 Obtención de la localización (coordenadas) del dispositivo. 138
5.1.3 Google Maps 139
5.1.4 Activar las API de Google Maps. 140

UNIDAD 6. SERVICIOS
6.1 Creando y administrando Servicios
6.1.1 Qué es un servicio, 145
6.1.2 Intent Service, Bound Service. 147
6.1.3 Configurar el archivo de manifiesto. 148
6.1.4 Iniciar/Configurar servicios 149

UNIDAD 7. MULTIMEDIA Y PUBLICACIÓN


7.1 Audio, Video y Uso de Dispositivos visuales
7.1.1 Componente Media Player. Definición, características y aplicaciones. 151
7.1.2 Visualización de videos usando la vista Video. 152
7.1.3 Gráficos 2D y Aplicaciones Multimedia 154
7.1.4 Grabación de audio y video: Uso de Intents para grabar video. 155

7.1 Publicación en Google Play


7.1.1 Google Play 156
7.1.2 Generación de APK firmado con el certificado digital. 157
7.1.3 Publicación de la aplicación. 158

Bibliografia del curso 159

CARRERAS PROFESIONALES CIBERTEC


DESARROLLO DE APLICACIONES MÓVILES I 5

Presentación
El Taller de Desarrollo de Aplicaciones Móviles I es un curso que pertenece a la
línea de programación y desarrollo de aplicaciones siendo un curso de
especialidad sólo en la carrera de Computación e Informática. Permite al alumno
iniciarse en la programación de dispositivos móviles bajo el entorno Android studio
que ha sido optimizado para dispositivos móviles con sistema operativo Android.

El manual para el curso ha sido diseñado bajo la modalidad de unidades de


aprendizaje, las que se desarrollan durante semanas determinadas. En cada una
de ellas, hallará los logros, que debe alcanzar al final de la unidad; el tema tratado,
el cual será ampliamente desarrollado; y los contenidos, que debe desarrollar, y
ejercicios necesarios para poner en práctica los conceptos desarrollados en clase.
Por último, encontrará las actividades que deberá desarrollar en cada sesión, que
le permitirán reforzar lo aprendido en la clase.

El curso es práctico y consiste en un taller de programación. En la primera parte


del curso, se revisan las características del sistema operativo Android así como las
funcionalidades básicas con el fin de familiarizar al participante con la forma de
trabajo y la arquitectura de aplicaciones bajo el sistema operativo Android y la
relación que existe con las aplicaciones y/o servicios de google (Google Apps).
Luego, se desarrollan aplicaciones que permitan el manejo del dispositivo móvil
para ingresar, procesar y presentar información haciendo uso de las clases que
proporciona la plataforma de desarrollo Android, luego se desarrollara persistencia
de datos locales como almacenamiento en disco, bases de datos sqlite y en la
nube vía web services, soap, rest. Se concluye con la publicación de aplicaciones
haciendo uso de los servicios de google vía google play.

CIBERTEC CARRERA DE ELECTRICIDAD


DESARROLLO DE APLICACIONES MÓVILES I 6

CARRERAS PROFESIONALES CIBERTEC


DESARROLLO DE APLICACIONES MÓVILES I 7

Red de contenidos

DESARROLLO DE APLICACIONES MÓVILES I

Unidad 1 Unidad 2 Unidad 3 Unidad 4 Unidad 5 Unidad 6 Unidad 7

Android: Android: Networking en Servicios basados Multimedia y


Introducción a Componentes Android en localización publicación
la plataforma

Persistencia
de datos en Servicios
Android

CIBERTEC CARRERA DE ELECTRICIDAD


DESARROLLO DE APLICACIONES MÓVILES I 8

CARRERAS PROFESIONALES CIBERTEC


DESARROLLO DE APLICACIONES MÓVILES I 9

UNIDAD

1
Introducción a la plataforma
LOGRO DE LA UNIDAD DE APRENDIZAJE
Al término de la unidad, el alumno elabora aplicaciones haciendo uso del
entorno de desarrollo Android Studio.

TEMARIO

1.3 Plataforma Android


1.3.1 Introducción a Android, versiones
1.3.2 Características y Arquitectura Android.
1.3.3 Máquina virtual Dalvik Virtual Machine y ART
1.3.4 Open Handset Alliance
1.3.5 Creación de emuladores

1.4 IDE Android Studio


1.4.1 Android Studio características y funciones.
1.4.2 Creando la primera aplicación Hola Mundo.
1.4.3 Controles básicos Button, EditText, TextView
1.4.4 Depuración de código en Android.

ACTIVIDADES PROPUESTAS

 Los alumnos identifican la arquitectura del sistema operativo android.


 Los alumnos hacen uso del IDE principal de desarrollo Android Studio.
 Los alumnos crean la primera aplicación en adnroid y recococen la
diferencia entre un ativity, layout y las vistas básicas.

CIBERTEC CARRERA DE ELECTRICIDAD


DESARROLLO DE APLICACIONES MÓVILES I 10

CARRERAS PROFESIONALES CIBERTEC


DESARROLLO DE APLICACIONES MÓVILES I 11

1.1. INTRODUCCIÓN A LA PLATAFORMA


1.1.1. Plataforma Android

Android es un sistema operativo móvil basado en el kernel 2.6 de Linux Android fue
desarrollado para dispositivos móviles, tabletas,
relojes, televisores automóviles, actualmente es uno
de los sistemas operativos más utilizados en el
planeta. Inicialmente fue desarrollado por Andy Rubin
figura 1, quien funda la compañía Android inc en
estados unidos en Palo anto, posterior a ello google
adquiere completamente la compañía en el año 2005
posterior a ello se crea en grupo de empresas
asociadas que patrocina androi como plataforma libre
para dispositivos móviles y otros.

La desición de estudia el desarrollo de aplicaciones


para esta platadorma es que tiene el mayor potencial
del mercado ya que no solo esta orientado a
dispositivos móviles sino a una aplica gama de
dispositivos con el soporte de google a continuación
se presenta una imagen de los dispositivos Figura 1: Andy Rubin
que soportan Android figura 2 Fuente: http://es.wikipedia.org/wiki/Andy_Rubin

Figura 2: Dispositivos que soportan Android


Fuente: http://www.android.com/

Android esta basado en capas que permiten administrar las funciones básicas de
cualquier equipo movil, en primer lugar tiene aplicaciones estándares como
administrador de contactos, administrador de aplicaciones administrador de drivers,
administrador de mensajes, administrador de archivos, álbum de fotos, administrador
de llamadas configuración todo controlado tu cuenta de gmail google para cualquier
instalación de aplicación se debe realizar por medio de google play. Debajo de ello se
encuentra las librerías nativas para acceso a bases de datos, administración de
recursos, drivers de audio, administrador de sistema, webkit naegador web nativo, etc.
Por el lado de la maquina virtual se encuentra Virtual Dalvik y Art que es una de las
mejoras que fueron creados en octubre del año 2014, después de ello se tiene el
kernel del sistema operativo tal como se puede apreciar en el grafico que se presenta
a continuación.

CIBERTEC CARRERA DE ELECTRICIDAD


DESARROLLO DE APLICACIONES MÓVILES I 12

Figura 3: Dispositivos que soportan Android


Fuente.- Tomado de http://source.android.com/source/index.html

Qué es una Aplicación Android?


Una aplicación desarrollada en androi es un programa que posee una o varias
funciones específicas que lo hacen útil para un motivo. Son equivalentes a cualquier
programa echo para PC con la diferencia que tiene funcionalidades desarrolados para
el celular uno de los limitantes es el tamaño de pantalla y teclado aunque las últimas
versiones de sistemas operativos tiene soporte a conectar teclado usb.

Por otro lado cualquier aplicación se debe instalar por medio de google play, sin
embargo se puede instalar una aplicación configurando instalar aplicaciones de
fuentes no seguras por otro lado la plataforma Android tiene una gran cantidad de
aplicaciones con mas de 700 mil aplicaciones que se pueden descargar muchos de
ellos gratuitos

Figura 4: Programas posibles para instalar en el celular


Fuente.- Tomado de http://www.androidexperto.com

CARRERAS PROFESIONALES CIBERTEC


DESARROLLO DE APLICACIONES MÓVILES I 13

1.1.2 Características y Arquitectura Android


Una aplicación desarrollada en androi es un programa que posee una o varias
funciones específicas que lo hacen útil para un motivo. Son equivalentes a
cualquier programa

El sistema operativo Android, al igual que los propios teléfonos móviles, ha


evolucionado rápidamente, acumulando una gran cantidad de versiones, desde
la 1.0 para el QWERTY HTC G1, hasta la 4.0 que acaba de salir al mercado.

Entre las principales características tenemos:

 framework de aplicación que habilita la reutilización y reemplazo de


componentes

 máquina virtual dalvik optimizada para móviles

 navegador integrado basado en webkit

 gráficos optimizados por una librería gráfica 2d propia; gráficos 3d


basados en la especificación opengl es 1.0

 sqlite para almacenamiento de datos estructurados


 soporte para gran variedad de archivos multimedia (mpeg4, h.264, mp3,
aac, amr, jpg, png, gif)
 Telefonía gsm
 Bluetooth, edge, 3g y wifi (4g, wimax,…)
 Cámara, gps, compás, acelerómetro,…
 Entorno de desarrollo completo incluyendo emulador, herramientas de
depuración, profiling de memoria y rendimiento y plugin para el ide
eclipse

Competidores comunes

 Apple
o iPhone OS
 RIM
o Blackberry
 Microsoft
o Windows Mobile 6.5 Phone 7 Series
 Symbian Foundation
o Symbian OS
 Palm

CIBERTEC CARRERA DE ELECTRICIDAD


DESARROLLO DE APLICACIONES MÓVILES I 14

o WebOS

Cupcake: Android Version 1.5


Características: Widgets, teclado QWERTY virtual, copy & paste, captura de
vídeos y poder subirlos a Youtube directamente.

Donut: Android Version 1.6 Características: Añade a la anterior la mejoría de


la interfaz de la cámara, búsqueda por voz, y navegación en Google Maps.

Eclair: Android Version 2.0/2.1


Características: Mejoras en Google Maps, salvapantallas animado, incluye
zoom digital para la cámara, y un nuevo navegador de internet.

Froyo: Android Version 2.2


Características: Incluye hostpot Wifi, mejora de la memoria, más veloz,
Microsoft
Exchange y video-llamada.

Ginger Bread: Android Version 2.3


Características: Mejoras del consumo de batería, el soporte de vídeo online y el
teclado virtual, e incluye soporte para pagos mediante NFC2

Honey Comb: Android Version 3.0/3.4


Características: Mejoras para tablets, soporte Flash y Divx, integra Dolphin,
multitarea pudiendo cambiar de aplicación dejando las demás en espera en
una columna, widgets y homepage personalizable.

Ice Cream Sandwich: Android Version 4.0


Características: Multiplataforma (tablets, teléfonos móviles y netbooks), barras
de estado, pantalla principal con soporte para 3D, widgets redimensionables,
soporte usb para teclados, reconocimiento facial y controles para PS3.

Android - 4.4 KitKat

Android - 5.0 Lollipop


Introduce la nueva plataform en base de diseño el nuevo concepto de
Diseño Material (Material Design) y es la primera versión que integra
Android Runtime (ART) de manera predeterminada

CARRERAS PROFESIONALES CIBERTEC


DESARROLLO DE APLICACIONES MÓVILES I 15

1.1.3 Máquina virtual Dalvik Virtual Machine y ART

Dalvik Vrtual Machine


Dalvik es la máquina virtual que utiliza la plataforma para dispositivos
móviles Android. Dalvik ha sido diseñada por Dan Bornstein con contribuciones
de otros ingenieros de Google.
La Máquina Virtual Dalvik (DVM) permite ejecutar aplicaciones programadas
en Java. La DVM no afirma ser una máquina virtual de java (JVM) debido a que
le ocasionaría problemas de licenciamiento, sin embargo cumple ese propósito.
La mayoría de los programas escritos en Java 5 pueden correr sobre la DVM.
DVM sacrifica la portabilidad que caracteriza a Java para poder crear
aplicaciones con un mejor rendimiento y menor consumo de energía, estas dos
características son extremadamente importantes en dispositivos móviles,
debido a que la capacidad de las baterías en estos dispositivos es limitada.
DVM está optimizada para requerir poca memoria y está diseñada para permitir
ejecutar varias instancias de la máquina virtual simultáneamente, delegando en
el sistema operativo subyacente el soporte de aislamiento de procesos, gestión
de memoria e hilos.

Figura 7: Arquitectura de android


Fuente.- Tomado de http://santiagosolisvidal.blogspot.com/2012/08/arquitectura-de-android.html

A menudo Dalvik es nombrada como una máquina virtual Java, pero esto no es
estrictamente correcto, ya que el bytecode con el que opera no es Java

CIBERTEC CARRERA DE ELECTRICIDAD


DESARROLLO DE APLICACIONES MÓVILES I 16

bytecode. Sin embargo, la herramienta dx incluida en el SDK de Android


permite transformar los archivos Class de Java compilados por un compilador
Java al formato de archivos Dex.
El nombre de Dalvik fue elegido por Bornstein en honor a Dalvík, un pueblo
de Eyjafjörður, Islandia, donde vivieron antepasados suyos.
Fuente: http://es.wikipedia.org/wiki/Dalvik

Android Runtime (ART)

Esta maquina virtual permite que las aplicaciones se compilen en código nativo, lo cual
ayuda a que las aplicaciones se carguen más rápido y que traiga el soporte de
procesadores de 64 bits. Google dice que con ART se estima que el desempeño
mejore cuatro veces.

 Android Lollipop te permite configurar rápidamente tu nuevo dispositivo. Usando


NFC, podrás migrar tus cuentas con sólo unir tu nuevo dispositivo con el viejo.
 En el Nexus 6 y Nexus 9, el comando de voz de "OK Google" funciona hasta
cuando la pantalla está apagada.
 Permitirá restablecer la configuración de fábrica y borrar todos los datos de
manera remota, especialmente diseñado para esas ocasiones en las que
perdemos los teléfonos o nos lo roban.
 Los nuevos dispositivos vienen con la encriptación automática activa para
proteger tu información en el caso de que te roben o pierdas el dispositivo.
 Menor latencia en la entrada de sonido permite que la música y los apps de
comunicaciones ofrezcan una mejor experiencia con mayor fluidez.
 Soporte de accesorios de sonido a través de USB.
 Funciones de fotografía profesional, incluyendo la captura completa de cuadros a
cerca de 30 cuadros por segundo, soporte de formatos Bayer RAW y YUV, control
del sensor, lente y flash individualmente por cada cuadro, y la captura de
metadata como modelos de ruido y información óptica.
 Protocolo más eficiente en el consumo de energía para buscar dispositivos de
Bluetooth LE y los contadores (beacons).
 Soporte para 15 nuevos idiomas para incrementar el soporte a más de 68
idiomas.

Fuente: http://www.cnet.com/es/analisis/google-android-5-0-lollipop/

CARRERAS PROFESIONALES CIBERTEC


DESARROLLO DE APLICACIONES MÓVILES I 17

1.1.4 Open Handset Alliance

Es una alianza de empresas de manera comercial para patrocionar el desarrollo de


Android hay 84 compañias que patrocinan el producto en beneficio de continuar
mejorando la plataforma Android. Al gunos de sus miembros son Google, HTC, Dell, Intel,
Motorola, Qualcomm, Texas Instruments, Samsung, LG, T-Mobile, Nvidia y Wind River
Systems.

Figura 4: Lista de empresas open HandSet Alliance


Fuente.- Tomado de http://2.bp.blogspot.com/

1.1.5 Creación de emuladores


Para iniciar en el desarrollo de aplicaciones móviles con Android es necesario tener un
emulador, un emulador es una aplicación que simula ser un equipo físico para ello
debemos hacer uso del administrador de maquinas virtuales. Para ello se debe hacer
clic en el administrador de maquinas virtuales

En la pantalla se debe elegir una de los dispositivos y posterior a ello se debe


descargar los drivers y/o librerías que sean necesarios.

CIBERTEC CARRERA DE ELECTRICIDAD


DESARROLLO DE APLICACIONES MÓVILES I 18

Para más detalles debes continuar con el material de la practica dirigida N° 1

Tema 2: IDE Android Studio

Android Studio, es el IDE (Entorno de desarrollo integrado) que utilizaremos para crear
nuestras aplicaciones es un ide mejorado al que se tenia de eclipse, esta basado en
IntelliJ IDEA de JetBrains para facilitar la generación de código para los
desarrolladores de android esta disponible para plataforma windows, MAC O/S y linux.

Para descargar el ide android studio puedes ingresar al siguiente link:


http://developer.android.com/sdk/index.html

Lo más resaltante de androidstudio es la ayuda integrada

CARRERAS PROFESIONALES CIBERTEC


DESARROLLO DE APLICACIONES MÓVILES I 19

Figura 9: Intelligent code editor


Fuente.- Tomado de http://developer.android.com/sdk/index.html

1.2.1 Android Studio características y funciones.

 Sistema de construcción de código basado en JetBrains flexible.


 Construir variantes y generación de archivos apk múltiple
 Plantillas de código para ayudarle a construir características de la aplicación
comunes
 editor de diseño Rich con soporte para arrastrar y soltar de edición tema
 Herramientas de pelusa para atrapar el rendimiento, facilidad de uso ,
compatibilidad de versiones , y otros problemas
 Capacidades ProGuard y aplicación de firma
 El soporte integrado para la plataforma de nube Google , por lo que es fácil de
integrar Google Cloud Mensajería y App Engine
 Soporte para construcción basada en Gradle.
 Consola de desarrollador: consejos de optimización, ayuda para la traducción,
estadísticas de uso.
 Renderización en tiempo real
 Soporte para programar aplicaciones para Android Wear
 Herramientas Lint para detectar problemas de rendimiento, usabilidad,
compatibilidad de versiones, y otros problemas.
 Refactorización especifica de Android y arreglos rápidos.
 Plantillas para crear diseños comunes de Android y otros componentes.

CIBERTEC CARRERA DE ELECTRICIDAD


DESARROLLO DE APLICACIONES MÓVILES I 20

En entorno de desarrollo esta preparado para crear cualquier tipo de aplicación en


Android entre ellos podemos tener para televisor, teléfonos, reloj, google glass y/o
Google Claud. Como podemos apreciar en el siguiente grafico.

Figura 5: Soporte a aplicaciones por android studio

1.2.2 Creando la primera aplicación Hola Mundo.

Ingresar a Android studio y luego dar clic en el menú File/New Proyect

Application Name: Semana 01 Controles


Company Domain: SolucionesMoviles
Proyect Location: C:\AppsMoviles_5toCiclo

Dar click en Next

CARRERAS PROFESIONALES CIBERTEC


DESARROLLO DE APLICACIONES MÓVILES I 21

Seleccionar el API y el dispositivo donde se ejecutará de la aplicación:


Seleccionar la plantila para las pantallas inicialmente vamos a seleccionar un diseño en blanco.

Dar click en next

En la siguiente pantalla se debe considerar la siguiente información


Activity Name: Nombre de clase que se relaciona a la pantalla (layout)
Layout Name: Nombre de diseño de pantalla
Title: titúlo de la pantalla el que aparece cuando se ejecuta la aplicación
Menu Resource Name: el nombre de archivo xml de menú asociado al layout.

Dar click en finalizar para completar el asistente.

CIBERTEC CARRERA DE ELECTRICIDAD


DESARROLLO DE APLICACIONES MÓVILES I 22

El proyecto que se crea

Donde
A: Archivos del proyecto
B: Diseño de pantalla en XML
C: Vistas de Text (XML) y Design (Diseño).

Visa de diseño de pantalla


En esta vista se puede apreciar el desarrollo de la aplicación en Android donde cada rectangolo
es una sección de apoyo de diseño de la aplicación.

Donde:
A: Cuadro de controles
B: Diseño de pantalla (Layout)
C: Vista esquema de controles
D: Vista propiedades de controles.

CARRERAS PROFESIONALES CIBERTEC


DESARROLLO DE APLICACIONES MÓVILES I 23

Hasta aquí nos quedamos con el ejercicio de crear la primera aplicación en Android
studio (Semana 01 Controles), a continuación vamos a revisar los principales controles
y sus propiedades para completar el desarrollo de nuestra primera aplicación.

1.2.3 Controles básicos Button, EditText, TextView

Los controles más básicos que tenemos en Android son sin duda Button, EditText y
textview los cuales nos permitirán crear una aplicación básica como por ejemplo un
login o un mantenimiento de datos en esta primera parte vamos a revisar en forma
preliminar los controles básicos que se muestra lo siguiente:

Figura 6: Controles Android


Fuente.- Tomado de http://developer.android.com/guide/topics/ui/controls.html

 TextView.- es un control etiqueta que permite mostrar textos de solo lectura en


la pantalla.
Para más detalles de los atributos y/o métodos puedes vistar la página oficial
de Android ingresando
http://developer.android.com/reference/android/widget/TextView.html

Definir el control por código XML

 EditText.- es un control que permite ingresar datos esta sujeto a aplicarle estilos
(Patrones) para mejorar el uso del mismo.

Para más detalles de los atributos y/o métodos puedes vistar la página oficial de
Android ingresando
http://developer.android.com/reference/android/widget/EditText.html

CIBERTEC CARRERA DE ELECTRICIDAD


DESARROLLO DE APLICACIONES MÓVILES I 24

Definir el control por código XML

 Button.- Botones de acción permite involucrar eventos comunes como click con el fin
de que el usuario pueda realizar una tarea.

Definir el control por código XML

Para más detalles de los atributos y/o métodos puedes vistar la página oficial de
Android ingresando
http://developer.android.com/reference/android/widget/Button.html

Diseño de pantalla login


Para continuar con el ejercicio desarrollado anteriormente realizar los siguiente

CARRERAS PROFESIONALES CIBERTEC


DESARROLLO DE APLICACIONES MÓVILES I 25

Agregar los siguientes controles

1
1
2
2
2

Se debe agregar en el siguiente orden


1. Primero borrar todos los controles
existentes
2. Agregar el layout LinnerLayout
(Vertical)
3. Agregar 1 large text
4. Agregar un Plain TextView (Plain
TextView)
5. Agregar el control EditText (Plain
Text)
6. Hacer el mismo procedimiento para
los dos controles
7. Posterior a ellos agregar los controles
Botones de comando.

Para cambiar las propiedades dar doble


click en el control.

Donde Text es el texto a mostrarse y id es


ek nombre del control que se utilizara en
el código.

Finalmente el diseño de los controles quedará como se muestra:

CIBERTEC CARRERA DE ELECTRICIDAD


DESARROLLO DE APLICACIONES MÓVILES I 26

En la vista texto (código XML) quedará como se muestra:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context=".MainActivity">

<LinearLayout

CARRERAS PROFESIONALES CIBERTEC


DESARROLLO DE APLICACIONES MÓVILES I 27

android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_alignParentTop="true"
android:layout_alignParentStart="true">

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceLarge"
android:text="Control de acceso"
android:id="@+id/textView" />

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Usuario"
android:id="@+id/textView2" />

<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:id="@+id/edtusuario" />

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Contraseña"
android:id="@+id/textView3" />

<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="textPassword"
android:ems="10"

CIBERTEC CARRERA DE ELECTRICIDAD


DESARROLLO DE APLICACIONES MÓVILES I 28

android:id="@+id/edtcontrasenia" />

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

<Button
style="?android:attr/buttonStyleSmall"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Cancelar"
android:id="@+id/btnCancelar" />

</LinearLayout>
</RelativeLayout>

Finalmente al ejecutar la aplicación se muestra lo siguiente

CARRERAS PROFESIONALES CIBERTEC


DESARROLLO DE APLICACIONES MÓVILES I 29

1.4.5 Depuración de código en Android.

La depuración es una facilidad del IDE de Android studio con el objetivo de hacer
seguimeinto al código fuente y verificar algún error no esperado, limpiar el programa,
etc. Según Wikipedia la definición de deúración de programas es el proceso de
identificar y corregir errores de programación. En inglés se le conoce como debugging,
es que se asemeja a la eliminación de bichos (bugs), manera en que se conoce
informalmente a los errores de programación. Se dice que el término bugproviene de
la época de los ordenadores de válvula termoiónica, en los cuales los problemas se
generaban por los insectos que eran atraídos por las luces y estropeaban el equipo.

Ejecutar en modo depuración:

Agregar punto de interrupción para comenzar a ejecutar paso a paso

CIBERTEC CARRERA DE ELECTRICIDAD


DESARROLLO DE APLICACIONES MÓVILES I 30

Menú con todas las opciones de depuración.

CARRERAS PROFESIONALES CIBERTEC


DESARROLLO DE APLICACIONES MÓVILES I 31

Resumen
1. El sistema operativo Android esta basado en el nucleo del sistema operativo
Android 2.6 y su creador es Andy Ruby.

2. Android es uno de los mejores sistemas operativos para dispositivos móviles por
excelencia.

3. Las características del dispositivo movil son basados en estándares abiertos.

4. La Open Handset Alliance es una estrategia comercial de apoyo mutuo para


mejorar la plataforma de estándares abiertos del sistema operativo movil android.

5. Android estudio es la herramientas más sofisticada para crear aplicaciones


basados en Android.

6. La depuración busca ubicar errors en el códido de nuestra aplicación y es una


facilidad del IDE con el fin de corregir errores de código o limpíar el programa.

Puede revisar los siguientes enlaces para ampliar los conceptos vistos en esta unidad:

o Recursos y documentación de la librería android:


https://developer.android.com/index.html

o Introducción a la plataforma Android:


http://www.ibm.com/developerworks/ssa/library/os-android-
devel/#resources

CIBERTEC CARRERA DE ELECTRICIDAD


DESARROLLO DE APLICACIONES MÓVILES I 32

UNIDAD

2
ANDROID: COMPONENTES
LOGRO DE LA UNIDAD DE APRENDIZAJE
Al término de la unidad, el alumno elabora aplicaciones que integran Activities,
componentes visuales, Intents y recursos externos pertenecientes a la
plataforma Android.

TEMARIO

2.1 Fundamentos de aplicaciones Android


2.1.1 Arquitectura de la plataforma Android.
2.1.2 Estructura de un proyecto Android. Archivos básicos, recursos, iconos
2.1.3 Ciclo de vida de un Activity
2.1.4 Componente Activity: definición y características.
2.1.5 Uso de recursos, acceso a String.XML.
2.1.6 Configuración del archivo de manifiesto

2.2 Componente de una pantalla: Views y ViewGroups


2.2.1 Componente de una pantalla: Views y ViewGroups
2.2.2 Distribución de los ViewGroups: LinearLayout, AbsoluteLayout, TableLayout,
Relative Layout, FrameLayout y ScrollView.
2.2.3 Controles ImageView, ImageButton, Spinner, Checkbox, ProgressBar

2.3 Componente Intent: definición y características


2.3.1 Uso de Intents para gestionar Actividades.
2.3.2 Resolviendo colisión de Intent Filter.
2.3.3 Invocación a otras aplicaciones usando Intents.
2.3.4 Uso del PendingIntent y notificaciones.

2.4 Orientación del dispositivo


2.4.1 Adaptación de la interface de usuario a la orientación del dispositivo
2.4.2 Manejar cambios en la orientación del dispositivo.
2.4.3 Diseño de interface de usuario con Views avanzados: ListView.

2.5 Dialogos y notificaciones


2.5.1 Dialog Window y Progress Dialog.
2.5.2 Dialogos personalizados basados en clases.
2.5.3 Toast, formatos, uso de estilos.
2.5.4 Menus, fuentes

CARRERAS PROFESIONALES CIBERTEC


DESARROLLO DE APLICACIONES MÓVILES I 33

ACTIVIDADES PROPUESTAS

 Los alumnos identifican el la arquitectura de las aplicaciones en android.


 Los alumnos identifican y usan los distintos diseños de pantalla.
 Los alumnos identifican los principales controles a utilizar para desarrollar
una aplicación básica.
 Los alumnos identifica y manejan el ciclo de vida de las activitys
 Los alumnos identifican y hacen uso de los controles básicos.
 Los alumnos programan los eventos de botones de comando en una
aplicación Android.

CIBERTEC CARRERA DE ELECTRICIDAD


DESARROLLO DE APLICACIONES MÓVILES I 34

2.1. FUNDAMENTOS DE APLICACIONES ANDROID


Cuando creamos una aplicación para Android la estructura del proyecto es muy similar
a cualquier proyecto creado en la plataforma java, ya que el lenguaje es Java, para los
que conocen C#.Net, java, VB.net será muy sencillo familiarizarse con la plataforma
para ello primero vamos analizar la estructura de un proyecto en Android studio.

2.1.1. Plataforma Android


La plataforma Android es la más utilizada en la actualidad, por ello es muy
importante estar de acorde con los avances de la tecnología, el año que paso
se considero uno de los años en el que la plataforma Android se consagro en el
mercado como uno de los sistemas operativos mas revolucionarios del
mercado por ello en esta sección vamos a hacer un comparativo con los
competidores más cercanos como son iphone de Apple y Windows pone de
Microsoft. El siguiente grafico presenta

Figura 9: Lista de plataformas moviles en competencia según Garnert


Fuente.- Tomado de http://www.androidcurso.com/index.php/

CARRERAS PROFESIONALES CIBERTEC


DESARROLLO DE APLICACIONES MÓVILES I 35

Por otro lado es importante dentro de la comparación revisar la cuota de


mercado de cada una de las plataformas en el año 2014. Podemos destacar la
desaparición de la plataforma Symbian de Nokia, el declive continuo de
BlackBerry, el estancamiento de la plataforma de Windows, que parece que no
despega, y el afianzamiento de la cuota de mercado de Apple en torno al 20%.
Finalmente, cabe señalar el espectacular ascenso de la plataforma Android,
que en cinco años ha alcanzado una cuota de mercado en torno al 85%

Figura 10: cuota de mercado de las plataformas movile según Garnert


Fuente.- Tomado de http://www.androidcurso.com/index.php/

2.1.2. Estructura de un proyecto en android

Cuando creamos un proyecto en Android studio se presenta tal como se muestra en la


figura 11, en la parte izquierda, podemos observar todos los elementos creados
inicialmente para el nuevo proyecto Android,
sin embargo por defecto lo vemos agrupados
en .idea, app, gradle. Para entender mejor la
estructura del proyecto vamos a cambiar
momentáneamente la forma en la que Android
Studio nos la muestra. Para ello, pulsaremos
sobre la lista desplegable situada en la parte

Figura 11: Estructura de un proyecto en android

CIBERTEC CARRERA DE ELECTRICIDAD


DESARROLLO DE APLICACIONES MÓVILES I 36

superior izquierda, y cambiaremos la vista de proyecto a “Project”.

Figura 12: Vista proyecto

Al cambiar la vista, los mismos archivos se presentan de otra manera como se observa en
la siguiente figura:

En los siguientes contenidos se describirá los


elementos principales de esta estructura.

Lo primero que debemos distinguir son los


conceptos de proyecto y módulo. La
entidad proyecto es única, y engloba a todos
los demás elementos. Dentro de un proyecto
podemos incluir varios módulos, que pueden
representar aplicaciones distintas, versiones
diferentes de una misma aplicación, o distintos
componentes de un sistema (aplicación móvil,
aplicación servidor, librerías). En la mayoría de los casos, trabajaremos con un proyecto
que contendrá un sólo módulo correspondiente a nuestra aplicación principal. Por ejemplo
en este caso que estamos creando tenemos el proyecto “AppsMoviles_5toCiclo” que
contiene al módulo “app” que contendrá todo el software de la aplicación de ejemplo.

CARRERAS PROFESIONALES CIBERTEC


DESARROLLO DE APLICACIONES MÓVILES I 37

Figura 14: Vista proyecto/Modulo

A continuación describiremos los contenidos principales de nuestro módulo principal.

Carpeta /app/src/main/java
Esta carpeta contendrá todo el código fuente de la aplicación, clases auxiliares, etc.
Inicialmente, Android Studio creará por nosotros el código básico de la pantalla
(actividad o activity) principal de la aplicación, que recordemos que en nuestro caso
era MainActivity, y siempre bajo la estructura del paquete java definido durante la creación
del proyecto.

Figura 15: Vista proyecto/Clases

Carpeta /app/src/main/res/
Contiene todos los ficheros de recursos necesarios para el proyecto: imágenes, layouts,
cadenas de texto, etc. Los diferentes tipos de recursos se pueden distribuir entre las
siguientes subcarpetas:

No todas estas carpetas tienen por qué aparecer en cada proyecto Android, tan sólo las
que se necesiten. Iremos viendo durante el curso qué tipo de elementos se pueden incluir
en cada una de ellas y cómo se utilizan.

Como ejemplo, para un proyecto nuevo Android como el que hemos creado, tendremos
por defecto los siguientes recursos para la aplicación:

CIBERTEC CARRERA DE ELECTRICIDAD


DESARROLLO DE APLICACIONES MÓVILES I 38

Carpeta Descripción
Contiene las imágenes [y otros elementos gráficos] usados en por la
aplicación. Para poder definir diferentes recursos dependiendo de la
resolución y densidad de la pantalla del dispositivo se suele dividir en varias
subcarpetas:
 /drawable (recursos independientes de la densidad)
/res/drawable/  /drawable-ldpi (densidad baja)
 /drawable-mdpi (densidad media)
 /drawable-hdpi (densidad alta)
 /drawable-xhdpi (densidad muy alta)
 /drawable-xxhdpi (densidad muy muy alta :)
Contiene los ficheros de definición XML de las diferentes pantallas de la
interfaz gráfica. Para definir distintos layouts dependiendo de la orientación
/res/layout/ del dispositivo se puede dividir también en subcarpetas:
 /layout (vertical)
 /layout-land (horizontal)
/res/anim/
Contienen la definición de las animaciones utilizadas por la aplicación.
/res/animator/
/res/color/ Contiene ficheros XML de definición de colores según estado.
/res/menu/ Contiene la definición XML de los menús de la aplicación.
/res/xml/ Contiene otros ficheros XML de datos utilizados por la aplicación.
Contiene recursos adicionales, normalmente en formato distinto a XML,
/res/raw/
que no se incluyan en el resto de carpetas de recursos.
Contiene otros ficheros XML de recursos de la aplicación, como por
/res/values/ ejemplo cadenas de texto (strings.xml), estilos (styles.xml), colores
(colors.xml), arrays de valores (arrays.xml), tamaños (dimens.xml), etc.

Figura 16: Vista proyecto/Recursos

Como se puede observar, existen algunas carpetas en cuyo nombre se incluye un sufijo
adicional, como por ejemplo “values-w820dp”. Estos, y otros sufijos, se emplean para
definir recursos independientes para determinados dispositivos según sus características.
De esta forma, por ejemplo, los recursos incluidos en la carpeta “values-w820dp” se

CARRERAS PROFESIONALES CIBERTEC


DESARROLLO DE APLICACIONES MÓVILES I 39

aplicarían sólo a pantallas con más de 820dp de ancho, o los incluidos en una carpeta
llamada “values-v11” se aplicarían tan sólo a dispositivos cuya versión de Android sea la
3.0 (API 11) o superior. Al igual que los sufijos “-w” y “–v” existen otros muchos para
referirse a otras características del terminal, puede consultarse la lista completa en
la siguiente url:
http://developer.android.com/guide/topics/resources/providing-resources.html

Otro de los recursos creados por defecto cabe destacar los layouts, en nuestro caso sólo
tendremos por ahora el llamado “activity_main.xml”, que contienen la definición de la
interfaz gráfica de la pantalla principal de la aplicación. Si hacemos doble clic sobre este
fichero Android Studio nos mostrará esta interfaz en su editor gráfico, y como podremos
comprobar, en principio contiene tan los controles que agregamos en el primer ejercicio

Figura 17: Vista Previa de la aplicación

Pulsando sobre las pestañas inferiores “Design” y “Text” podremos alternar entre el editor
gráfico (tipo arrastrar-y-soltar), mostrado en la imagen anterior, y el editor XML que se
muestra en la imagen siguiente:

CIBERTEC CARRERA DE ELECTRICIDAD


DESARROLLO DE APLICACIONES MÓVILES I 40

Figura 18: Vista código fuente

Durante el curso ustilizaremos ambos casos, el más efectivo es vía código XML, ya que a
veces el diseñador puede tener complicaciones o demorar dependiendo de la complejidad
de del diseño de pantalla.

Fichero /app/src/main/AndroidManifest.xml

Contiene la definición en XML de muchos de los aspectos principales de la aplicación,


como por ejemplo su identificación (nombre, icono, …), sus componentes (pantallas,
servicios, …), o los permisos necesarios para su ejecución. Veremos más adelante más
detalles de este fichero. En el caso de nuestra aplicación creada se tiene el siguiente
código en el archivo manifiesto

Figura 19: Vista código XML archivo manifiesto

CARRERAS PROFESIONALES CIBERTEC


DESARROLLO DE APLICACIONES MÓVILES I 41

Fichero /app/build.gradle
Contiene información necesaria para la compilación del proyecto, por ejemplo la versión
del SDK de Android utilizada para compilar, la mínima versión de Android que soportará la
aplicación, referencias a las librerías externas utilizadas, etc. Más adelante veremos
también más detalles de este fichero.

En un proyecto pueden existir varios ficheros build.gradle, para definir determinados


parámetros a distintos niveles. Por ejemplo, en nuestro proyecto podemos ver que existe
un fichero build.gradle a nivel de proyecto, y otro a nivel de módulo dentro de la carpeta
/app. El primero de ellos definirá parámetros globales a todos los módulos del proyecto, y
el segundo sólo tendrá efecto para el módulo correspondiente.

Carpeta /app/libs
Puede contener las librerías javas externas (ficheros .jar) que utilice nuestra aplicación.
Normalmente haremos referencia a dichas librería en el fichero build.gradle descrito en el
punto anterior, de forma que entren en el proceso de compilación de nuestra aplicación.
Veremos algún ejemplo más adelante.

Carpeta /app/build/
Contiene una serie de elementos de código generados automáticamente al compilar el
proyecto. Cada vez que compilamos nuestro proyecto, la maquinaria de compilación de
Android genera por nosotros una serie de ficheros fuente java dirigidos, entre otras
muchas cosas, al control de los recursos de la aplicación.Importante: dado que estos
ficheros se generan automáticamente tras cada compilación del proyecto es importante
que no se modifiquen manualmente bajo ninguna circunstancia.

Figura 20: Vista depuración

A destacar sobre todo el fichero que aparece desplegado en la imagen anterior, llamado
“R.java”, donde se define la clase R. Esta clase R contendrá en todo momento una serie
de constantes con los identificadores (ID) de todos los recursos de la aplicación incluidos
en la carpeta /app/src/main/res/, de forma que podamos acceder fácilmente a estos
recursos desde nuestro código a través de dicho dato. Así, por ejemplo, la

CIBERTEC CARRERA DE ELECTRICIDAD


DESARROLLO DE APLICACIONES MÓVILES I 42

constante R.layout.activity_main contendrá el ID del layout “activity_main.xml” contenido


en la carpeta /app/src/main/res/layout/.

Vista Android
El siguiente grafico presenta un proyecto creado en Android studio en la vista
Android

Figura 21: Vista Android


Donde
A: Archivo de manifiesto archivo xml de configuración de aplicaciones.

B: Activity, Clase que se asocia con el diseño


de pantalla (layout)

C: Clase de prueba que permite hacer


pruebas unitarias.

D: Imágenes (iconos) de diferentes tamaños


que se utilizará para cuando la aplicación se
ejecute en un celular, Tablet, televisor etc se
cambia de imagen segpun el tamaño de la
pantalla.

E: layout, Pantalla (s) que se tiene en el


proyecto, todos los diseños de pantalla están
basado en XML.

F: Archivo xml con el cual se configura el


menú para el diseño de pantalla principal.

G: Archivo de recursos que almacena cadenas


de arreglo, como puede ser el caso de países,
estado civil, sexo, ect.
String.XMl almacena las variables o valores de
las propiedades de los controles que se
utilizan para diseñar la aplicación.

H: Archivos de estilos, permite diseñar estilos


que pueden ser utilizados de manera muy
similar a una hoja de estilos en una página web. Figura 22: Vista Archivos de proyecto

CARRERAS PROFESIONALES CIBERTEC


DESARROLLO DE APLICACIONES MÓVILES I 43

¿Que es un Gradle?

Con el lanzamiento de Android Studio, también apareció un nuevo concepto llamado


Gradle que da Excelentes mejoras para hacer que el desarrollo de una aplicación en
Android sea más rápido. Gradle es un sistema de construcción avanzado, así como un
set de herramientas de construcción avanzada que permite la creación de una lógica
de construcción personalizada a través de plugins.

Estas son algunas de sus características que hicieron elegir Gradle al equipo de
Android:

 Buena estampación de la API permitiendo integración con el IDE.


 Lenguaje específico del Dominio (DSL) para describir y manipular la lógica
de construcción
 Muy flexible. Permite utilizar mejores prácticas pero no fuerza su propia
manera de hacer las cosas.
 Incorpora gestor de dependencias a través de Maven y/o Ivy.
 Los Plugins pueden exponer su propio DSL y su propia API para crear
archivos para su uso.
 Construye archivos basados en Groovy y permite la mezcla de elementos
declarativos a través de la DSL y la utilización de código para manipular los
elementos de la DSL para proporcionar lógica personalizada.

CIBERTEC CARRERA DE ELECTRICIDAD


DESARROLLO DE APLICACIONES MÓVILES I 44

2.6 Componente de una pantalla: Views y ViewGroups

Componente de una pantalla: Views y ViewGroups


La interfaz de usuario se define en un archivo XML que se almacena en la carpeta
res/layout, cada una de las pantallas, se crea por código XML y estándares XML.
También es posible diseñar una pantalla usando código Java, sin embargo puede
resultar complejo y poco eficiente, por ello el IDE Android studio facilita el diseño de
pantallas, cada uno representando a un "subclase" específica de view. Se pueden
crear pantallas de la misma manera que se diseñan páginas HTML.

Cada archivo describe un layout (una pantalla) y cada layout a su vez puede contener
otros elementos (vistas o controles). Para gestionar la interfaz de usuario, Android
introduce las siguientes terminos:

View
Una view es un objeto cuya clase es android.view.View. Es una estructura de datos
cuyas propiedades contienen los datos de la capa, la información específica del área
rectangular de la pantalla y permite establecer el layout. Una view tiene: layout,
drawing, focus change, scrolling, etc.

La clase view es útil como clase base para los widgets, que son unas subclases ya
implementadas que dibujan los elementos en la pantalla. Los widgets contienen sus
propias medidas, pero puedes usarlas para construir tu interfaz más rápidamente. La
lista de widgets que puedes utilizar incluye Text, EditText, InputMethod,
MovementMethod, Button, RadioButton, CheckBox, y ScrollView.

Viewgroups
Un viewgroup es un objeto de la clase android.view.Viewgroup, como su propio
nombre indica, un viewgroup es un objeto especial de view cuya function es contener y
controlar la lista de views y de otros viewgroups. Los viewgroups te permiten añadir
estructuras a la interfaz y acumular complejos elementos en la pantalla que son
diseccionados por una sola entidad.

La clase viewgroup es útil como base de la clase layouts, que son subclases
implementadas que proveen los tipos más comunes de los layouts de pantalla. Los
layouts proporcionan una manera de construir una estructura para una lista de views.

CARRERAS PROFESIONALES CIBERTEC


DESARROLLO DE APLICACIONES MÓVILES I 45

Árbol estructurado de la interfaz UI


En la plataforma Android tú defines una Activity del UI usando un árbol de nodos view
y viewgroups, como vemos en la imágen de abajo. El árbol puede ser tan simple o
complejo como necesites hacerlo, y se puede desarrollar usando los widgets y layouts
que Android proporciona o creando tus propios views.

Figura 23: Jerarquí visual de android


Fuente: http://www.gitsinformatica.com/android.html

Los views y viewgroups deben estar contenidos en los layouts, los cuales contienen
otros elementos presentes en una vista. Dentro de cada layout podemos poner todos
los elementos necesarios, incluidos otros layouts. Así conseguiremos estructurar la
pantalla de la manera deseada. Existen una gran variedad de layouts, en función de su
posicionamiento en la pantalla y se describen a continuación algunos de ellos:

Distribución de los ViewGroups


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. Estos componentes
extienden a la clase base ViewGroup, como muchos otros componentes
contenedores, es decir, capaces de contener a otros controles. En el post anterior
conocimos la existencia de un tipo concreto de layout, LinearLayout, aunque Android
nos proporciona algunos otros.

CIBERTEC CARRERA DE ELECTRICIDAD


DESARROLLO DE APLICACIONES MÓVILES I 46

FrameLayout

Éste es el más simple de todos los layouts de Android. Un FrameLayout coloca todos
sus controles hijos alineados con su esquina superior izquierda, de forma que cada
control quedará oculto por el control siguiente (a menos que éste último tenga
transparencia). Por ello, suele utilizarse para mostrar un único control en su interior, a
modo de contenedor (placeholder) sencillo para un sólo elemento sustituible, por
ejemplo una imagen.

Los componentes incluidos en un FrameLayout podrán establecer sus propiedades


android:layout_width y android:layout_height, que podrán tomar los valores “fill_parent”
(para que el control hijo tome la dimensión de su layout contenedor) o “wrap_content”
(para que el control hijo tome la dimensión de su contenido).

Ejemplo:
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<EditText android:id="@+id/TxtNombre"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
</FrameLayout>

LinearLayout
El siguiente layout Android en cuanto a nivel de complejidad es el LinearLayout. Este
layout apila uno tras otro todos sus elementos hijos de forma horizontal o vertical
según se establezca su propiedad android:orientation. Al igual que en un
FrameLayout, los elementos contenidos en un LinearLayout pueden establecer sus
propiedades android:layout_width y android:layout_height para determinar sus
dimensiones dentro del layout. Pero en el caso de un LinearLayout, tendremos otro
parámetro con el que jugar, la propiedad android:layout_weight.

<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
<EditText android:id="@+id/TxtNombre"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
<Button android:id="@+id/BtnAceptar"
android:layout_width="wrap_content"
android:layout_height="fill_parent" />
</LinearLayout>

CARRERAS PROFESIONALES CIBERTEC


DESARROLLO DE APLICACIONES MÓVILES I 47

Esta propiedad nos va a permitir dar a los elementos contenidos en el layout unas
dimensiones proporcionales entre ellas. Esto es más dificil de explicar que de
comprender con un ejemplo. Si incluimos en un LinearLayout vertical dos cuadros de
texto (EditText) y a uno de ellos le establecemos un layout_weight=”1″ y al otro un
layout_weight=”2″ conseguiremos como efecto que toda la superficie del layout quede
ocupada por los dos cuadros de texto y que además el segundo sea el doble (relación
entre sus propiedades weight) de alto que el primero.

<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
<EditText android:id="@+id/TxtDato1"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1" />
<EditText android:id="@+id/TxtDato2"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="2" />
</LinearLayout>

A pesar de la simplicidad aparente de este layout resulta ser lo suficiente versátil como
para sernos de utilidad en muchas ocasiones.

TableLayout
Un TableLayout permite distribuir sus elementos hijos de forma tabular, definiendo las
filas y columnas necesarias, y la posición de cada componente dentro de la tabla.
La estructura de la tabla se define de forma similar a como se hace en HTML, es decir,
indicando las filas que compondrán la tabla (objetos TableRow), y dentro de cada fila
las columnas necesarias, con la salvedad de que no existe ningún objeto especial para
definir una columna (algo así como un TableColumn) sino que directamente
insertaremos los controles necesarios dentro del TableRow y cada componente
insertado (que puede ser un control sencillo o incluso otro ViewGroup) corresponderá
a una columna de la tabla. De esta forma, el número final de filas de la tabla se
corresponderá con el número de elementos TableRowinsertados, y el número total de
columnas quedará determinado por el número de componentes de la fila que más
componentes contenga.
Por norma general, el ancho de cada columna se corresponderá con el ancho del
mayor componente de dicha columna, pero existen una serie de propiedades que nos
ayudarán a modificar este comportamiento:

CIBERTEC CARRERA DE ELECTRICIDAD


DESARROLLO DE APLICACIONES MÓVILES I 48

 android:stretchColumns. Indicará las columnas que pueden expandir para


absorver el espacio libre dejado por las demás columnas a la derecha de la
pantalla.
 android:shrinkColumns. Indicará las columnas que se pueden contraer para
dejar espacio al resto de columnas que se puedan salir por la derecha de la
palntalla.
 android:collapseColumns. Indicará las columnas de la tabla que se quieren
ocultar completamente.

Todas estas propiedades del TableLayout pueden recibir una lista de índices de
columnas separados por comas (ejemplo: android:stretchColumns=”1,2,3″) o un
asterisco para indicar que debe aplicar a todas las columnas (ejemplo:
android:stretchColumns=”*”).

Otra característica importante es la posibilidad de que una celda determinada pueda


ocupar el espacio de varias columnas de la tabla (análogo al atributo colspan de
HTML). Esto se indicará mediante la propiedad android:layout_span del componente
concreto que deberá tomar dicho espacio.
Veamos un ejemplo con varios de estos elementos:

<TableLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:stretchColumns="1" >
<TableRow>
<TextView android:text="Celda 1.1" />
<TextView android:text="Celda 1.2" />
</TableRow>
<TableRow>
<TextView android:text="Celda 2.1" />
<TextView android:text="Celda 2.2" />
</TableRow>
<TableRow>
<TextView android:text="Celda 3"
android:layout_span="2" />
</TableRow>
</TableLayout>

RelativeLayout
El último tipo de layout que vamos a ver es el RelativeLayout. Este layout permite
especificar la posición de cada elemento de forma relativa a su elemento padre o a
cualquier otro elemento incluido en el propio layout. De esta forma, al incluir un nuevo

CARRERAS PROFESIONALES CIBERTEC


DESARROLLO DE APLICACIONES MÓVILES I 49

elemento X podremos indicar por ejemplo que debe colocarse debajo del elemento Y y
alineado a la derecha del layout padre. Veamos esto en el ejemplo siguiente:
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<EditText android:id="@+id/TxtNombre"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
<Button android:id="@+id/BtnAceptar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/TxtNombre"
android:layout_alignParentRight="true" />
</RelativeLayout>

En el ejemplo, el botón BtnAceptar se colocará debajo del cuadro de texto TxtNombre


(android:layout_below=”@id/TxtNombre”) y alineado a la derecha del layout padre
(android:layout_alignParentRight=”true”), además de dejar un margen a su izquierda
de 10 pixeles (android:layout_marginLeft=”10px”).
Al igual que estas tres propiedades, en un RelativeLayout tendremos un sinfín de
propiedades para colocar cada control justo donde queramos. Veamos las principales
[creo que sus propios nombres explican perfectamente la función de cada una]:
Posición relativa a otro control:

 android:layout_above.
 android:layout_below.
 android:layout_toLeftOf.
 android:layout_toRightOf.
 android:layout_alignLeft.
 android:layout_alignRight.
 android:layout_alignTop.
 android:layout_alignBottom.
 android:layout_alignBaseline.
 Posición relativa al layout padre:
 android:layout_alignParentLeft.
 android:layout_alignParentRight.
 android:layout_alignParentTop.
 android:layout_alignParentBottom.
 android:layout_centerHorizontal.
 android:layout_centerVertical.
 android:layout_centerInParent.

CIBERTEC CARRERA DE ELECTRICIDAD


DESARROLLO DE APLICACIONES MÓVILES I 50

 Opciones de margen (también disponibles para el resto de layouts):


 android:layout_margin.
 android:layout_marginBottom.
 android:layout_marginTop.
 android:layout_marginLeft.
 android:layout_marginRight.
 Opciones de espaciado o padding (también disponibles para el resto de
layouts):
 android:padding.
 android:paddingBottom.
 android:paddingTop.
 android:paddingLeft.
 android:paddingRight.

Otros elementos comunes que extienden a ViewGroup, como por ejemplo las vistas de
tipo lista (ListView), de tipo grid (GridView), y en pestañas (TabHost/TabWidget).

CARRERAS PROFESIONALES CIBERTEC


DESARROLLO DE APLICACIONES MÓVILES I 51

Widgets
Un widget es el conjunto de componentes visuales que permite crear las aplicaciones
en Android. Entre dichos compoenentes tenemos Button, TextView, EditText. El
package donde se importa todos los controles es android.widget.

Figura 24: compoentes widget en los celulares


Fuente: http://bitelia.com/2014/01/widgets-android

Botones (Button)

El SDK de Android nos proporciona tres tipos de botones: el Clásico (Button), el de


tipo on/off (ToggleButton), y el que puede contener una imagen (ImageButton). En la
imagen siguiente vemos el aspecto por defecto de estos tres controles.

Figura 25: Vista cuadro de herramientas Widgets

CIBERTEC CARRERA DE ELECTRICIDAD


DESARROLLO DE APLICACIONES MÓVILES I 52

Propiedades

android:id
Esto ya lo vimos en el tema anterior, esta propiedad es el ID del control, con el
que podremos identificarlo de forma única más tarde en nuestro código. Vemos
que el identificador lo escribimos precedido de “@+id/”. Esto tendrá como
efecto que al compilarse el proyecto se genere automáticamente una nueva
constante en la clase R para dicho control.

android:text.
Texto del control. En Android, el texto de un control se puede especificar
directamente, o bien utilizar alguna de las cadenas de texto definidas en los
recursos del proyecto (fichero strings.xml), en cuyo caso indicaremos su
identificador precedido del prefijo “@string/”.

android:layout_height y android:layout_width
Dimensiones del control con respecto al layout que lo contiene. Esta propiedad
tomará normalmente los valores “wrap_content” para indicar que las
dimensiones del control se ajustarán al contenido del mismo, o bien “fill_parent”
para indicar que el ancho o el alto del control se ajustarán al ancho o alto del
layout contenedor respectivamente.

Unidades de medida para esta propiedad


px. Píxeles, corresponde a píxeles reales en la pantalla.
en.
Cm - basado en el tamaño físico de la pantalla.
mm. Milímetros - en función del tamaño físico de la pantalla.
pt. Puntos - 1/72 de una pulgada en función del tamaño físico de la pantalla.
sp. Escala de píxeles independientes - esto es como la unidad de DP, pero
también es escalado por la preferencia del usuario tamaño de la fuente. Se
recomienda utilizar esta unidad al especificar tamaños de fuente, por lo que se
ajusta tanto para la densidad de pantalla y preferencias del usuario.

android:layout_margin

CARRERAS PROFESIONALES CIBERTEC


DESARROLLO DE APLICACIONES MÓVILES I 53

Este parametro indica el espacio entre el control (en este caso botón) y su
padre en este caso el Layout.

android:padding
Este parámetro indica el espacio entre Texto o Imágenes que pongamos dentro
del control (en este caso el botón) y el propio control.

android:gravity
Esta es la gravedad del control, la verdad es que es una forma original de
poner la alineación, si entre las comillas de este parámetro pulsamos la famosa
combinación de teclas Control+Espacio, eclipse nos dará todos los parámetros
que podemos usar aquí, si ponemos solo "center" se centrara su contenido
tanto vertical como horizontal.

android:drawable
Con este parámetro pondremos una imagen al botón, que no es lo mismo que
el ImageButton, que todo el botón es en si una imagen, con esto ponemos una
especie de icono dentro del botón, por ejemplo si queremos poner el tipoco
Play, Stop las flechas de avance o retroceso... existen variantes de este
parámetro para poner la imagen a la derecha o izquierda, arriba o abajo.

android:Text
Con este parametro definimos el texto del botón, podemos usar un recurso R
usando "@String/texto o directamente un texto entre comillas.

android:TextSize
Indicamos un tamaño, si no ponemos esto, se selecciona un tamaño por
defecto standard, si te parece grando o pequeño ve probando usando la unidad
dp que vimos en el tema anterior.

android:backgroud
Con este parámetro definimos el color de fondo del Boton.

android:OnClick

CIBERTEC CARRERA DE ELECTRICIDAD


DESARROLLO DE APLICACIONES MÓVILES I 54

Esta es una propiedad que nos ayuda con el Listener, al final de la lección
hablo de esto, que es la parte Java del Boton, esto nos facilita la vida, lo malo
es que solo se puede utilizar a partir de la API 6 de Android, no creo que vallas
a hacer un proyecto con esta API yo uso esta opción, es menos lioso.

Ejemplo de definición de botón de comando

Ejemplo de botón con estilo

Evento del botón de comando

EditText
EditText (caja de edición de texto) es un cuadro de texto para ingresar datos en
Android este controlt tiene patrones definidos para permitir el ingreso de información
correcta según el tipo de ingreso definido.

CARRERAS PROFESIONALES CIBERTEC


DESARROLLO DE APLICACIONES MÓVILES I 55

android:hint. Con este parámetro pondremos un texto por defecto mientras el campo
este vacío, es decir, el lo que ve el usuario antes de que el escriba nada.

android:inputType. Con este parámetro indicamos el tipo de teclado que quieres que
aparezca cuando pulsas sobre el campo, si por ejemplo solo vamos a introducir
números, se puede indicar que aparezca un teclado numérico. Como siempre cuando
te coloques entre las comillas pulsa Control+Espacio para ver las opciones que
puedes poner para este parámetro.

Control Usuario EditText

Ejemplo de acceso a las propiedade por código

CIBERTEC CARRERA DE ELECTRICIDAD


DESARROLLO DE APLICACIONES MÓVILES I 56

Componente Activity e Intent: definición y características

Actitivity (Actividad)

Un Activity (actividad) es una clase que permite manejar los eventos de cualquier
aplicación desarrollada en Android, esta diseñada para controlar toda la funcionalidad
de cualquier aplicación, Podemos decir que todas las pantallas de una aplicación son
una “activity”. Más adelante vamos a ver que existen algunas variaciones, por ejemplo,
que si una aplicación tiene cinco pantallas, tiene 5 “Actividades” o activities.
Las activities están conformadas por dos partes: la parte lógica y la parte gráfica. La
parte lógica es una archivo .java que es la clase que se crea para poder manipular,
interactuar y colocar el código de esa actividad. Toda actividad debe tener asociado
una pantalla La parte gráfica es un XML que tiene todos los elementos que estamos
viendo de una pantalla declarados con etiquetas parecidas a las del HTML, es decir,
que el diseño de una aplicación en Android se hace similar a una página web; XML es
un primo de HTML.
Resumiendo, una actividad está conformada por la parte lógica (un archivo Java) y la
parte gráfica (un archivo XML). Profundizando más en el tema, ya sabemos que
tenemos un archivo .java, esto quiere decir que tenemos una clase principal, al ser una
actividad extiende de la clase Activity (por eso el nombre) que nos proporciona Android
para crear actividades con sus métodos asignados.

Un ejemplo de nuestro activity "MaActivity.java" podemos apreciar el código:

CARRERAS PROFESIONALES CIBERTEC


DESARROLLO DE APLICACIONES MÓVILES I 57

Primero veremos que existen dos secciones de código:


El primero es el paquete de nuestra aplicación
Y posterior a ello las importaciones

La actividad de se extiende desde la clase base Activity

El método onCreate es el método que se ejecuta primero al iniciar cualquier activity en


este caso este método es similar el método main y se enlaza con el layout (diseño de
pantalla) mediante el Código setContenView( R.layout.activity_Main);
Para ellazar controle se debe agregar código después de esta línea.

Que es la que hace el trabajo de enlazar la parte lógica con la parte gráfica. El archivo
XML que va a mostrarse cuando se mande a llamar la clase "MainActivity" es el
archivo XML llamado "activity_main".
Para cerrar la explicación: si yo creo una actividad nueva y la llamo
"VentanaPrinicipal", debo hacer que herede de activity si quiero que funcione como
actividad y para decirle que el archivo XML que va a mostrar sea el
"ventanaprincipal.xml" o "pepito.xml". La línea que dice "SetContentView" debe llevar
dentro algo parecido a esto: "setContentView"(R.layout.ventanaprincipal).

CIBERTEC CARRERA DE ELECTRICIDAD


DESARROLLO DE APLICACIONES MÓVILES I 58

Más adelante vamos a ver como agregar una actividad nueva, ya que además de esto
necesitamos hacer otras cosas en el proyecto. Espero por ahora que quede claro el
término de Activity que vamos a estar utilizando.

Ciclo de vida de la clase Activity


La base de una aplicación en Android Android son las Activity-s, en el sistema se
ejecutan como "tareas activity". Cuando es iniciada una nueva Activity se pone al inicio
de la pila de ejecución y se convierte en la Activity en ejecución. La Activity que
estuviera ejecutándose antes siempre estará por debajo en la pila y no volverá a
primer plano mientras la nueva Activity exista.

En el siguiente diagrama vemos claramente cual es el ciclo de vida de este tipo de


clases.

Figura 26: ciclo de vida del activity


Fuente.- Tomado de http://www.android-app-market.com/

CARRERAS PROFESIONALES CIBERTEC


DESARROLLO DE APLICACIONES MÓVILES I 59

Es muy importante tener en cuenta este diagrama ya que cuando estamos desarrollando una
aplicación Android, todas las aplicaciones cumplen con este ciclo de vida y dependiendo de la
aplicación debemos manejar estos ciclos de vida para gestión nuestra aplicación y los recursos
que maneja. Por ejemplo cuando una aplicación cambia de orientación de vertical a horizontal
se inicia con el método onResume. A continuación de describe cada uno de los eventos del
ciclo de vida de un activity

Evento Descripción y/o funcionalidad Abortable Siguiente


Se ejecuta cuando se crea la Activity por
primera vez. Aquí es donde se deberían crear
onCreate() No onStart()
views, enlazar datos a listas,… en definitiva el
proceso de inicialización de nuestra aplicación.
Se ejecuta después de que la aplicación se haya
onRestart() detenido, justo después de que sea iniciada de No onStart()
nuevo.

Se ejecuta justo antes de que la aplicación


aparezca visible para el usuario. Si la aplicación
onResume()
es un proceso en background el siguiente
onStart() No o
estado es onStop(), si la aplicación se ejecuta
onStop()
en foreground el siguiente método es
onResume().

Se ejecuta cuando la Activity interactúa con el


onResume( usuario. En éste punto la Activity está en la cima No onPause()
de la pila.
Se ejecuta cuando el sistema está a punto de
continuar una Activity anterior. Se utiliza
típicamente para guardar datos que no se han onResume()
onPause() grabado anteriormente, parar animaciones y Si o
otras acciones que consuman CPU. Seguida por onStop()
onResume() si la actividad vuelve a primer plano
o onStop() si es invisible para el usuario.

Se ejecuta cuando la Activity deja de ser visible


al usuario, porque otra Activity ha continuado y
pasa a un lugar más prioritario de la pila. Puede
ocurrir porque una nueva Activity ha sido onRestart()
onStop() creada, una Activity ya creada pasa a primer Si o
plano o ésta está siendo destruida. El siguiente onDestroy()
método será onRestart() si la Activity vuelve a
interaccionar con el usuario o por onDestroy() si
la Activity será destruida.

Última llamada antes de destruir la Activity.


Puede ocurrir porque la actividad está acabando
(llamada a finish() ) , o porque el sistema
onDestroy() Si NADA
destruirá la instancia para guardar espacio. Se
puede distinguir esos escenarios con el método
isFinishing().

CIBERTEC CARRERA DE ELECTRICIDAD


DESARROLLO DE APLICACIONES MÓVILES I 60

Introducción a los Intents

Android usa los intent como mecanismo para invocar componentes, los intents son
bastante fáciles de comprender. Básicamente nos permiten llamar a aplicaciones
externas a la nuestra, lanzar eventos a los que otras aplicaciones puedan responder,
lanzar alarmas etc.

Ejemplo: Tenemos el siguiente activity creado


public class MiActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.MiActivity);
}
}

El layout R.Layout.MainActivity debe estar declarado y ser un archivo de layout valido.


Una vez creado este archivo de layout, es necesario registrarlo en el AndroidManifest,
que será algo así tal como lo vemos en la primera aplicación que desarrollamos:

El registro de la activity se realiza de forma automática, tal como también se registra


una acción que podremos usar para invocar a dicha actividad. El diseñador de la
actividad puede asignar el nombre que crea conveniente a la acción. Ahora que ya
está todo listo, podemos lanzar un intent para llamar a esta actividad:

public static void LlamarActivity(Activity activity){

CARRERAS PROFESIONALES CIBERTEC


DESARROLLO DE APLICACIONES MÓVILES I 61

String actionName= "android.intent.action.MAIN";


Intent intent = new Intent(actionName);
activity.startActivity(intent);
}

La convención que se usa para nombrar una acción suele


ser android.intent.action.MAIN
Una vez que se invoca a la actividad, ésta tiene la posibilidad de recuperar el intent
que la llamó. Y podemos recuperarlo del siguiente modo:

//Este código se inserta en el método onCreate() de la actividad.


Intent intent = this.getIntent();
if (intent == null){
Log.d("Tag", "La actividad no se ha llamado mediante un intent.")
}

Para más detalles puedes ingresar al siguiente link: developer.android.com/guide/appendix/g-app-


intents.html

Funcionalidad y uso de Intents


Se puede encontrar una lista con las aplicaciones disponibles en Android junto con los
intents que las invocan. Por ejemplo, para el navegador web, tenemos dos
acciones, VIEW y WEB_SEARCH, que abren el navegador en una url específica o
realizan una búsqueda.
En el caso del dialer (marcador), tenemos las acciones CALL y DIAL, que vienen
dadas por la URI tel: numero_de_teléfono, la diferencia entre estas dos acciones, es
que CALL realiza la llamada al número de la URI, y DIAL solo lo marca, pero no realiza
la llamada.

Ejemplos de uso de Intent


Ejemplo para abrir en nevegador predeterminado en el celular.
public static void AbrirNavegador (Activity activity){
Intent intent = new Intent(Intent.ACTION_VIEW );
intent.setData(Uri.parse("http://www.google.com"));
activity.startActivity(intent);
}

Abrir el buscador predeterminado en el celular.


public static void AbrirBuscador(Activity activity){
Intent intent = new Intent(Intent.ACTION_WEB_SEARCH);
intent.setData(Uri.parse("http://www.google.com"));

CIBERTEC CARRERA DE ELECTRICIDAD


DESARROLLO DE APLICACIONES MÓVILES I 62

activity.startActivity(intent);
}
public static void AbrirVentanaLlamada(Activity activity){
Intent intent = new Intent(Intent.ACTION_DIAL);
activity.startActivity(intent);
}

public static RealizarLlamada call(Activity activity){


Intent intent = new Intent(Intent.ACTION_CALL);
intent.setData(Uri.parse("tel:555-555-555"));
activity.startActivity(intent);
}

public static void LlamargoogleMaps(Activity activity){


Intent intent = new Intent(Intent.ACTION_VIEW );
intent.setData(Uri.parse("geo:0,0?z=4&q=restaurantes"));
activity.startActivity(intent);
}

Pasar datos entre activitys mediante Intent

Para ello se debe realizar de la siguiente manera:

Gestión de problemas de pantallas

El objetivo de soportar múltiples pantallas es crear una aplicación que pueda funcionar
correctamente y se vea bien en cualquiera de las configuraciones de pantalla generalizadas
compatibles con Android. En las secciones anteriores de este documento proporcionan
información acerca de cómo Android se adapta a su aplicación a las configuraciones de
pantalla y cómo se puede personalizar el aspecto de su aplicación en diferentes

CARRERAS PROFESIONALES CIBERTEC


DESARROLLO DE APLICACIONES MÓVILES I 63

configuraciones de pantalla. Esta sección proporciona algunos consejos adicionales y una


visión general de las técnicas que ayudan a asegurarse de que su aplicación se escala
correctamente para configuraciones de pantalla diferentes.
Aquí está una lista rápida de cómo se puede asegurar que la aplicación muestra correctamente
en pantallas diferentes:
1. Utilice wrap_content , fill_parent o unidades dp al especificar dimensiones en un archivo de
formato XML
2. No utilice los valores de píxeles en el código
3. No utilice AbsoluteLayout (está en desuso)
4. Suministre drawables alternativos para densidades de pantalla diferentes
En las secciones siguientes se proporcionan más detalles.

1. Use wrap_content, fill_parent, o la unidad de DP para dimensiones del diseño


Al definir el android:layout_width y Android:layout_height para vistas en un archivo de formato
XML, utilizando "wrap_content" , "fill_parent" o unidades dp se garantiza que a la vista se le da
un tamaño apropiado en la pantalla del dispositivo actual.
Por ejemplo, una vista con un layout_width = "100dp" mide 100 pixeles de ancho en la pantalla
de densidad media y hasta 150 píxeles de ancho en la pantalla de alta densidad, de modo que
la vista ocupa aproximadamente el mismo espacio físico en la pantalla .
Del mismo modo, se debe preferir el sp (escala independiente de píxeles) para definir tamaños
de texto.

2. No utilice valores codificados de píxeles en el código de aplicación


Por cuestiones de rendimiento y mantener el código más simple, el sistema Android utiliza
píxeles como unidad estándar para expresar los valores de cota o coordenada. Eso significa
que las dimensiones de una vista se expresan siempre en el código mediante píxeles, pero
siempre se basa en la densidad de pantalla actual. Por ejemplo, si myView.getWidth() devuelve
10, la vista es 10 píxeles de ancho en la pantalla actual, pero en un dispositivo con una pantalla
de mayor densidad, el valor devuelto puede ser 15. Si utiliza valores de los píxeles en el código
de aplicación para trabajar con mapas de bits que no están pre-escalados para la densidad de
pantalla actual, puede que tenga que escalar los valores de los píxeles que se utilizan en el
código para que coincida con la fuente de mapa de bits sin escala.
Si su aplicación manipula mapas de bits o se ocupa de los valores de píxel en tiempo de
ejecución, consulte la siguiente sección sobre Consideraciones adicionales de densidad.

3. No utilice AbsoluteLayout
A diferencia de los widgets de otros diseños, AbsoluteLayout refuerza el uso de posiciones fijas
para exponer sus vistas, lo que pueden llevar fácilmente a que las interfaces de usuario no
funcionen bien en pantallas diferentes. Debido a esto, AbsoluteLayout está desfasada y en
Android 1.5 (Nivel API 3).

CIBERTEC CARRERA DE ELECTRICIDAD


DESARROLLO DE APLICACIONES MÓVILES I 64

En su lugar, debe utilizar RelativeLayout , que utiliza posicionamiento relativo. Por ejemplo,
puede especificar que un widget de botón debe aparecer "a la derecha de" un widget de texto.

4. Use el tamaño y densidad de recursos específicos


Aunque el sistema de escalas de su diseño y recursos drawables basado en la configuración
actual de la pantalla, es posible que desee realizar ajustes en la interfaz de usuario en
diferentes tamaños de pantalla y proporcionar drawables que están optimizados para diferentes
densidades. Esto, en esencia reitera la información de arriba en este documento.
Si necesita controlar exactamente cómo su aplicación se verá en varias configuraciones de
pantalla, ajustar los diseños y drawables en directorios de recursos de configuración
específicos. Por ejemplo, considere un icono que desea mostrar en las pantallas de media y
alta densidad. Sólo tienes que crear tu icono en dos tamaños diferentes (por ejemplo 100x100
de densidad media y 150x150 de alta densidad) y poner las dos variaciones en los directorios
adecuados, utilizando los calificadores apropiados:
res/drawable-mdpi/icon.png //for medium-density screens
res/drawable-hdpi/icon.png //for high-density screens

Nota: Si un calificador de densidad no está definido en un nombre de directorio, el sistema


asume que los recursos en ese directorio están diseñados para la línea de base de densidad
media y se escala para otras densidades, según proceda.

Cómo probar la aplicación en varias pantallas

CARRERAS PROFESIONALES CIBERTEC


DESARROLLO DE APLICACIONES MÓVILES I 65

Figura 17. Un conjunto de AVDS para probar pantallas de apoyo.

Antes de publicar su aplicación, usted debe probarlo a fondo en todos los tamaños de
pantalla admitidos y densidades. El SDK de Android incluye un emulador que puede
utilizar, que replican los tamaños y densidades de configuraciones de pantalla
comunes en los que su aplicación es probable que se ejecute. También se puede
modificar el tamaño predeterminado, la densidad y resolución del emulador para
reproducir las características de cualquier pantalla específica. El uso del emulador y
las configuraciones personalizadas adicionales le permite probar cualquier
configuración de pantalla posible, por lo que no tiene que comprar varios dispositivos
sólo para poner a prueba el soporte de su solicitud de pantalla.
Para configurar un entorno de prueba debe crear una serie de AVDS (Android Virtual
Devices), utilizando el emulador y configuraciones de pantalla que emulan los tamaños
de pantalla y densidades que desean. Para ello, puede utilizar el Administrador de
AVD para crear las AVDS y lanzarlos con una interfaz gráfica.

CIBERTEC CARRERA DE ELECTRICIDAD


DESARROLLO DE APLICACIONES MÓVILES I 66

Orientación del dispositivo

La funcionalidad de todo teléfono con sistema operativo Android es que tiene la


capacidad de adaptarse tanto a la pantalla como a la orientación que tiene el
dispositivo, vertical o horizontal, sin embargo en algunas ocaciones es necesario
mantener la orientación como el caso de los juegos es necesario mantener la
horientacipon en horizontal para aprovechar la capacidad de la pantalla.

Figura 27: configuración de orientación


Fuente: tomado desde http://es.wikihow.com/cambiar-la-orientaci%C3%B3n-de-la-pantalla-en-Android

CARRERAS PROFESIONALES CIBERTEC


DESARROLLO DE APLICACIONES MÓVILES I 67

La orientación, se puede configurar dentro por medio de código XML como se aprecia
en la siguiente imagen

Existe la posibilidad de evitar este comportamiento por defecto de Android frente a los
cambios dinámicos de configuración, simplemente añadiendo en el Manifest a la
activity la opción

android:configChanges="orientation|keyboardHidden"

Importante! Para que esta técnica funcione si usamos para nuestra app un target
superior a Gingerbread (API 10) , solo funciona en las versiones superiores :

android:configChanges="orientation|keyboardHidden|screenSize"

Con esto estamos indicando que el cambio de configuración lo gestionará


directamente la app, por lo que la Activity no se reinicia y se invoca el
método onConfigurationChanged(Configuration newConfig) que deberemos
sobreeescribir para realizar todos los cambios que queramos al cambiarse la
orientación del dispositivo.Obsérvese que siguiendo esta estrategia NO se cambia

CIBERTEC CARRERA DE ELECTRICIDAD


DESARROLLO DE APLICACIONES MÓVILES I 68

automáticamente el layout en el caso de que se hayan definido layout distintos, por lo


que si fuera necesario no quedaría más remedio que hacer estos cambios
programáticamente.

Por medio de código se puede realizar lo siguiente:

Para más deralle ingresar al siguiente link:


http://developer.android.com/guide/topics/resources/runtime-changes.html

CARRERAS PROFESIONALES CIBERTEC


DESARROLLO DE APLICACIONES MÓVILES I 69

Diálogos Y Notificaciones

Nuestras aplicaciones siempre deben mostrar mensajes de alerta, procesamiento o


espera por algún proceso en ejecución, por ellos debemos hacer uso de las
funcionalidades para emitir mensajes o solicitudes de confirmación de nuestra
aplicación.

Entre los mensajes más comunes que tenemos tres tipos de notificaciones:
 Notificaciones Toast.
 Notificaciones en la barra de estado.
 Ventanas de diálogo.

Notificaciones Toast

Una notificación Toast es un mensaje emergente que se muestra superpuesto en la


pantalla. Solo ocupa el espacio necesario para mostrar la alerta, mientras tanto, la
actividad que estaba visible puede seguir usándose. Este tipo de notificaciones se
muestran durante un periodo de tiempo y desaparecen, no permiten interactuar con

CIBERTEC CARRERA DE ELECTRICIDAD


DESARROLLO DE APLICACIONES MÓVILES I 70

ellas. Debido a que un Toast se crea mediante un servicio en segundo plano, puede
aparecer aunque la aplicación no esté visible.
A lo largo de todas las entradas sobre Android, se ha usado mucho este típo de
notificaciones:

Sintaxis
Toast.makeText(context, text, duration).show();

Context: Para pasar el contexto, tenemos varias posibilidades, NombreActividad.this,


o getApplicationContext().

Text: cadena de texto a mostrar

Duration: es el tiempo de duración puede asumir dos posibles valores tiempo corto o largo,
para ello podemos usar, una de las dos constantes predefinidas, Toast.LENGTH_SHORT ó
Toast.LENGTH_LONG en este caso, vamos a crear un layout personalizado para mostrar el
Toast:

< ?xml version="1.0" encoding="utf-8"?>


<linearlayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/toastLayout"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="10dp"
android:background="#DAAA"
>

<imageview android:layout_width="48px"
android:layout_height="48px"
android:src="@drawable/ok"
android:padding="5dip"
android:id="@+id/ok"/>

<textview android:id="@+id/textview"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:text="Toast con layout personalizado"
android:textColor="#fff"
android:gravity="center_vertical|center_horizontal"/>
</linearlayout>

Se debe asignar un id al LinearLayout, que usaremos posteriormente. También hemos


creado un ImageView para mostrar un icono, y un TextView para mostrar el mensaje.
El siguiente paso es inflar este layout desde el código:

LayoutInflater inflater = getLayoutInflater();


View layout = inflater.inflate(
R.layout.toast_layout
,(ViewGroup) findViewById(R.id.toastLayout));

CARRERAS PROFESIONALES CIBERTEC


DESARROLLO DE APLICACIONES MÓVILES I 71

Toast toast = new Toast(getApplicationContext());


toast.setGravity(Gravity.CENTER_VERTICAL, 0, 0);
toast.setDuration(Toast.LENGTH_LONG);
toast.setView(layout);
toast.show();

Listo, al ejecutar la aplicación tendremos un Toast como este:

Para saber más acerca de los mensajes toast puede


visitar: http://developer.android.com/guide/topics/ui/notifiers/toasts.html

Notificaciones en la barra de estado

Este tipo de notificaciones muestran un icono en la barra de estado, cuando


desplegamos esta barra, veremos el icono acompañado de un texto descriptivo
indicando que ha pasado algo (Como que hemos recibido un nuevo mensaje, o un
correo electrónico).
Los pasos necesarios para crear este tipo de notificaciones son, usar el gestor de
notificaciones del sistema (NotificationManager) y posteriormente crear un objeto
Notification en el que configuraremos nuestra notificación. Vamos a ver como hacerlo.

NotificationManager mNotificationManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

//Agregando el icono, texto y momento para lanzar la notificación


int icon = R.drawable.ok;
CharSequence tickerText = "Notification Bar";

CIBERTEC CARRERA DE ELECTRICIDAD


DESARROLLO DE APLICACIONES MÓVILES I 72

long when = System.currentTimeMillis();

Notification notification = new Notification(icon, tickerText, when);

Context context = getApplicationContext();


CharSequence contentTitle = "Notificación en barra";
CharSequence contentText = "Mensaje corto de la notificación";

//Agregando sonido
notification.defaults |= Notification.DEFAULT_SOUND;
//Agregando vibración
notification.defaults |= Notification.DEFAULT_VIBRATE;

Intent notificationIntent = new Intent(this, NotificacionesActivity.class);


PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);
notification.setLatestEventInfo(context, contentTitle, contentText, contentIntent);

mNotificationManager.notify(HELLO_ID, notification);

El resultado es el siguiente:

Al igual que los Toast, se puede crear un layout personalizado, para más
información visita:
http://developer.android.com/guide/topics/ui/notifiers/notifications.html

CARRERAS PROFESIONALES CIBERTEC


DESARROLLO DE APLICACIONES MÓVILES I 73

Diálogos
Los cuadros de dialogo personalizado permiten realizar operaciones como
confirmación o ingresar algún dato en una ventana de dialogo existen varios tipos
entre ellos tenemos:

 AlertDialog
 ProgressDialog
 DatePickerDialog
 TimePickerDialog

Si necesitamos un Diálogo que no sea uno de los de arriba, podemos extender de la


clase Dialog, y crear el nuestro propio.
La clase Activity implementa métodos para gestionar los dialogos, son:
 onCreateDialog(int): Encargado de crear el diálogo.
 onPrepareDialog(int): Llamado justo antes de mostrarlo.
 showDialog(int): Para mostrarlo.
 dismissDialog(int): cierra el diálogo, guardando su estado.
 removeDialog(int): cierra el dialogo elminándolo por completo.

Ejemplo de AlertDialog
Mostrar una ventana de dialogo que preguntará si queremos salir de la aplicación
AlertDialog.Builder dialog = new AlertDialog.Builder(this);
dialog.setMessage("¿Salir?");
dialog.setCancelable(false);
dialog.setPositiveButton("Si", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
NotificacionesActivity.this.finish();
}
});
dialog.setNegativeButton("No", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
}
});
dialog.show();

CIBERTEC CARRERA DE ELECTRICIDAD


DESARROLLO DE APLICACIONES MÓVILES I 74

Ejemplo es ProgressDialog
Cuadro de dialogo que nunca termina.
ProgressDialog.show(
NotificacionesActivity.this
,"ProgressDialog"
,"Ejemplo diálogo de progreso"
,true
,true);

Los dos últimos parámetros son para que el diálogo


sea indeterminado, y para que se pueda cerrar con la
flecha de “atrás” del terminal.

Diseño diálogos
La clase principal que se usa para crear diálogos es la clase Dialog, pero no se
recomienda usar de manera directa dicha clase. Lo recomendable es usar una de las
siguientes subclases:
AlertDialog: Un diálogo que puede mostrar un título, un máximo de tres botones, una
lista de items o un layout personalizado.
DatePickerDialog o TimePickerDialog: Un diálogo con una interfaz predefinida que
permite al usuario seleccionar una fecha o una hora.

Estas clases definen el estilo y la estructura de tu diálogo, pero la


clase DialogFragment será usada como contenedor del diálogo. Dicha clase

CARRERAS PROFESIONALES CIBERTEC


DESARROLLO DE APLICACIONES MÓVILES I 75

proporciona todos los controles que necesitamos para crear un diálogo y modificar su
apariencia. La clase DialogFragment fue introducida en Android 3.0 (API 11), si usas
una versión más antigua, podrás usar la clase DialogFragment, para ver más detalles
ingresar al siguiente link: http://developer.android.com/tools/support-library/index.html

La clase DialogFragment te asegura la correcta gestión de los eventos que puedan


ocurrir, como por ejemplo pulsar el botón Atrás o rotar la pantalla. Además, usando
dicha clase podemos reusar el interfaz de los diálogos como componente en un
interfaz más grande.

Ejemplo de AlertDialog (Diseño de pantalla)

La metodo que sedebe agregar en la activity (MainActivity)

CIBERTEC CARRERA DE ELECTRICIDAD


DESARROLLO DE APLICACIONES MÓVILES I 76

Código del botón de comando

Finalmente al ejecutar la aplicación y dar click en el botón de comando

CARRERAS PROFESIONALES CIBERTEC


DESARROLLO DE APLICACIONES MÓVILES I 77

Caso: Usando DialogFragment


Agregar una clase llamada GenerarVentanaDialogo

El código es el siguiente:

CIBERTEC CARRERA DE ELECTRICIDAD


DESARROLLO DE APLICACIONES MÓVILES I 78

Posterior a ello agregar un botón de comando en el layout principal

Código del botón de comando Dialogo Fragment

La funcionalidad en ejecución

CARRERAS PROFESIONALES CIBERTEC


DESARROLLO DE APLICACIONES MÓVILES I 79

MENÚS
Los menús en las aplicaciones son algo que encontramos frecuentemente, de hecho,
casi todos los terminales Android tienen un botón específico para desplegarlos.
Se dispone de distintos tipo de menús:

Options Menu
El menú típico, que se despliega al pulsar la tecla menú, que se divide en dos grupos:

Icon menú
Muestra un menú con iconos, 6 elementos como máximo.

Expanded Menu
Se usa cuando hay más de 6 elementos, mostrando un elemento con la palabra ‘Más’.

Context Menu: Menús contextuales desplegados al realizar una pulsación


larga en una View.

Submenús: Menús desplegados al pulsar sobre un elemento de otro menú.

Options Menu
Lo más simple y sencillo es definir los menús en XML, colocado en ./res/menu, para
este ejemplo se ha definido el siguiente menu, que contiene dos elementos, un Acerca
de y un Salir:
< ?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/AcercaDe"
android:icon="@drawable/AcercaDe"
android:title="Acerca de la aplicación">
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/submenu"
android:title="Submenú de Salir"/>
</menu>
</item>
<item android:id="@+id/BtnSalir"
android:title="Salir"
android:icon="@drawable/BtnSalir"/>
</menu>

Detallaremos el código creado líneas arriba, comenzamos declarando el menú con la


etiqueta, que contendrá todos sus elementos bajo la etiqueta, en este caso, también
tenemos un submenu, que se declara igual que el menú principal.

Los atributos de cada elemento son su identificador, el icono a mostrar y el título.


Para poder usar este menú, necesitamos inflarlo (Convertir el fichero XML en un objeto
java), para hacer esto, hay que llamar a MenuInflater.inflate(), el código siguiente infla
el fichero xml anterior en el método callback onCreateOptionsMenu().

@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.ejemplo_menu, menu);

CIBERTEC CARRERA DE ELECTRICIDAD


DESARROLLO DE APLICACIONES MÓVILES I 80

return true;
}

Ahora, tenemos que responder a las acciones del usuario cuando pulse algún
elemento de nuestro menú, para ello vamos a sobreescribir el
método onOptionsItemSelected()

@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.AcercaDe:
Toast.makeText(
MenusActivity.this
,"Ejemplo Menú"
,Toast.LENGTH_LONG)
.show();
return true;

case R.id.quit:
finish();
return true;

default:
return super.onOptionsItemSelected(item);
}
}

Context Menu

Los menús contextuales son similares a los menús mostrados al hacer click con el
botón derecho de un ratón en un PC, para crearlos, debemos sobreescribir el
método onCreateContextMenu(), donde inflaremos el archivo xml.

@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.ejemplo_menu, menu);
}

Al igual que en los options menu, tenemos que responder a las acciones del usuario:

@Override
public boolean onContextItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.AcercaDe:
Toast.makeText(
MenusActivity.this
,"Ejemplo Menús App"
,Toast.LENGTH_LONG)
.show();
return true;

case R.id.Salir:
finish();
return true;

default:

CARRERAS PROFESIONALES CIBERTEC


DESARROLLO DE APLICACIONES MÓVILES I 81

return super.onOptionsItemSelected(item);
}
}
Pero este menú contextual no se va a mostrar, ya que tenemos que asociarlo para que
se lanze al realizar una pulsación prolongada sobre una view, en este caso un botón:
final Button boton = (Button) findViewById(R.id.button1);
registerForContextMenu(boton);

CIBERTEC CARRERA DE ELECTRICIDAD


DESARROLLO DE APLICACIONES MÓVILES I 82

UNIDAD

3
PERSISTENCIA DE DATOS EN
ANDROID
LOGRO DE LA UNIDAD DE APRENDIZAJE
Al término de la unidad, el alumno elabora aplicaciones que manejan recursos,
archivos XML, y manejan bases de datos SQLite.

TEMARIO

3.1 Acceso a recursos y archivos


3.1.1 Persistencia de datos: Files
3.1.2 Almacenamiento privado y compartido.
3.1.3 File, FileOutputStream, OutputStreamWriter, PrintWriter
3.1.4 Environment uso de métodos básicos para acceso a recursos.
3.1.5 Grabar y cargar datos de Preferencias de Usuario.
3.1.6 Leer XML Data usando SAX and W3C Parsers.

3.2 Persistencia de Datos usando SQLite


3.2.1 Introducción a SQLite
3.2.2 Gestión de bases de datos con SQLite. Uso del componente
SQLiteOpenHelper.
3.2.3 Métodos y funciones comunes, Insert, Update, Delete, RawQuery,
SQLExec

3.3 Aplicando el Modelo Vista controlador con SQLite


3.3.1 La clase ContentValues
3.3.2 Introducción a SQLite: cursores y contenedores de valores.
3.3.3 Clases de acceso a datos basados en el modelo vista controlador.
3.3.4 Buenas prácticas de bases de datos en SQLite
3.3.5 Creando un proyecto con acceso a bases de datos

CARRERAS PROFESIONALES CIBERTEC


DESARROLLO DE APLICACIONES MÓVILES I 83

Acceso a recursos y archivos

Android al igual que otros sistemas operativos maneja un sistema de archivos basado
en el nucleo del sistema operativo base Linux 2.6, por ello para acceder a los archivos
y/o recursos del sistema operativo se debe indicar los permisos que debe tener la
aplicación, además de ello se debe especificar eel espacio de almacenamiento que se
tendrá en la aplicación cuando se crea una maquina virtual en los dispositivos de
prueba. A continuación se presenta un ejemplo de configuración de espacio de
almacenamiento que se debe realizar al momento de configurar la maquina virtual.

En Android tenemos las siguientes formas de acceso a recursos y/o archivos

 La memoria interna del dispositivo.


 La tarjeta SD externa, si existe.
 La propia aplicación, en forma de recurso.

Memoria Interna
Android permite leer y escribir datos en ficheros de la memoria interna a través de los
métodos habituales para trabajar con ficheros en Java. También nos permite hacer

CIBERTEC CARRERA DE ELECTRICIDAD


DESARROLLO DE APLICACIONES MÓVILES I 84

uso del directorio de cache para tales usos, pero hay que ser precavidos ya que la
chache tendremos que manejarla nosotros y abusar mucho de este directorio puede
ralentizar nuestra aplicación.

Memoria Externa
Casi todos los dispositivos Android soportan el uso de memoria externa ya sea en
forma de tarjeta SD o no. Hay que tener en cuenta que cualquier archivo en esta
memoria es accesible a todo el mundo, es decir, cualquier aplicación puede leer y
escribir ahí. Al contrario que la memoria interna, en la memoria externa necesitamos
solicitar permisos en el Manifest para tener acceso a ella.

Base de Datos SQLite


Android provee soporte completo para base de datos de tipo SQLite. Se trata de un
tipo de base de datos muy pequeña y ligera ya que está basada en ficheros, por eso
es ampliamente utilizada en sistemas móviles. Para ayudarnos a gestionar la base de
datos Android recomienda hacer uso de la clase de ayuda que nos proporciona
SQLiteOpenHelper.
En las clases de persistencia hicimos un recorrido completo sobre cómo usar una base
de datos en Android. Desde los primeros pasos, creando las estructuras de datos y
tablas, hasta la gestión de las mismas creando una clase que herede de
SQLiteOpenHelper e implementando los métodos para gestionar nuestra base de
datos: leyendo, guardando, actualizando y borrando registros en las tablas.
Además de todo esto estudiamos buenas prácticas a la hora de trabajar con base de
datos y tuvimos una aproximación a otra técnica para gestionarlas: los ORM. Esta
técnica realiza un mapeo de las entidades relacionales de la base de datos a objetos.

Proveedor de contenido o Content Provider

Un proveedor de contenidos permite compartir y tener acceso a información de otras


aplicaciones. Se accede a ellos a través de sus Content URIs, que no son más que
cadenas de texto al estilo de las direcciones web. Se implementan heredando de
ContentProvider pero se accede a ellos a través de objetos ContentResolver. Su
utilización es similar a la de una base de datos pero no tienen por qué brindar acceso
a una base de datos. Entre los que probamos estaban el Contact Provider, Calendar
Provider y Media Provider, que nos proporcionan acceso a información de contactos,
calendario y multimedia respectivamente.

CARRERAS PROFESIONALES CIBERTEC


DESARROLLO DE APLICACIONES MÓVILES I 85

Entre las clases más conocidas para manejar archivos tenemos las siguientes clases:
• Para almacenar información en archivos android presenta varias opciones
entre ellos tenemos:
 Shared Preferences Almacenar datos primitivos privadas en pares clave-valor
 Internal Storage Guarde los datos privados en la memoria del dispositivo.
 External Storage Guarde los datos públicos sobre el almacenamiento externo
compartido.
 SQLite Databases Guarde los datos estructurados en una base de datos
privada.
 Network Connection Almacenar datos en la web con su propio servidor de
red,
 Content Provider Repositorio compartido globalmente compartida por todas
las aplicaciones.

Para tener acceso a leer y escribir archivos debemos asignar los permisos en el
archivo de manifiesto como por ejemplo se presenta en el siguiente grafico:

Ejemplo de creación de un archivo llamado prueba_int.txt en la memoria interna de


modo privado.

CIBERTEC CARRERA DE ELECTRICIDAD


DESARROLLO DE APLICACIONES MÓVILES I 86

Siempre que se genera el archivo de modo privado se almacena en la siguiente


ubicación:
/data/data/nombre_package/files/nombre_fichero

Para el ejemplo mostrado se almacena en:


/data/data/ solucionesmoviles.archivos/files/prueba_int.txt

Shared Preferences
 getPreferences( )
Desde dentro de su actividad, a las preferencias específicas de la actividad de
acceso
 getSharedPreferences( )
Desde dentro de su actividad para acceder a las preferencias a nivel de
aplicación
 getDefaultSharedPreferences( )
En PreferencesManager, para obtener las preferencias compartidas que
funcionan en concierto con el marco de la preferencia general de Android

Todos los métodos de preferencias getXXX devolver un objeto Preferencia cuyo


contenido puede ser manipulado por un editor que permite putXxx ... y ... getXXX
comandos para colocar los datos de entrada y salida del contenedor Preferencia

CARRERAS PROFESIONALES CIBERTEC


DESARROLLO DE APLICACIONES MÓVILES I 87

Ejemplo: Diseño de pantalla

CIBERTEC CARRERA DE ELECTRICIDAD


DESARROLLO DE APLICACIONES MÓVILES I 88

Código fuente de la aplicación

CARRERAS PROFESIONALES CIBERTEC


DESARROLLO DE APLICACIONES MÓVILES I 89

Creando carpetas
El siguiente ejemplo muestra como crear una carpeta llamada miBkApp en la carpeta
de almacenamiento externo

CIBERTEC CARRERA DE ELECTRICIDAD


DESARROLLO DE APLICACIONES MÓVILES I 90

Leer un archivo de disco

Para el siguiente ejemplo vamos a continuar con nuestro proyecto inicial creado, para
ello vamos a agregar un botón nuevo que tenga de titulo grabar archivo y de nombre
tendrá BtnGrabarArchivo

El código de la aplicación será la siguiente:

CARRERAS PROFESIONALES CIBERTEC


DESARROLLO DE APLICACIONES MÓVILES I 91

Environment

Representa las variables del entorno, tiene propiedes comunes para toda la aplicación
Tiene propiedades comunes que utilizaremos para tener las rutas hacia a la carpeta de
nuestro celular, carpeta de imágenes, recursos, carpeta de SD externo o la carpeta
Root del sistema operativo entre otros.
El siguiente grafico muestra los atributos más comunes de esta clase.

Public Metodo/Función
Methods
getDataDirectory()
static File Recupera la carpeta de datos del usuaurio activo.
getDownloadCacheDirectory()
static File Recupera la carpeta de descargas.
getExternalStorageDirectory()
Recupera el nombre y ruta de la carpeta de la tarjeta SD
Get a top-level public external storage directory for placing files of a
static File particular type.
getExternalStorageState(File path)
Devuelve el estado actual del dispositivo de almacenamiento que
static String proporciona la ruta indicada.
getExternalStorageState()
Devuelve el estado actual del dispositivo de almacenamiento primario
static String "externa".
static isExternalStorageEmulated()
boolean Indica si el dispositivo de almacenamiento " externa" primaria es
emulado.

CIBERTEC CARRERA DE ELECTRICIDAD


DESARROLLO DE APLICACIONES MÓVILES I 92

Adaptadores de datos (Adapters)

Un adaptador es una clase especial que hace de intermediario entre un contenedor


como un listview u otro para cargar información en una plantilla por ejemplo un
adaptador podemos utilizarlo para poblar un listview como se puede mostrar en el
siguiente grafico donde se carga la lista de docentes registrados en una base de datos

Ejemplo de un arrayAdapter para cargar una lista de datos en un control Spinner


(ComboBox)

CARRERAS PROFESIONALES CIBERTEC


DESARROLLO DE APLICACIONES MÓVILES I 93

Grafico que muestra la funcionalidad del spinner con datos cargados

Otro Ejemplo de un adaptador es aquel que se usa para cargar datos


personalizados en un listview haciendo uso de un layout personalizado

Esta clase adaptador es una clase que se debe cargar a nivel del Mainactivity para
poderlo utilizar para cargar el listview

Para profundizar este tema lo veremos después de ver SQLite que se vera en el
siguiente tema.

CIBERTEC CARRERA DE ELECTRICIDAD


DESARROLLO DE APLICACIONES MÓVILES I 94

Introducción a SQLite

SQLitees un sistema de gestión de bases de datos relacional compatible con ACID,


contenida en una relativamente pequeña (~275 kiB)2 biblioteca escrita en C. SQLitees
un proyecto de dominio público1 creado por D. Richard Hipp. Para más detalles
puedes ingresar a la página oficial de SQLite www.sqlite.org

Caracteristicas principales

 Base de datos relacional para sistemas embebidos


 Ocupa únicamente unos 225KB
 No se trata de un proceso, sino de una librería que se añade dinámicamente a
las aplicaciones que quieren utilizar SQLite
 Implementa la mayor parte del estándar SQL-92, pero con restricciones
 Soporte para ALTER_TABLE limitado
 Las columnas no tienen tipos
 Existen un pluginde Firefox para visualizar bases de datos
SQLite(recomendado)
 Se utiliza internamente en Firefox y Thunderbird
 Lo utilizan la mayoría de las plataformas móviles (iOS, Symbian, Android,
BlackBerry OS, webOS)
 Existen múltiples formas de atacar SQLite
 Nosotros veremos una en la que separamos el acceso a la base de datos del
objeto Java que representa cada fila de la base de datos
 No existen las claves ajenas o foráneas, y en el caso de necesitarlas, debemos
forzarlas “a mano”
 La base de datos está protegida dentro de la memoria interna del dispositivo
 Mientras trabajamos con el emulador (donde tenemos acceso root), podemos
extraer (con DDMS) el archivo de la base de datos y visualizarlo

Cuando se crea un archivo de bases de datos se almacena de manera muy similar


que los archivos en disco:

 "/data/data/packake/nombrebasedatos.db"

Donde la carpeta principal es la carpeta de datos.


Packake es el nombre del paquete de la aplicación creada.

Ejemplo de crear un archivo de bases de datos

String StrRutaBaseDatos="/data/data/sise.app.BaseDatos/Contacto.db";
SQLiteDatabaseodb=SQLiteDatabase.openDatabase(StrRutaBaseDatos,
null,SQLiteDatabase.CREATE_IF_NECESSARY);

CARRERAS PROFESIONALES CIBERTEC


DESARROLLO DE APLICACIONES MÓVILES I 95

Tipos de datos

Integer
Valor entero, almacena1, 2, 3, 4, 6, o 8 bytes dependede la magnituddel campo.

Real
Valoresnúmericosdecimales8-byte punto flotante.

Text
Se almacenacadena en código (UTF-8, UTF-16BE or UTF-16LE).

Para más detalles y otros tipos de datos puedes ir al portal oficional de tipos de datos:
http://www.sqlite.org/datatype3.html

Metodos principales

Entre los métodos principales tenemos los siguientes

execSQL
Ejecuta un sentencia sql de creación de datos create, drop, etc.

Ejemplo:

Otros Ejemplos:

Importante!

SQLITE usaun campo ivisiblellamadoROWID queidentificacomounicoregistrola filaen el


ejemplose usaCodigocomoun campo similar

CIBERTEC CARRERA DE ELECTRICIDAD


DESARROLLO DE APLICACIONES MÓVILES I 96

RawQuery(SentenciaSQL, ParametrosArreglo)

Esta función permite recuperar un cursor (tabla) con el fin de cargar los datos en un
adaptador para presentarlo en un contenedor como un listview

Ejemplo

Cursor c1 = db.rawQuery("select count(*) as Total from tblAMIGO",null);

Agregando parámetros a Rwquery

String mySQL= "select count(*) as Total "


+ " fromContacto"
+ " whereCodigo> ?"
+ " and Nombre= ?";

String[] args= {"1", «Juan"};

Cursor c1 = db.rawQuery(mySQL, args);

Ejemplo de rwaquery:

Ejemplo Cargando Datos en una clase

CARRERAS PROFESIONALES CIBERTEC


DESARROLLO DE APLICACIONES MÓVILES I 97

La clase ContentValues

Esta clase permite almacenar variables de tipo diccionario es decir un nombre de


variable y un valor de la variable, se utiliza para pasar los datos a una base de datos y
ejecutar las sentencias de mantenimiento de datos en una base de datos de SQLite

Ejemplo: Clase especial de tipo campo valor de valores únicos controlados por índice
útil para hacer uso de insertar y/o actualizar los registros en la base de datos.

Sintaxis
ContentValues oRegistro=new ContentValues();

Metodo de SQLite insert

Ejecuta la sentencia SQL insert para agregar un nuevo registro en la base de datos

Sintaxis
insert(table, nullColumnHack, values)
Donde:
Table.- Nombre de tabla
nullColumnHack.- indica que campos tienen soporte a nulos
Values.- Lista de campos con valores a insertar

Ejemplo:

Metodo de SQLite update


Permite actualizar datos de una tabla, Ejecuta la sentencia SQL update para actualizar
registros de la base de datos

Sintaxis
update(table, values, whereClause, whereArgs)
Donde:
Table.- Nombre de tabla
Values.- Lista de campos con valores a insertar

CIBERTEC CARRERA DE ELECTRICIDAD


DESARROLLO DE APLICACIONES MÓVILES I 98

whereClause.- Parámetros para actualizar e registro en modificación


whereArgs.- Valores par los campos de parámetros

Ejemplo:

Metodo de SQLite delete

Ejecuta la sentencia SQL delete para eliminar un registro de la base de datos

Sintaxis
delete(table, whereClause, whereArgs)
Donde:
Table.- Nombre de tabla
whereClause.- Parámetros para actualizar e registro en modificación
whereArgs.- Valores par los campos de parámetros
Ejemplo:

La clase Cursor

Representa un objeto tabla en la aplicación


Sintaxis
Cursor oTabla=oDb.rawQuery("select * from Alumno", null);

Ejemplo:
Metodos
getColumnCount().- Permite saber el número de columnas que tiene la(s) tablas
consultada(s).
close().- Permite cerrar el cursor que se encuentra abierto.
getColumnName(columnIndex).- permite leer el nombre de una columna a partir del
índice
getCount().- permite leer el número de registros existentes en el cursor.

CARRERAS PROFESIONALES CIBERTEC


DESARROLLO DE APLICACIONES MÓVILES I 99

getDouble(columnIndex).- permite leer el valor de un campo número con decimales


de tipo doublé.
getString(columnIndex).- permite leer el valor de un campo de tipo cadena varchar,
text nvarchar
getInt(columnIndex).- Permite leer el valor de un campo de tipo entero
getFloat(columnIndex).- Permite leer el valor de un campo de tipo número con
decimales float.

Modelo Vista Controlador

Para aquellos que no estén familiarizados con el MVC, éste es un patrón que divide la
aplicación en tres niveles distintos, interfaz gráfica (Vista), tratamiento de datos
(Modelo) lógica de negocio (Controlador). Esto se hace para permitir una mayor
portabilidad de una aplicación, e incluso facilitar su mantenimiento. Por ejemplo si
deseamos modificar la interfaz de la aplicación es decir solo pantallas sólo
prestaremos atención a la capa de la Vista, y si queremos modificar de sistema de
almacenamiento de datos sólo tendremos que prestar atención a la capa del Modelo, y
si lo que queremos es portar la aplicación a otra plataforma lo que haremos será
modificar la capa del Controlador, al igual que si queremos modificar el código para
optimizar rendimiento.

Figura: modelo vista controlador


Fuente:http://www.proyectosimio.com/es/programacion-android-base-de-datos-i-modelo-vista-controlador/

CIBERTEC CARRERA DE ELECTRICIDAD


DESARROLLO DE APLICACIONES MÓVILES I 100

Interfaz Grafica
(Vista(

Activity
Controlador

Aplication
Controlador

SQLite
Modelo

Paso 1: Sobreescribir la aplicación

Debemos crear una nueva clase. Le damos al botón derecho sobre el Package que
tenemos en la estructura de nuestro proyecto, New->Class y le damos un nombre a
nuestra nueva clase que haga referencia a su función. Es una buena práctica crear
diferentes packages para los distintos tipos de clases que vayamos a crear, por
ejemplo un package para las Activities, otro package.modelo para las clases que
representen los datos que necesitemos manejar (por ejemplo una clase Auto), etc.

Una vez que tenemos la clase creada, le diremos que extienda de Application:

Paso 2: Modificar el archivo de manifiesto

CARRERAS PROFESIONALES CIBERTEC


DESARROLLO DE APLICACIONES MÓVILES I 101

Se debe realizar este paso para configurar que nuestra nueva clase será la que llama
a todos los activitys a a partir de ahora

Antes estaba así

Debe quedar como se muestra

Paso 3: Llamar a nuestra aplicación


Para hacer llamadas a los métodos que necesitemos de la clase Application que
hemos definido. Para poder hacerlo las Activities ya cuentan con un método que llama
a la claseApplication, que es getApplication(), que nos va a devolver precisamente la
clase Application. Sin embargo para poder hacer uso de los métodos que definamos

CIBERTEC CARRERA DE ELECTRICIDAD


DESARROLLO DE APLICACIONES MÓVILES I 102

en nuestra clase vamos a tener que hacer una conversión al tipo de la clase que
nosotros hemos definido como Application, y a partir de ahí podremos hacer la llamada
a los métodos que contenga la clase. Para que quede más claro un ejemplo sería:
((MyApplication)getApplication()).metodoDeNuestraClaseApplication();
// Llamada desde la Activity al método de Application
((MyApplication)getApplication()).getNombre()

// Código del método en MyApplication


String getNombre(int idContacto) {
return modelo.getNombre(idContacto);
}

CARRERAS PROFESIONALES CIBERTEC


DESARROLLO DE APLICACIONES MÓVILES I 103

UNIDAD

4
NETWORKING EN ANDROID
LOGRO DE LA UNIDAD DE APRENDIZAJE
Al término de la unidad, el alumno elabora aplicaciones que se conectan a la
web utilizando http y consumen servicios web.

TEMARIO

4.1 Consumiendo servicios web


4.1.1 SOAP (Simple Object Access Protocol) Mensajes SOAP, Estructura
4.1.2 Uso del protocolo HTTP para consumir web services.
4.1.3 Obtención de data de archivos XML.
4.1.4 Crear y consumir web services.

CIBERTEC CARRERA DE ELECTRICIDAD


DESARROLLO DE APLICACIONES MÓVILES I 104

Servicios web

Los servicios web permiten integrar aplicaciones de distintas plataformas como puede
ser la plataforma Java con la plataforma .net o viceversa, estos fueron creados con el
fin de ampliar la posibilidad de distribuir información mediante la web. Según la W3c lo
defie como “Un Servicio Web (Web Service [WS]) es una aplicaci´on software
identificada por un URI (Uniform Resource Identifier), cuyas interfaces se pueden
definir, describir y descubrir mediante documentos XML. Los Servicios Web hacen
posible la interacción entre ”agentes” software (aplicaciones) utilizando mensajes XML
intercambiados mediante protocolos de Internet.”

Un Servicio Web es un componente software que puede ser registrado, descubierto e


invocado mediante protocolos estándares de Internet.
 Permiten exponer y hacer disponibles funcionalidades (servicios) de los
sistemas informáticos de las organizaciones mediante tecnologías y protocolos
WEB estándar.
 Cada Servicio Web se responsabilida de realizar un conjunto de funciones
concretas y bien definidas.
 Los Servicios Web actúan como componentes independientes que se pueden
integrar para formar sistemas distribuidos complejos.

Modelo de funcioamiento de los web services


Cuando una empresa como un banco desea comunicarse sus sistemas con una
empresa aseguradora, el banco publica un servicio web y la empresa aseguradora
utiliza el servicio es decir la consume para realizar operaciones con el banco. El
siguiete grafico muestra el modo de operar de un servicio web para ello se emplea
datos en el lenguaje XML, la definición denominado esquema y utilizando un protocolo
de comunicaciones denominado SOAP.

CARRERAS PROFESIONALES CIBERTEC


DESARROLLO DE APLICACIONES MÓVILES I 105

Según el ejemplo del gráfico, un usuario (que juega el papel de cliente dentro de
los Servicios Web), a través de una aplicación, solicita información sobre un
viaje que desea realizar haciendo una petición a una agencia de viajes que
ofrece sus servicios a través de Internet. La agencia de viajes ofrecerá a su
cliente (usuario) la información requerida. Para proporcionar al cliente la
información que necesita, esta agencia de viajes solicita a su vez información a
otros recursos (otros Servicios Web) en relación con el hotel y la compañía
aérea. La agencia de viajes obtendrá información de estos recursos, lo que la
convierte a su vez en cliente de esos otros Servicios Web que le van a
proporcionar la información solicitada sobre el hotel y la línea aérea. Por último,
el usuario realizará el pago del viaje a través de la agencia de viajes que servirá
de intermediario entre el usuario y el servicio Web que gestionará el pago.

En todo este proceso intervienen una serie de tecnologías que hacen posible
esta circulación de información. Por un lado, estaría SOAP (Protocolo Simple de
Acceso a Objetos). Se trata de un protocolo basado en XML, que permite la
interacción entre varios dispositivos y que tiene la capacidad de transmitir
información compleja. Los datos pueden ser transmitidos a través
de HTTP ,SMTP , etc. SOAP especifica el formato de los mensajes. El mensaje
SOAP está compuesto por un envelope (sobre), cuya estructura está formada
por los siguientes elementos: header (cabecera) y body (cuerpo).

CIBERTEC CARRERA DE ELECTRICIDAD


DESARROLLO DE APLICACIONES MÓVILES I 106

Figura: Estructura de los mensajes

Fuente: http://www.w3c.es/Divulgacion/GuiasBreves/ServiciosWeb

Para optimizar el rendimiento de las aplicaciones basadas en Servicios Web, se


han desarrollado tecnologías complementarias a SOAP, que agilizan el envío de
los mensajes (MTOM) y los recursos que se transmiten en esos mensajes
(SOAP-RRSHB).

Por otro lado, WSDL (Lenguaje de Descripción de Servicios Web), permite que
un servicio y un cliente establezcan un acuerdo en lo que se refiere a los
detalles de transporte de mensajes y su contenido, a través de un documento
procesable por dispositivos. WSDL representa una especie de contrato entre el
proveedor y el que solicita. WSDL especifica la sintaxis y los mecanismos de
intercambio de mensajes.

Durante la evolución de las necesidades de las aplicaciones basadas en


Servicios Web de las grandes organizaciones, se han desarrollado mecanismos
que permiten enriquecer las descripciones de las operaciones que realizan sus
servicios mediante anotaciones semánticas y con directivas que definen el
comportamiento. Esto permitiría encontrar los Servicios Web que mejor se
adapten a los objetivos deseados. Además, ante la complejidad de los procesos
de las grandes aplicaciones empresariales, existe una tecnología que permite
una definición de estos procesos mediante la composición de varios Servicios
Web individuales, lo que se conoce como coreografía.

Ejemplos

A continuación se muestra el código que se utilizaría para solicitar un viaje:

<?xml version='1.0' ?>


<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-
envelope">

CARRERAS PROFESIONALES CIBERTEC


DESARROLLO DE APLICACIONES MÓVILES I 107

<env:Header>
<m:reserva xmlns:m="http://empresaviajes.ejemplo.org/reserva"
env:role="http://www.w3.org/2003/05/soap-envelope/role/next"
env:mustUnderstand="true">
<m:referencia>
uuid:093a2da1-q345-739r-ba5d-pqff98fe8j7d
</m:referencia>
<m:fechaYHora>2001-11-29T13:20:00.000-
05:00</m:fechaYHora>
</m:reserva>
<n:pasajero xmlns:n="http://miempresa.ejemplo.com/empleados"
env:role="http://www.w3.org/2003/05/soap-envelope/role/next"
env:mustUnderstand="true">
<n:nombre>Pepe Ejemplo</n:nombre>
</n:pasajero>
</env:Header>
<env:Body>
<p:itinerario
xmlns:p="http://empresaviajes.ejemplo.org/reserva/viaje">
<p:ida>
<p:salida>Nueva York</p:salida>
<p:llegada>Los Angeles</p:llegada>
<p:fechaSalida>2001-12-14</p:fechasalida>
<p:horaSalida>última hora de la tarde</p:horaSalida>
<p:preferenciaAsiento>pasillo</p:preferenciaAsiento>
</p:ida>
<p:vuelta>
<p:salida>Los Angeles</p:salida>
<p:llegada>Nueva York</p:llegada>
<p:fechaSalida>2001-12-20</p:fechaSalida>
<p:horaSalida>media-mañana</p:horaSalida>
<p:preferenciaAsiento/>
</p:vuelta>
</p:itinerario>
<q:alojamiento
xmlns:q="http://empresaviajes.example.org/reserva/hoteles">
<q:preferencia>ninguna</q:preferencia>
</q:alojamiento>
</env:Body>
</env:Envelope>

CIBERTEC CARRERA DE ELECTRICIDAD


DESARROLLO DE APLICACIONES MÓVILES I 108

Estructura Mensaje SOAP

Un mensaje SOAP es un documento XML ordinario con una estructura definida en la


especificación del protocolo.

Definición del Mensaje SOAP (WSDL)


WSDL son las siglas de Web Services Description Language, un formato XML que se
utiliza para describir servicios Web.
WSDL se usa a menudo en combinación con SOAP y XML Schema

Estructura del WSDL


Tipos de Datos
 <types>: Esta sección define los tipos de datos usados en los mensajes.
Mensajes
 <message>: Aquí definimos los elementos de mensaje.
Tipos de Puerto
 <portType>: Con este apartado definimos las operaciones permitidas y los
mensajes intercambiados en el Servicio.
Bindings
 <binding>: Especificamos los protocolos de comunicación usados.
Servicios
 <service>: Conjunto de puertos y dirección de los mismos.

CARRERAS PROFESIONALES CIBERTEC


DESARROLLO DE APLICACIONES MÓVILES I 109

Caso:
Crear un web Service usando visual studio 2010

Nombre de proyecto: WSLogin


Ubicación: C:\Android_2015
Agregar un web Service menú proyect/Add new Item

Vista del proyecto

Código fuente de wslogin.asmx

CIBERTEC CARRERA DE ELECTRICIDAD


DESARROLLO DE APLICACIONES MÓVILES I 110

El método WebMethod con dos parámetros pUsuario y pContrasenia

Web Service en publicación

Donde:
(1) Al dar click e ServiceDescriptión
Muestra la definición de servicio como métodos y funcionalidades como
métodos públicos parámetros y tipos de datos

CARRERAS PROFESIONALES CIBERTEC


DESARROLLO DE APLICACIONES MÓVILES I 111

<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tm="http://microso


ft.com/wsdl/mime/textMatching/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"x
mlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:tns="http://tempuri.org/" xmlns:s="h
ttp://www.w3.org/2001/XMLSchema" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/"
xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:wsdl="http://schemas.xmlsoap.org/ws
dl/" targetNamespace="http://tempuri.org/">
<wsdl:types>
<s:schema elementFormDefault="qualified" targetNamespace="http://tempuri.org/">
<s:element name="HelloWorld">
<s:complexType/>
</s:element>
<s:element name="HelloWorldResponse">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="HelloWorldResult" type="s:string"/>
</s:sequence>
</s:complexType>
</s:element>
<s:element name="ValidarUsuario">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="pUsuario" type="s:string"/>
<s:element minOccurs="0" maxOccurs="1" name="pContrasenia" type="s:string"/>
</s:sequence>
</s:complexType>
</s:element>
<s:element name="ValidarUsuarioResponse">
<s:complexType>
<s:sequence>
<s:element minOccurs="1" maxOccurs="1" name="ValidarUsuarioResult" type="s:boolean"/>
</s:sequence>
</s:complexType>

CIBERTEC CARRERA DE ELECTRICIDAD


DESARROLLO DE APLICACIONES MÓVILES I 112

</s:element>
</s:schema>
</wsdl:types>

(2) Metodos del servicio


Mustra los métodos públicos que se pueden consumir por el cliente e
nuestro caso utilizando Android, Dando un click por ejemplo en el
método Validar usuario se muestra la siguiente página para hacer
pruebas del servicio.

Adicionalmente se muestra formas de llamada de clientes:

Usando protocolo SOAP 1.1


Indica el nombre del método así como los parámetros que recibe y la respuesta que
emite la sección que tiene el nombre del método con la palabra Result ejemplo
ValidarUsuarioResponse y el tipo de dato de respuesta
<ValidarUsuarioResult>boolean</ValidarUsuarioResult>
Ejemplo de la imagen

CARRERAS PROFESIONALES CIBERTEC


DESARROLLO DE APLICACIONES MÓVILES I 113

Usando Protocolo SOAP 1.2 el mismo escenario indicado, sin embargo es para
soporte a plataformas complejas como WCF (Windows comuication fudation)

CIBERTEC CARRERA DE ELECTRICIDAD


DESARROLLO DE APLICACIONES MÓVILES I 114

Clases de acceso a web service


Android no tiene ninguna librería para consumir web Service por ello debemos utilizar
una librería libre llamada ksoap para consumir nuestro web Service. Para utilizar la
librería se debe descargar desde:
https://code.google.com/p/ksoap2-android/

Dar click en download y descargar el jar que indica descarga directa.

Una vez descargado ponerlo en una carpeta con ruta corta como C:\AndroidDll

Clases, métodos y funciones


SoapObject
Permite realizar crear la conexión al servicio basado en el namespace y el nombre de
método
SoapObject oRequest=new SoapObject(“http://tempuri.org/”, “Sumar”);

addProperty
Propiedad de SoapObject para agregar parámetros
oRequest.addProperty("pNumero1",1);
oRequest.addProperty("pNumero2",2);

SoapSerializationEnvelope

CARRERAS PROFESIONALES CIBERTEC


DESARROLLO DE APLICACIONES MÓVILES I 115

Permite inicializar el enlace de datos con el web service, serializar los datos para
iniciar comunicación.
SoapSerializationEnvelope oSerializador=new
SoapSerializationEnvelope(SoapEnvelope.VER11);
oSerializador.setOutputSoapObject(oRequest);
oSerializador.dotNet=true;

HttpTransportSE
Permite realizar la llamada al servicio web utilizando la url y el objetito de serialización
HttpTransportSE oEjecutarWebService=new
HttpTransportSE(“http://planificador.nisabusiness.com/operaciones.asmx”);
oEjecutarWebService.call(“http://tempuri.org/Sumar”, oSerializador);
SoapObject Resultado=(SoapObject)oSerializador.bodyIn;
StrResultado=Resultado.getProperty(0).toString(); //Permite recuperar el dato.

Agregar la referencia en Android studio

Click e el menú archivo y luego dar click en


estructura de proyecto.

Dar click en agregar referecia

CIBERTEC CARRERA DE ELECTRICIDAD


DESARROLLO DE APLICACIONES MÓVILES I 116

En la ventana que aparece seleccionar importar Jar como se muestra e el siguiente


grafico

Dar click e siguiente:


En esta ventana ubicar el archivo descargado

Posteriormente se debe seguir los pasos que se indica e la numeración para agregar
la referencia en el APK

Dar click en Apply y luego ok

CARRERAS PROFESIONALES CIBERTEC


DESARROLLO DE APLICACIONES MÓVILES I 117

Thread Manejando Hilos


E Android para las llamadas que pueden demorar el proceso de operación de las
aplicaciones se debe utilizar un hilo de ejecución por ello debemos revisar la
documentación de como manejar hilos.

Thread (Hilo).- Clase que permite ejecutar algún proceso en segundo plano.

Thread Ejemplo

Thread código de ejemplo

El siguiente código de ejemplo muestra como se utiliza el thead

CIBERTEC CARRERA DE ELECTRICIDAD


DESARROLLO DE APLICACIONES MÓVILES I 118

Donde:
1.- es el diseño de la pantalla
2.- las variables a nivel de activity
3.- código del método principal del thead

CARRERAS PROFESIONALES CIBERTEC


DESARROLLO DE APLICACIONES MÓVILES I 119

Consumiendo web Service desde Android

Objetivo
Crear un web Service que permita realizar operaciones de suma y que retore el
resultado.

Paso 1: Crear en proyecto usado visual studio 2010


Utilizado el proyecto creado anteriormente
Agregar el webservice llamado Operaciones.asmx

El código fuente s el siguiente:

Ua vez ejecutado se muestra lo siguiente:

CIBERTEC CARRERA DE ELECTRICIDAD


DESARROLLO DE APLICACIONES MÓVILES I 120

EL mismo web Service se encuentra publicado en la siguiente dirección:


http://planificador.nisabusiness.com/operaciones.asmx

Consumiendo web Service desde Android


Crear el proyecto WSLogin

Activity en Blanco

No olvidarse de dar permisos de acceso a internet

En el archivo de manifiesto AndroidManifest.xml

CARRERAS PROFESIONALES CIBERTEC


DESARROLLO DE APLICACIONES MÓVILES I 121

El layout principal es el siguiente:

<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/LinearLayout1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity">

<TableRow
android:id="@+id/tableRow1"
android:layout_width="match_parent"
android:layout_height="wrap_content" >

<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/lbltitulo"
android:textAppearance="?android:attr/textAppearanceLarge" />

</TableRow>

<TableRow
android:id="@+id/tableRow2"
android:layout_width="match_parent"
android:layout_height="wrap_content" >

<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/lblTitulonumero1" />

<EditText
android:id="@+id/edtnumero1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ems="10" >

<requestFocus />
</EditText>

</TableRow>

<TableRow
android:id="@+id/tableRow3"
android:layout_width="match_parent"
android:layout_height="wrap_content" >

<TextView
android:id="@+id/textView3"
android:layout_width="wrap_content"

CIBERTEC CARRERA DE ELECTRICIDAD


DESARROLLO DE APLICACIONES MÓVILES I 122

android:layout_height="wrap_content"
android:text="@string/lbltitulonumero2" />

<EditText
android:id="@+id/edtnumero2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ems="10" />

</TableRow>

<TableRow
android:id="@+id/tableRow4"
android:layout_width="match_parent"
android:layout_height="wrap_content" >

<TextView
android:id="@+id/textView4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/lbltituloresultado" />

<TextView
android:id="@+id/tvresutado"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/lbltituloresultadofinal"
android:textAppearance="?android:attr/textAppearanceMedium" />

</TableRow>

<TableRow
android:id="@+id/tableRow5"
android:layout_width="match_parent"
android:layout_height="wrap_content" >

<Button
android:id="@+id/btncalcular"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/lblbtntituloboton" />

<Button
android:id="@+id/btncancelar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/btntitulocancelar" />

</TableRow>

</LinearLayout>

CARRERAS PROFESIONALES CIBERTEC


DESARROLLO DE APLICACIONES MÓVILES I 123

El diseño final de la pantalla es el siguiente:

Los nombres de los controles son los siguientes:

CIBERTEC CARRERA DE ELECTRICIDAD


DESARROLLO DE APLICACIONES MÓVILES I 124

Código fuente
Código para el eveto click del botón de comando calcular

package solucionesmoviles.myapplication;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;

public class MainActivity extends Activity {

EditText oedtnumero1=null;
EditText oedtnumero2=null;
TextView oTvResultado=null;

CARRERAS PROFESIONALES CIBERTEC


DESARROLLO DE APLICACIONES MÓVILES I 125

Button obtnSumar=null;
Button obtnCancelar=null;

private static String NAMESPACE = "http://tempuri.org/";


private static String URL = "http://planificador.nisabusiness.com/operaciones.asmx";
private static String NOMBRE_METODO = "Sumar";
private static String SOAP_ACTION = "http://tempuri.org/Sumar";

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

obtnSumar=(Button)findViewById(R.id.btncalcular);
obtnSumar.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Thread oHilo=new Thread()
{
String StrResultado="";
public void run()
{
oedtnumero1=(EditText)findViewById(R.id.edtnumero1);
oedtnumero2=(EditText)findViewById(R.id.edtnumero2);
SoapObject oRequest=new SoapObject(NAMESPACE, NOMBRE_METODO);

oRequest.addProperty("pNumero1",Integer.valueOf(oedtnumero1.getText().toString()));

oRequest.addProperty("pNumero2",Integer.valueOf(oedtnumero2.getText().toString()));
SoapSerializationEnvelope oSerializador=new
SoapSerializationEnvelope(SoapEnvelope.VER11);
oSerializador.setOutputSoapObject(oRequest);
oSerializador.dotNet=true;
HttpTransportSE oEjecutarWebService=new HttpTransportSE(URL);
try
{
oEjecutarWebService.call(SOAP_ACTION, oSerializador);
SoapObject Resultado=(SoapObject)oSerializador.bodyIn;
StrResultado=Resultado.getProperty(0).toString();
}
catch(Exception ex)
{
StrResultado=ex.toString();
}
runOnUiThread(new Runnable()
{
public void run()
{
oTvResultado=(TextView)findViewById(R.id.tvresutado);
oTvResultado.setText(StrResultado);
Toast.makeText(getBaseContext(), StrResultado,
Toast.LENGTH_LONG).show();
}
});

}
};
oHilo.start();

CIBERTEC CARRERA DE ELECTRICIDAD


DESARROLLO DE APLICACIONES MÓVILES I 126

}
});
obtnCancelar=(Button)findViewById(R.id.btncancelar);
obtnCancelar.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
finish();
}
});
//getActivity().onBackPressed();

public void AplicandoHilos()


{
Thread oHilo=new Thread(
new Runnable()
{
public void run()
{//Metodo de ejecución

//Acceso a interfaz grafica actual


runOnUiThread(new Runnable()
{
public void run()
{}
});
}
}
);
oHilo.start(); //Ejecutar el hilo
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();

//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}

return super.onOptionsItemSelected(item);
}
}

CARRERAS PROFESIONALES CIBERTEC


DESARROLLO DE APLICACIONES MÓVILES I 127

Prueba de ejecución de aplicación


Ingresar los datos Una vez calculado se muestra el resultado

CIBERTEC CARRERA DE ELECTRICIDAD


DESARROLLO DE APLICACIONES MÓVILES I 128

UNIDAD

5
Servicios basados en localización
LOGRO DE LA UNIDAD DE APRENDIZAJE
Al término de la unidad, el alumno elabora aplicaciones que permitan el uso del
servicio basado en localización utilizando Google Maps.

TEMARIO

5.1 Tema 10: Manejo de fragments (4 horas)


5.1.1 Que es Fragment
5.1.2 Creating a Fragment, administrar Fragments,Flagment class
5.1.3 Toolbar Fragment Talk to the Activity
5.1.4 Eventos fragment, Aplicación fragment

5.2 Tema 11: Servicios basados en localización (3 horas)


5.2.1 Utilizar Google Maps en la aplicación.
5.2.2 Obtención de la localización (coordenadas) del dispositivo.
5.2.3 Activar las API de Google Maps.

CARRERAS PROFESIONALES CIBERTEC


DESARROLLO DE APLICACIONES MÓVILES I 129

Que es un fragment

Es una porción de la interfaz que puede añadirse y/o quitarser de la interfaz


independientemente de la actividad en curso, un fragmente se puede reutilizar en
varias Activities el propósito principal del fragment es poder diseñar varias
configuraciones de pantalla y que podamos adaptarlo de acuerdo a la necesidad,
adptandose a la horientazión vertical o horizontal con ello reducir el código que
podamos generar. Por ejemplo podemos presentar una aplicación cliente de correo
electrónico, donde al lado izquierdo debemos tener la lista de correos y al lado
derecho mostrar el mensaje de correo, con sus campos clásicos De y Asunto, y por
otro lado debemos mostrar el contenido completo del correo seleccionado. En un
teléfono móvil lo habitual será tener una primera actividad que muestre el listado de
correos, y cuando el usuario seleccione uno de ellos navegar a una nueva actividad
que muestre el contenido de dicho correo. Sin embargo, en un tablet puede existir
espacio suficiente para tener ambas partes de la interfaz en la misma pantalla, por
ejemplo en un tablet en posición horizontal podríamos tener una columna a la
izquierda con el listado de correos y dedicar la zona derecha a mostrar el detalle del
correo seleccionado, todo ello sin tener que cambiar de actividad.

Imagen 51
Fuente: http://jarroba.com/

CIBERTEC CARRERA DE ELECTRICIDAD


DESARROLLO DE APLICACIONES MÓVILES I 130

Ciclo de vida

Al igual que las activity un fragmento tiene un cliclo de vida muy parecido, que el
fragmento depende completamente del activity además de tener características
adcionales que es muy utilizado en tiempo de ejecución para alterralos.
Lista de eventos invocados en el ciclo de vida de un fragment

CARRERAS PROFESIONALES CIBERTEC


DESARROLLO DE APLICACIONES MÓVILES I 131

Evento Descripción / Funcionalidad


onAttach se ejecuta cuando el fragmento ha sido asociado a la actividad
contenedora.
onActiviyCreated Se ejecuta cuando la actividad contenedora ya ha terminado la ejecución de
su método onCreate()
onCreate Se ejecuta cuando el fragmento se está creando. En el puedes inicializar
todos los componentes que deseas guardar si el fragmento fue pausado o
detenido.
onCreateView Se llama cuando el fragmento será dibujado por primera vez en la interfaz
de usuario. En este método crearemos el view que representa al fragmento
para retornarlo hacia la actividad.
onStart Se invoca cuando el fragmento esta visible ante el usuario. Obviamente
depende del método onStart() de la actividad para saber si la actividad se
está mostrando.
onResume Es ejecutado cuando el fragmento esta activo e interactuando con el
usuario. Esta situación depende de la que actividad anfitriona este primero
en su estado Resumed.
onStop Se ejecuta cuando un fragmento ya no es visible para el usuario debido a
que la actividad anfitriona está detenida o porque dentro de la actividad se
está gestionando una operación de fragmentos.

onPause Al igual que las actividades, onPause se ejecuta cuando se detecta que el
usuario dirigió el foco por fuera del fragmento.

onDestroyView Este método es llamado cuando la jerarquía de views a la cual ha sido


asociado el fragmento ha sido destruida.

onDetach Se ejecuta cuando el fragmento ya no está asociado a la actividad anfitriona

La API de los fragmentos se incluyen en el API de Android y se encuentra en la clase


Fragment, por ello cada vez que necesite utilizar se debe extender la clase Fragment en
nuestra nueva clase para heredar su propiedades y comportamientos.

Tambien existen otros librería que se pueden utilizar como


 ListFragment
 DialogFragment
 PreferenceFragment

CIBERTEC CARRERA DE ELECTRICIDAD


DESARROLLO DE APLICACIONES MÓVILES I 132

Código de ejemplo:

public static class FragmentoDemo extends Fragment {


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragmento_Demo, container, false);
}
}

El evento onCreateView() recibe como parámetro un objeto de tipo LayoutInflater, el cual


es proveído por la clase anfitriona.

Esta clase es la encargada de inflar el código Java a través del método inflate(). Este
recibe como parámetros el recurso xml del layout, el contenedor(en este caso el view
de la actividad anfitriona) donde será insertado y una bandera indicando si el view que se
producirá debe incorporarse al contenedor.

Como se ve, hemos usado al archivo fragmento_Demo.xml como recurso, el


parámetro container que apunta a la actividad anfitriona y false para indicar que no
indicar que no deseamos comprometer el view del fragmento.

Añadiendo un fragmento a la actividad

Una vez creada la clase y el layout que representa nuestro fragmento debemos añadirlo a
la actividad. Existen dos formas para realizar este proceso.

La primera es a través del archivo layout de la actividad. Donde incluiremos un


componente XML de equivalencia para fragmentos llamado <Fragment>, el cual
referenciará a la clase especifica extendida del fragmento para crear la jerarquía.

Veamos un ejemplo:

Creación del primer layout Fragment

El siguiente paso es crear la interfaz de usuario para el primer fragmento que se


utilizará dentro de nuestra actividad.

Esta interfaz de usuario tiene que estar en un archivo XML, para ello debes estar en la
vista app ira la carpeta es y layout nuevo y lyout resource file como se muestra en el
siguiente grafico

CARRERAS PROFESIONALES CIBERTEC


DESARROLLO DE APLICACIONES MÓVILES I 133

Adición de un archivo de recursos de diseño para un proyecto Android Estudio

En el siguiente cuadro de diálogo resultante, nombre el toolbar_fragment diseño y


cambiar el elemento raíz de LinearLayout a RelativeLayout antes de hacer clic en
Aceptar para crear el nuevo archivo de recursos.

El código fuente inicial es el siguiente:

Sin embargo se debe modificar el XML como se muestra a continuación

<?xml version="1.0" encoding="utf-8"?>


<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_height="match_parent">
<Button
android:id="@+id/btnBuscar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"

CIBERTEC CARRERA DE ELECTRICIDAD


DESARROLLO DE APLICACIONES MÓVILES I 134

android:text="Buscar"
android:layout_below="@+id/skbBarraBusqueda"
android:layout_alignStart="@+id/edtBuscar" />

<EditText
android:id="@+id/edtBuscar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="16dp"
android:ems="10"
android:inputType="text" >
<requestFocus />
</EditText>

<SeekBar
android:id="@+id/skbBarraBusqueda"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_below="@+id/edtBuscar"
android:layout_marginTop="14dp" />

</RelativeLayout>

El diseño queda como se muestra:

CARRERAS PROFESIONALES CIBERTEC


DESARROLLO DE APLICACIONES MÓVILES I 135

Creación de la Primera Clase Fragmento

Además de un diseño de interfaz de usuario, un fragmento también tiene que tener


una clase asociada con él para hacer el trabajo real por medio de código. Por ello se
debe adicionar una nueva clase ir a a los archivos de proyecto desplegado en la
carpeta java Añadir una clase para este fin al proyecto desplegando la aplicación
carpeta java bajo el proyecto FragmentExample en la ventana de herramientas del
proyecto y hacer clic derecho sobre el nombre del paquete dado al proyecto cuando se
creó (en este caso com.appmovil. fragmentexample). En el menú que aparece,
seleccione la nueva opción -> Java Class. En el cuadro de diálogo Crear nueva clase
resultando, nombre el ToolbarFragment clase y haga clic en Aceptar para crear la
nueva clase.
Una vez que la clase se ha creado, se debe, por defecto, aparecerá en el panel de
edición en el que se lea como sigue:

package com.appmovil.fragmentexample;

public class ToolbarFragment {


}

Posteriomente se debe agrgar las importaciones necesarias para que el buen


funcionamiento de la aplicación

Por el momento, los únicos cambios en esta clase son para añadir algunas directivas
de importación y reemplazar el método onCreateView () para asegurarse de que el
archivo de diseño se infla y se visualiza cuando se utiliza el fragmento dentro de una
actividad. La declaración de la clase también debe indicar que la clase amplía la clase
Fragmento Android:
package com.appmovil.fragmentexample;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class ToolbarFragment extends Fragment {

@Override
public view onCreateView (LayoutInflater inflado,
Contenedor ViewGroup, Bulto
savedInstanceState) {

// Inflar el diseño de este fragmento


Ver view = inflater.inflate (R.layout.toolbar_fragment,

CIBERTEC CARRERA DE ELECTRICIDAD


DESARROLLO DE APLICACIONES MÓVILES I 136

contenedor, false);
vista regresar;
}
}

CARRERAS PROFESIONALES CIBERTEC


DESARROLLO DE APLICACIONES MÓVILES I 137

Servicios basados en localización


Localización Geográfica Básica
La geolocalización es la La localización geográfica en Android existen multitud de
formas de obtener la localización de un dispositivo móvil, la más conocida y popular es
la localización por GPS, también es posible obtener la posición de un dispositivo por
las antenas de telefonía móvil o mediante puntos de acceso Wi-Fi cercanos, y todos
cada uno de estos mecanismos tiene una precisión, velocidad y consumo de recursos
distinto.

A location-based service (LBS)


es un sistema de difusión de información que se puede acceder por los dispositivos
móviles a través de la red móvil. Es impulsado por la capacidad del sistema para
detectar la posición geográfica del dispositivo móvil.

Código de ejemplo: Listar todos los proveedores.

LocationManager locManager =
(LocationManager)getSystemService(LOCATION_SERVICE);
List<String> listaProviders = locManager.getAllProviders();

Clases para localización por GPS

Address
 Una clase que representa una dirección, es decir , un conjunto de cadenas que
describen una ubicación.
Criteria
 Una clase con indicación de los criterios de aplicación para la selección de un
proveedor de ubicación.
Geocoder
 Una clase para el manejo de la geocodificación.
GpsSatellite
 Esta clase representa el estado actual de un satélite GPS.
GpsStatus
 Esta clase representa el estado actual del motor GPS.
Location

CIBERTEC CARRERA DE ELECTRICIDAD


DESARROLLO DE APLICACIONES MÓVILES I 138

 Una clase representa una situación geográfica sintió en un momento


determinado (un "arreglar").
LocationManager
 Esta clase proporciona acceso a los servicios de localización del sistema.
LocationProvider
 Unos proveedores de localización super cclase abstracto.
GpsStatus.Listener
 Se utiliza para recibir notificaciones cuando el estado del GPS ha cambiado.
GpsStatus.NmeaListener
 Se utiliza para recibir sentencias NMEA del GPS.
LocationListener
 Se utiliza para recibir notificaciones de la LocationManager cuando la ubicación
ha cambiado.

Para más detalles visitar el portal de desarrollador google:


http://developer.android.com/guide/topics/location/strategies.html

CARRERAS PROFESIONALES CIBERTEC


DESARROLLO DE APLICACIONES MÓVILES I 139

Google Maps
Google Maps es un servidor de aplicaciones de mapas en la web que pertenece a
Google. Ofrece imágenes de mapas desplazables, así como fotografías por satélite del
mundo e incluso la ruta entre diferentes ubicaciones o imágenes a pie de calle Google
Street View. Desde el 6 de octubre de 2005, Google Maps es parte de Google Local.

Existe una variante a nivel entorno de escritorio llamada Google Earth que ofrece
Google también de forma gratuita. En 2014, los documentos filtrados por Edward
Snowden revelaron que Google Maps es parte y víctima del entramado de vigilancia
mundial operado por varias agencias de inteligencia occidentales y empresas
tecnológicas.

Imagen 215
Fuente: http://www.elandroidelibre.com/wp-content/uploads/2011/05/google-maps-navigation.jpg

Nuevo Google Maps


En la Google I/O 2013, Google presentó un rediseño de Google Maps para la versión
Web, mostrando nuevas funciones como:
 El mapa ocupa toda la pantalla.
 La barra de búsqueda esta en la parte superior izquierda y puede mostrar
información sobre la ubicación.
 En la esquina inferior derecha están ubicados los controles de zoom.
 Ahora hay un modo tierra el cual es una combinación entre la vista satélite y
google earth, en donde podremos ver las ciudades en 3D y al alejar la imagen
podremos ver la Tierra en 3D.
 Al hacer clic en un lugar, nos muestra las reseñas, fotos, números de teléfono y
ver el edificio en Street View.
 Al usar indicaciones podremos ver varias rutas y cambiarlas, además de que se
podrán ver las rutas en avión y reservar vuelos.

CIBERTEC CARRERA DE ELECTRICIDAD


DESARROLLO DE APLICACIONES MÓVILES I 140

Habilitar APIS de google Maps


Google esta compuesto por mucas aplicaciones las cuales las denomina google apps,
Google Apps for Work es un servicio de
Google que proporciona varios productos
de Google con un nombre de dominio
personalizado por el cliente. Cuenta con
varias aplicaciones web con funciones
similares a las suites ofimáticas
tradicionales, incluyendo Gmail, Hangouts,
Calendar, Drive, Docs, Sheets, Slides,
Groups, News, Play, Sites y Vault. Fue la
creación de Rajen Sheth, un empleado de
Google que posteriormente desarrolló las
Chromebooks. 1

Para habilitar las apis de google Maps se debe ingresar a la siguiente dirección:

1. Ingresar a tu cuenta de Gmail


2. Ingresar a la consola de APIS
 https://code.google.com/apis/console
3. Crear un proyecto asociado a la plataforma de desarrollo para nuestro caso es
una aplicación movil en android
4. Habilitar las API necesarias

Instalar google play services


Para utilizar google Maps se debe instalar google play services ingresando al
administrador de librerías como se muestra.

1
Cfr: http://es.wikipedia.org/wiki/Google_Apps

CARRERAS PROFESIONALES CIBERTEC


DESARROLLO DE APLICACIONES MÓVILES I 141

Creando nuestra primera aplicación en google Maps

Datos del proyecto

Se debe modificar el XMl como se muestra en la siguiente imagen

Modificar el glandle como se muestra para agregar las referencias a google play
services

Posterior a ello se debe crear las llaves digitales para firmar la aplicación con los
siguientes comandos como se indica:

keytool -list -v -keystore mystore.keystore

CIBERTEC CARRERA DE ELECTRICIDAD


DESARROLLO DE APLICACIONES MÓVILES I 142

Configurar el archivo de manifiesto como se indica

<meta-data android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version" />
<meta-data
android:name="com.google.android.maps.v2.API_KEY"
android:value="AIzaSyB9oARLFPe4wRGyeuWJq0IqZ0g84TjmjVI" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission
android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

Agregar el siguiente código para hacer uso de google Maps

import com.google.android.gms.maps.*;
public class MainActivity extends Activity {
private void createMapView(){

try {
if(null == googleMap){
googleMap = ((MapFragment)
getFragmentManager().findFragmentById(
R.id.mapView)).getMap();

if(null == googleMap) {
Toast.makeText(getApplicationContext(),
"Error creating map",Toast.LENGTH_SHORT).show();
}
}
} catch (NullPointerException exception){
Log.e("mapasApp", exception.toString());
}
}

Para agregar marcadores se debe realizar con el siguiente código

import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;

Agregar el siguiente método para fijar un marcador


private void addMarker(){
if(null != googleMap){
googleMap.addMarker(new MarkerOptions()
.position(new LatLng(0, 0))
.title("Marker")
.draggable(true)
);
}
}

Finalmente el método oncreate queda como se muestra:

CARRERAS PROFESIONALES CIBERTEC


DESARROLLO DE APLICACIONES MÓVILES I 143

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
createMapView();
addMarker();
}

Finalmente ejecutando la aplicación se muestra el mapa en el celular como se muestra

CIBERTEC CARRERA DE ELECTRICIDAD


DESARROLLO DE APLICACIONES MÓVILES I 144

UNIDAD

6
Servicios
LOGRO DE LA UNIDAD DE APRENDIZAJE
Al término de la unidad, el alumno elabora aplicaciones desatendidas basadas
en servicios que permitan realizar operaciones como descarga de archivos
grandes, monitorear usuarios basado en geolocalización.

TEMARIO

6.1 Tema 13: Creando y administrando Servicios (4 horas)


6.1.1 Qué es un servicio,
6.1.2 Anatomía de un servicio, accesos y permisos.
6.1.3 Intent Service, Bound Service.
6.1.4 Configurar el archivo de manifiesto.
6.1.5 Iniciar/Configurar servicios

CARRERAS PROFESIONALES CIBERTEC


DESARROLLO DE APLICACIONES MÓVILES I 145

Que es un servicio (Service)

Los servicios son componentes sin interfaz gráfica que se ejecutan en segundo plano.
En concepto, son exactamente iguales a los servicios presentes en cualquier otro
sistema operativo como por ejemplo Windows los servicios de Windows update, o el
servicio de actualización de la hora de windows. Los servicios pueden realizar
cualquier tipo de acciones, por ejemplo actualizar datos, lanzar notificaciones, o
incluso mostrar elementos visuales como por ejemplo Activities si se necesita en algún
momento la interacción con del usuario. La plataforma de Android tiene una gran
variedad de servicios que ofrece como por ejemplo los alertas cuando la batería esta
baja o por ejemplo cuando llega un mensae de texto o alertas para aceder a dichos
servicios se puede realizar con la clase Manager. De esta manera, en nuestras
actividades podremos accesar a estos servicios a través del
método getSystemService().

Por otro lado, si necesitamos utilizar servicios propios, estos deben ir declarados
en el archivo AndroidManifest.xml.

Imagen: Ciclo de vida de los servicios


Fuente: http://cd1.faqsandroid.com/wp-content/uploads/2012/08/service_lifecycle.jpg

CIBERTEC CARRERA DE ELECTRICIDAD


DESARROLLO DE APLICACIONES MÓVILES I 146

Creando un servicio de musica

1. Crea un nuevo proyecto con los siguientes datos:

2. Reemplaza el código del layout activity_main.xml por:

<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Servicio de reproducción de música"/>
<Button android:id="@+id/boton_arrancar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Arrancar servicio"/>
<Button android:id="@+id/boton_detener"
android:layout_width="wrap_content"

CARRERAS PROFESIONALES CIBERTEC


DESARROLLO DE APLICACIONES MÓVILES I 147

android:layout_height="wrap_content"
android:text="Detener servicio"/>
</LinearLayout>

El diseño de pantalla queda Como se muestra

3. Agregar la clase ServicioMusica

3.1. Agregar el siguiente código en el activity main:

CIBERTEC CARRERA DE ELECTRICIDAD


DESARROLLO DE APLICACIONES MÓVILES I 148

4. agregar el siguiente código en el servicio de musica:

package solucionesmoviles.serviciomusica;
import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.IBinder;
import android.widget.Toast;
/**
* Created by peextssolis on 06/03/2015.
*/
public class ServicioMusica extends Service {
MediaPlayer reproductorMusica;

@Override
public void onCreate() {
Toast.makeText(this, "Servicio iniciado",
Toast.LENGTH_SHORT).show();
reproductorMusica = MediaPlayer.create(this, R.raw.audio);
}
@Override
public int onStartCommand(Intent intenc, int flags, int idArranque) {
Toast.makeText(this,"Servicio arrancado "+ idArranque,
Toast.LENGTH_SHORT).show();
reproductorMusica.start();
return START_STICKY;
}

@Override
public void onDestroy() {
Toast.makeText(this,"Servicio detenido",
Toast.LENGTH_SHORT).show();
reproductorMusica.stop();
}

@Override
public IBinder onBind(Intent intencion) {
return null;
}
}

5. Modificar el archivo de manifiesto AndroidManifest.xml y agregar el siguiente


código de declaración de servicio en el tag <application>.
<service android:name=".ServicioMusica" />

CARRERAS PROFESIONALES CIBERTEC


DESARROLLO DE APLICACIONES MÓVILES I 149

6. Ahora debes crear una nueva carpeta con nombre raw dentro de la carpeta res.
Arrastra a su interior el ficheroaudio.mp3.

7. Ejecuta la aplicación y comprueba su funcionamiento. Puedes terminar la


actividad pulsando el botón de retroceder y verificar que el servicio continúa en
marcha.

CIBERTEC CARRERA DE ELECTRICIDAD


DESARROLLO DE APLICACIONES MÓVILES I 150

UNIDAD

7
Multimedia y publicación
LOGRO DE LA UNIDAD DE APRENDIZAJE
Al término de la unidad, el alumno elabora aplicaciones que permitan el uso del
video y de sus dispositivos visuales y las publicará en GooglePlay.

TEMARIO

7.1 Tema 12: Audio, Video y Uso de Dispositivos visuales


7.1.1 Componente Media Player. Definición, características y aplicaciones.
7.1.2 Visualización de videos usando la vista Video.
7.1.3 Grabación de audio y video: Uso de Intents para grabar video.

17.2 Tema 14: Publicación en Google Play


7.2.1 Generación de APK firmado con el certificado digital.
7.2.2 Creación de la cuenta en Google Play.
7.2.3 Publicación de la aplicación

CARRERAS PROFESIONALES CIBERTEC


DESARROLLO DE APLICACIONES MÓVILES I 151

Audio, Video y Uso de Dispositivos visuales

Multimedia

La capacidad de reproducir contenido multimedia es una característica presente en la


práctica totalidad de las terminales telefónicas existentes en el mercado hoy en día.
Muchos usuarios prefieren utilizar las capacidades multimedia de su teléfono, en lugar
de tener que depender de otro dispositivo adicional para ello. Android incorpora la
posibilidad de reproducir no sólo audio en diversos formatos, sino que también vídeo.
Los formatos de audio soportados son los siguientes:

 AAC LC/LTP
 HE-AACv1 (AAC+)
 HE-AACv2 (Enhanced ACC+)
 AMR-NB
 AMR-WB
 FLAC
 MP3
 MIDI
 Ogg Vorbis
 PCM/Wave

Con respecto al vídeo, los formatos soportados son:


 H.263
 H.264 AVC
 MPEG-4 SP
 VP8

En esta sesión echaremos un vistazo a las herramientas necesarias para poder


reproducir contenido multimedia (audio o vídeo) en una actividad. También veremos
cómo añadir la capacidad a nuestra aplicación para la toma de fotografías, una
característica perfectamente emulada por el emulador en las últimas versiones del
Android SDK.

CIBERTEC CARRERA DE ELECTRICIDAD


DESARROLLO DE APLICACIONES MÓVILES I 152

Reproducción de audio
La reproducción de contenido multimedia se lleva a cabo por medio de la clase
MediaPlayer. Dicha clase nos permite la reproducción de archivos multimedia
almacenados como recursos de la aplicación, en ficheros locales, en proveedores de
contenido, o servidos por medio de streaming a partir de una URL. En todos los casos,
como desarrolladores, la clase MediaPlayer nos permitirá abstraernos del formato así
como del origen del fichero a reproducir. Incluir un fichero de audio en los recursos de
la aplicación para poder ser reproducido durante su ejecución es muy sencillo.
Simplemente creamos una carpeta raw dentro de la carpeta res, y almacenamos en
ella sin comprimir el fichero o ficheros que deseamos reproducir. A partir de ese
momento el fichero se identificará dentro del código como R.raw.nombre_Archivo.
Para reproducir un fichero de audio tendremos que seguir una secuencia de pasos.

 En primer lugar deberemos crear una instancia de la clase MediaPlayer.


 El siguiente paso será indicar qué fichero será el que se reproducirá. Por último
ya podremos llevar a cabo la reproducción en sí misma del contenido
multimedia.

Veamos primero cómo inicializar la reproducción.

Tenemos dos opciones. La primera de ellas consiste en crear una instancia de la clase
MediaPlayer por medio del método create(). En este caso se deberá pasar como
parámetro, además del contexto de la aplicación, el identificador del recurso, tal como
se puede ver en el siguiente ejemplo:

Reproducción de vídeo usando el control VideoView

La reproducción de vídeo es muy similar a la reproducción de audio, salvo dos


particularidades. En primer lugar, no es posible reproducir un clip de vídeo
almacenado como parte de los recursos de la aplicación. En este caso deberemos
utilizar cualquiera de los otros tres medios (ficheros locales, streaming o proveedores
de contenidos). Un poco más adelante veremos cómo añadir un clip de vídeo a la
tarjeta de memoria de nuestro terminal emulado desde la propia interfaz de Eclipse. En
segundo lugar, el vídeo necesitará de una superficie para poder reproducirse. Esta
superficie se corresponderá con una vista dentro del layout de la actividad. Existen
varias alternativas para la reproducción de vídeo, teniendo en cuenta lo que acabamos
de comentar. La más sencilla es hacer uso de un control de tipo VideoView, que
encapsula tanto la creación de una superficie en la que reproducir el vídeo como el
control del mismo mediante una instancia de la clase MediaPlayer. Este método será
el que veamos en primer lugar. El primer paso consistirá en añadir el control
VideoView a la interfaz gráfica de la actividad en la que queramos que se reproduzca
el vídeo. Podemos añadir algo como lo siguiente el fichero de layout correspondiente:

CARRERAS PROFESIONALES CIBERTEC


DESARROLLO DE APLICACIONES MÓVILES I 153

Dentro del código Java podremos acceder a dicho elemento de la manera habitual, es decir,
mediante el método findViewById(). Una vez hecho esto, asignaremos una fuente que se
corresponderá con el contenido multimedia a reproducir. El control VideoView se encargará de
la inicialización del objeto MediaPlayer. Para asignar un video a reproducir podemos utilizar
cualquiera de estos dos métodos:

Una vez inicializado el control se puede controlar la reproducción con los métodos:
 start()
 stopPlayback()
 pause()
 seekTo()

La clase VideoView también incorpora el método setKeepScreenOn(boolean)con la que se


podrá controlar el comportamiento de la iluminación de la pantalla durante la reproducción del
clip de vídeo. Si se pasa como parámetro el valor true ésta permanecerá constantemente
iluminada.

El siguiente código muestra un ejemplo de asignación de un vídeo a un control VideoView y de


su posterior reproducción. Dicho código puede ser utilizado a modo de esqueleto en nuestra
propia actividad. También podemos ver un ejemplo de uso de seekTo(), en este caso para
avanzar hasta la posición intermedia del video.

En esta sección veremos en último lugar, tal como se ha indicado anteriormente, la manera de
añadir archivos a la tarjeta de memoria de nuestro dispositivo virtual, de tal forma que podamos
almacenar clips de vídeo y resolver los ejercicios propuestos para la sesión. Se deben seguir
los siguientes pasos:
En primer lugar el emulador debe encontrarse en funcionamiento, y por supuesto, el dispositivo
emulado debe hacer uso de una tarjeta SD.

CIBERTEC CARRERA DE ELECTRICIDAD


DESARROLLO DE APLICACIONES MÓVILES I 154

Gráficos 2D y Aplicaciones Multimedia


Las librerías android.graphics.drawable y android.view.animation son proporcionadas por
Android para dibujar y animar imágenes y formas 2D.

Drawables
Se refiere a todo aquello que se puede dibujar. Es la clase de la cual heredan una variedad de
tipos de gráficos, incluyendo BitmapDrawable, ShapeDrawable, PictureDrawable,
LayerDrawable y otros. Hay tres maneras distintas de instanciar una clase Drawable.
 Utilizar una imagen almacenada en el directorio de recursos de nuestro proyecto.
 Utilizar un XML que define las propiedades del objeto para luego poder
recuperarlo mediante getDrawable() y el ID que se le asignó en el XML.
o Utilizando los constructores propios de la clase.
 Lxas librerías android.graphics.drawable y android.view.animation son proporcionadas por
Android para dibujar y animar imágenes y formas 2D.

ShapeDrawable
Se utiliza para realizar realizar gráficos simples en 2D y aplicarles estilos directamente
Desde el código de nuestra aplicación.

Al ser una clase que hereda de Drawable, se puede utilizar en el mismo contexto que ésta. Se
pueden realizar por lo tanto clases View que dibujen formas personalizadas gracias al métdo
onDraw() que incluye la clase ShapeDrawable.

Crear un reporductor mediaplayer


Crear una instancia de MediaPlayer y ejecutar el método start() pasando la referencia al
recurso.
MediaPlayer mp= MediaPlayer.create(getApplicationContext (), R.raw.bundle);
mp.start();

Reproducir desde stream


 Crear una instancia de MediaPlayer y usar el método setDataSource()wcon la cadena
que contiene el path al sitema local o la URL.
 Utilizar prepare() y después start()en la instancia.

MediaPlayer mp = new MediaPlayer();


mp.setDataSource( PATH_TO_FILE);
mp.prepare();
mp.start();

CARRERAS PROFESIONALES CIBERTEC


DESARROLLO DE APLICACIONES MÓVILES I 155

Grabar audio y video


Para ello se utiliza la clase MediaRecorder.

CIBERTEC CARRERA DE ELECTRICIDAD


DESARROLLO DE APLICACIONES MÓVILES I 156

Publicación de software

Para publicar nuestras aplicaciones primero tenemos que empaquetarlas. Antes de


empaquetar debemos preparar el código y comprobar que todo esté correcto:

 Nombre de la aplicación, icono y versión.


 Deshabilitar debugging en el AndroidManifest.xml (atributo
android:debuggable="false" del tag de application).
 Eliminar cualquier mensaje de Log.
 Pedir sólo los permisos que de verdad la aplicación use, y no más de los
necesarios. • Por supuesto, haber probado la aplicación en terminales reales, a
ser posible en más de uno.

Antes de comenzar con nuestra publicación debemos aprender como funciona la


herramienta de control de aplicaciones de google denominado “google play”

Google Play Services


Es una aplicación del sistema de Android que nos permitirá tener el resto de
aplicaciones de nuestro terminal siempre actualizadas, ya que se encargará de
comprobar que todas las apps instaladas están en la última versión disponible.

Las funciones principales de Google Play Services son la autentificación de servicios


de Google, la sincronización de contactos, el acceso a la última configuración de
privacidad del usuario, y los servicios basados en la ubicación de mayor calidad y
menor potencia.

CARRERAS PROFESIONALES CIBERTEC


DESARROLLO DE APLICACIONES MÓVILES I 157

Modo de control de licencias por google play

Una vez publicado la aplicación la licencia se valida con la librería de google play
cliente y este se comunica con el servidor de google

Firmar la aplicación android


Para firmar la aplicación debes dar realizar el siguiente procedimiento

Prepara tu APK
 Cuando estés listo para realizar cambios en el APK, asegúrate de actualizar
también el Código de versión de la aplicación para que los usuarios existentes
reciban la actualización.

 Utiliza la siguiente lista de verificación para asegurarte de que el nuevo APK


esté listo para actualizar a los usuarios existentes:

 El nombre de paquete del archivo APK actualizado debe ser el mismo que el
de la versión actual.

 El código de versión debe ser superior al código de la versión actual. Obtén


más información sobre cómo crear versiones de tu aplicación.

La firma del archivo APK actualizado debe coincidir con la firma de la versión actual.
Para comprobar que el archivo APK utiliza la misma certificación que la versión
anterior, puedes ejecutar el siguiente comando en ambos archivos APK y comparar los
resultados:

$ keytool -genkey -v -keystore nombredenuestrakeystore.keystore


-alias aliasdenuestrakeystore -keyalg RSA -keysize 2048 -validity 10000

Si los resultados son idénticos, significa que estás utilizando la misma clave y que
puedes continuar. Si los resultados son diferentes, tendrás que volver a firmar el
archivo APK con la clave correcta.

CIBERTEC CARRERA DE ELECTRICIDAD


DESARROLLO DE APLICACIONES MÓVILES I 158

Publicar Aplicaciones
1. Ingresar a tu cuenta de Gmail
2. Ingresar a la consola de publicaciones de google play
 https://play.google.com/apps/publish/

1. Agregar un nombre
2. Dar click en Preparar Ficha de play store
 https://play.google.com/apps/publish/

3. Ubicar clave de API pública

CARRERAS PROFESIONALES CIBERTEC


DESARROLLO DE APLICACIONES MÓVILES I 159

VII. BIBLIOGRAFÍA DEL CURSO

Básica

GIRONÉS, Jesús Tomas


2013 El gran libro de Android 3era Edición.
México: Alfa y Omega.

GARGENTA, Marko
2011 Learning Android (245 pages)
United States of America: O’Reilly Media, Inc.

HODSON, Ryan
2014 Android Programming Succinctle.
United States of America: Syncfusion Inc.

THOMAS, Erl
2010 Service Oriented Architecture: A field Guide to integrating XML and Web
Services.
United States of America Canada: Prentice Hall

SMYTH, Neil
2014 Android 4.4 App Development Essentials (47 pages). Lean Publishing

Bibliografía Electrónica

SATYA, Komatineni y MACLEAN, Dave


2012 Expert Android. (Consulta: 22 de enero 2015)
United States of America: Apress Inc.
Recuperado de:
http://androidbook.com/akc/display?url=ShowAttachmentsIMPURL&reportId=442
3&downerUserId=satya&order_by_format=name

ANDROID Developer
2014 Sitio web oficial de desarrollo Android. (Consulta: 27 de Diciembre
2014)(http://developer.android.com/index.html)

LÓPEZ, Victoria
2010 Introducción a Android (117 páginas). (Consulta: 25 de enero 2015)
España: Grupo Tecnología CM (Universidad Complutense de Madrid)
Recuperado de:
http://pendientedemigracion.ucm.es/info/tecnomovil/documentos/android.pdf

Complementaría

MENG LEE, Wei


2013 Android Application Development Cookbook (385 pages).
Indianápolis, Indiana EEUU: John Wiley & Sons, Inc.

MENG LEE, Wei


2012 Beginning Android™ 4 Application Development.
United States of America: John Wiley & Sons, Inc.

APRESS AND Commonsware

CIBERTEC CARRERA DE ELECTRICIDAD


DESARROLLO DE APLICACIONES MÓVILES I 160

2010 Beginning Android 4.


United States of America: Apress Inc.

GARGENTA, Marco
2011 Learning Android Building applications for be Android Market.
United States of America: O’Reilly Media, Inc

RETO, Meir RETO (2012).


2012 Android™ 4 Application Development.
United States of America - Indianapolis, Indiana: John Wiley & Sons, Inc.

CARRERAS PROFESIONALES CIBERTEC

Vous aimerez peut-être aussi