Académique Documents
Professionnel Documents
Culture Documents
APLICACIONES
MVILES I
DESARROLLO DE APLICACIONES MVILES I 2
ndice
Presentacin 05
Red de contenidos 07
UNIDAD 1. ANDROID: INTRODUCCIN A LA PLATAFORMA 09
1.1 Plataforma Android 09
1.1.1 Introduccin a Android, versiones 11
1.1.2 Caractersticas y Arquitectura Android. 13
1.1.3 Mquina virtual Dalvik Virtual Machine y ART 15
1.1.4 Open Handset Alliance 17
1.1.5 Creacin de emuladores 17
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
Presentacin
El Taller de Desarrollo de Aplicaciones Mviles I es un curso que pertenece a la
lnea de programacin y desarrollo de aplicaciones siendo un curso de especialidad
slo en la carrera de Computacin e Informtica. Permite al alumno iniciarse en la
programacin de dispositivos mviles bajo el entorno Android Studio que ha sido
optimizado para dispositivos mviles con sistema operativo Android.
Red de contenidos
Persistencia
de datos en Servicios
Android
UNIDAD
1
Introduccin a la plataforma
LOGRO DE LA UNIDAD DE APRENDIZAJE
Al trmino de la unidad, el alumno elabora aplicaciones haciendo uso del entorno de
desarrollo Android Studio.
TEMARIO
ACTIVIDADES PROPUESTAS
Android es un sistema operativo mvil basado en el kernel 2.6 de Linux Android fue
desarrollado para dispositivos mviles, tabletas,
relojes, televisores automviles, actualmente es uno
de los sistemas operativos ms utilizados en el
planeta. Inicialmente fue desarrollado por Andy Rubin
figura 1, quien funda la compaa Android inc en
estados unidos en Palo Alto, posterior a ello google
adquiere completamente la compaa en el ao 2005
posterior a ello se crea en grupo de empresas
asociadas que patrocina Android como plataforma
libre para dispositivos mviles y otros.
Android est basado en capas que permiten administrar las funciones bsicas de
cualquier equipo mvil, en primer lugar tiene aplicaciones estndares como
administrador de contactos, administrador de aplicaciones administrador de drivers,
administrador de mensajes, administrador de archivos, lbum de fotos, administrador
de llamadas configuracin todo controlado desde tu cuenta de Gmail google; para
cualquier instalacin de aplicacin se debe realizar por medio de google play. Debajo
de ello se encuentran las libreras nativas para acceso a bases de datos,
administracin de recursos, drivers de audio, administrador de sistema, webkit
navegador web nativo, etc. Por el lado de la mquina virtual se encuentra Virtual
Dalvik y Art que es una de las mejoras que fueron creadas en octubre del ao 2014,
despus de ello se tiene el kernel del sistema operativo tal como se puede apreciar en
el grfico que se presenta a continuacin.
Por otro lado cualquier aplicacin se debe instalar por medio de Google Play, sin
embargo se puede instalar una aplicacin configurando instalar aplicaciones de
fuentes no seguras. Por otro lado la plataforma Android tiene una gran cantidad de
aplicaciones con ms de 700 mil aplicaciones que se pueden descargar, muchas de
ellas gratuitas.
Competidores comunes
Apple
o iPhone OS
RIM
o Blackberry
Microsoft
o Windows Mobile 6.5 Phone 7 Series
Symbian Foundation
o Symbian OS
Palm
o WebOS
DVM sacrifica la portabilidad que caracteriza a Java para poder crear aplicaciones con
un mejor rendimiento y menor consumo de energa, estas dos caractersticas son
extremadamente importantes en dispositivos mviles, debido a que la capacidad de
las bateras en estos dispositivos es limitada.
DVM est optimizada para requerir poca memoria y est diseada para permitir
ejecutar varias instancias de la mquina virtual simultneamente, delegando en
el sistema operativo subyacente el soporte de aislamiento de procesos, gestin de
memoria e hilos.
A menudo Dalvik es nombrada como una mquina virtual Java, pero esto no es
estrictamente correcto, ya que el bytecode con el que opera no es Java bytecode. Sin
Fuente: http://es.wikipedia.org/wiki/Dalvik
Esta mquina virtual permite que las aplicaciones se compilen en cdigo nativo, lo cual
ayuda a que las aplicaciones se carguen ms rpido y que traiga el soporte de
procesadores de 64 bits. Google dice que con ART se estima que el desempeo
mejore cuatro veces.
Fuente: http://www.cnet.com/es/analisis/google-android-5-0-lollipop/
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 generacin de cdigo para los
desarrolladores de android esta disponible para plataforma windows, MAC O/S y linux.
Donde
A: Archivos del proyecto
B: Diseo de pantalla en XML
C: Vistas de Text (XML) y Design (Diseo).
Dnde:
A: Cuadro de controles
B: Diseo de pantalla (Layout)
C: Vista esquema de controles
D: Vista propiedades de controles.
Hasta aqu nos quedamos con el ejercicio de crear la primera aplicacin en Android
Studio (Semana 01 Controles), a continuacin vamos a revisar los principales
Los controles ms bsicos que tenemos en Android son sin duda Burton, Edites y
textview los cuales nos permitirn crear una aplicacin bsica como por ejemplo un
login o un mantenimiento de datos. En esta primera parte vamos a revisar en forma
preliminar los controles bsicos que muestran lo siguiente:
Edites.- es un control que permite ingresar datos est sujeto a aplicarle estilos
(Patrones) para mejorar el uso del mismo.
Para ms detalles de los atributos y/o mtodos puedes visitar la pgina oficial
de Android ingresando a:
http://developer.android.com/reference/android/widget/EditText.html
Para ms detalles de los atributos y/o mtodos puedes visitar la pgina oficial
de Android ingresando a:
http://developer.android.com/reference/android/widget/Button.html
1
1
2
2
2
<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
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="Contrasea"
android:id="@+id/textView3" />
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="textPassword"
android:ems="10"
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>
La depuracin es una facilidad del IDE de Android Studio con el objetivo de hacer
seguimiento al cdigo fuente y verificar algn error no esperado, limpiar el programa,
etc. Segn Wikipedia la definicin de depuracin de programas es el proceso de
identificar y corregir errores de programacin. En ingls se le conoce como debugging,
es que se asemeja a la eliminacin de bichos (bugs), manera en que se conoce
informalmente a los errores de programacin. Se dice que el trmino bug proviene de
la poca de los ordenadores de vlvula termoinica, en los cuales los problemas se
generaban por los insectos que eran atrados por las luces y estropeaban el equipo.
Resumen
1. El sistema operativo Android est basado en el ncleo del sistema operativo
Android 2.6 y su creador es Andy Ruby.
2. Android es uno de los mejores sistemas operativos para dispositivos mviles por
excelencia.
Puede revisar los siguientes enlaces para ampliar los conceptos vistos en esta unidad:
UNIDAD
2
ANDROID: COMPONENTES
LOGRO DE LA UNIDAD DE APRENDIZAJE
Al trmino de la unidad, el alumno elabora aplicaciones que integran Activities,
componentes visuales, Intents y recursos externos pertenecientes a la plataforma
Android.
TEMARIO
ACTIVIDADES PROPUESTAS
proyecto a Project.
Carpeta /app/src/main/java
Esta carpeta contendr todo el cdigo fuente de la aplicacin, clases auxiliares, etc.
Inicialmente, Android Studio crear por nosotros el cdigo bsico de la pantalla
(actividad o activity) principal de la aplicacin, que recordemos que en nuestro caso
era MainActivity, y siempre bajo la estructura del paquete java definido durante la
creacin del proyecto.
Carpeta /app/src/main/res/
Contiene todos los ficheros de recursos necesarios para el proyecto: imgenes,
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 slo
las que se necesiten. Iremos viendo durante el curso qu tipo de elementos se pueden
incluir en cada una de ellas y cmo se utilizan.
Como ejemplo, para un proyecto nuevo Android como el que hemos creado,
tendremos por defecto los siguientes recursos para la aplicacin:
Carpeta Descripcin
Contiene las imgenes [y otros elementos grficos] usados en por la
aplicacin. Para poder definir diferentes recursos dependiendo de la
resolucin 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 definicin XML de las diferentes pantallas de la
interfaz grfica. Para definir distintos layouts dependiendo de la orientacin
/res/layout/ del dispositivo se puede dividir tambin en subcarpetas:
/layout (vertical)
/layout-land (horizontal)
/res/anim/
Contienen la definicin de las animaciones utilizadas por la aplicacin.
/res/animator/
/res/color/ Contiene ficheros XML de definicin de colores segn estado.
/res/menu/ Contiene la definicin XML de los mens de la aplicacin.
/res/xml/ Contiene otros ficheros XML de datos utilizados por la aplicacin.
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 aplicacin, como por
/res/values/ ejemplo cadenas de texto (strings.xml), estilos (styles.xml), colores
(colors.xml), arrays de valores (arrays.xml), tamaos (dimens.xml), etc.
Otro de los recursos creados por defecto cabe destacar los layouts, en nuestro caso
slo tendremos por ahora el llamado activity_main.xml, que contiene la definicin de
la interfaz grfica de la pantalla principal de la aplicacin. Si hacemos doble clic sobre
este fichero Android Studio nos mostrar esta interfaz en su editor grfico, y como
podremos comprobar, en principio contiene los controles que agregamos en el primer
ejercicio:
Pulsando sobre las pestaas inferiores Design y Text podremos alternar entre el
editor grfico (tipo arrastrar-y-soltar), mostrado en la imagen anterior, y el editor
XML que se muestra en la imagen siguiente:
Fichero /app/src/main/AndroidManifest.xml
Fichero /app/build.gradle
Contiene informacin necesaria para la compilacin del proyecto, por ejemplo la
versin del SDK de Android utilizada para compilar, la mnima versin de Android que
soportar la aplicacin, referencias a las libreras externas utilizadas, etc. Ms
adelante veremos tambin ms detalles de este fichero.
Carpeta /app/libs
Puede contener las libreras Java externas (ficheros .jar) que utilice nuestra aplicacin.
Normalmente haremos referencia a dichas libreras en el fichero build.gradle descrito
en el punto anterior, de forma que entren en el proceso de compilacin de nuestra
aplicacin. Veremos algn ejemplo ms adelante.
Carpeta /app/build/
Contiene una serie de elementos de cdigo generados automticamente al compilar el
proyecto. Cada vez que compilamos nuestro proyecto, la maquinaria de compilacin
de Android genera por nosotros una serie de ficheros fuente Java dirigidos, entre otras
muchas cosas, al control de los recursos de la aplicacin.Importante: dado que estos
ficheros se generan automticamente tras cada compilacin del proyecto es
importante que no se modifiquen manualmente bajo ninguna circunstancia.
Vista Android
El siguiente grfico presenta un proyecto creado en Android Studio en la vista Android
Qu es un Gradle?
Estas son algunas de sus caractersticas que hicieron elegir Gradle al equipo de
Android:
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 los siguientes trminos:
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 informacin especfica 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 ms rpidamente. 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 funcin es contener y
controlar la lista de views y de otros viewgroups. Los viewgroups te permiten aadir
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 ms comunes de los layouts de pantalla. Los
layouts proporcionan una manera de construir una estructura para una lista de views.
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 funcin de su
posicionamiento en la pantalla y se describen a continuacin algunos de ellos:
FrameLayout
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 unos tras otros todos sus elementos hijos de forma horizontal o vertical
segn 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
parmetro 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>
Esta propiedad nos va a permitir dar a los elementos contenidos en el layout unas
dimensiones proporcionales entre ellas. Esto es ms difcil 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 adems el segundo sea el doble (relacin
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 verstil 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 posicin 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 compondrn la tabla (objetos TableRow), y dentro de cada fila
las columnas necesarias, con la salvedad de que no existe ningn 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 nmero final de filas de la tabla se
corresponder con el nmero de elementos TableRowinsertados, y el nmero total de
columnas quedar determinado por el nmero de componentes de la fila que ms
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
ayudarn a modificar este comportamiento:
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=*).
<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 posicin 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
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 botn Btn Aceptar 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), adems 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 sinfn de
propiedades para colocar cada control justo donde queramos. Veamos las principales
[creo que sus propios nombres explican perfectamente la funcin de cada una]:
Posicin 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.
Posicin 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.
Otros elementos comunes que extienden a ViewGroup, como por ejemplo las vistas de
tipo lista (ListView), de tipo grid (GridView), y en pestaas (TabHost/TabWidget).
Widgets
Un widget es el conjunto de componentes visuales que permite crear las aplicaciones
en Android. Entre dichos componentes tenemos Button, TextView, EditText y el
package donde se importa todos los controles, que es android.widget.
Botones (Button)
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 ms tarde en nuestro cdigo. Vemos que el
identificador lo escribimos precedido de @+id/. Esto tendr como efecto que al
compilarse el proyecto se genere automticamente 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 ajustarn al contenido del mismo, o bien fill_parent para indicar que el ancho o el
alto del control se ajustarn al ancho o alto del layout contenedor respectivamente.
android:layout_margin
Este parmetro indica el espacio entre el control (en este caso botn) y su padre en
este caso el Layout.
android:padding
Este parmetro indica el espacio entre Texto o Imgenes que pongamos dentro del
control (en este caso el botn) y el propio control.
android:gravity
Esta es la gravedad del control, la verdad es que es una forma original de poner la
alineacin, si entre las comillas de este parmetro pulsamos la famosa combinacin de
teclas Control+Espacio, eclipse nos dar todos los parmetros que podemos usar
aqu, si ponemos solo "center" se centrara su contenido tanto vertical como horizontal.
android:drawable
Con este parmetro pondremos una imagen al botn, que no es lo mismo que el
ImageButton, que todo el botn es en s una imagen, con esto ponemos una especie
de icono dentro del botn, por ejemplo si queremos poner el tpico Play, Stop las
flechas de avance o retroceso... existen variantes de este parmetro para poner la
imagen a la derecha o izquierda, arriba o abajo.
android:Text
Con este parmetro definimos el texto del botn, podemos usar un recurso R usando
"@String/texto o directamente un texto entre comillas.
android:TextSize
Indicamos un tamao, si no ponemos esto, se selecciona un tamao por defecto
standard, si te parece grande o pequeo ve probando usando la unidad dp que vimos
en el tema anterior.
android:backgroud
Con este parmetro definimos el color de fondo del Botn.
android:OnClick
Esta es una propiedad que nos ayuda con el Listener, al final de la leccin hablo de
esto, que es la parte Java del Botn, esto nos facilita la vida, lo malo es que solo se
puede utilizar a partir de la API 6 de Android, no creo que vayas a hacer un proyecto
con esta API yo uso esta opcin, es menos lioso.
EditText
EditText (caja de edicin de texto) es un cuadro de texto para ingresar datos en
Android este control tiene patrones definidos para permitir el ingreso de informacin
correcta segn el tipo de ingreso definido.
android:hint. Con este parmetro pondremos un texto por defecto mientras el campo
este vaco, es decir, l lo que ve el usuario antes de que el escriba nada.
android:inputType. Con este parmetro indicamos el tipo de teclado que quieres que
aparezca cuando pulsas sobre el campo, si por ejemplo solo vamos a introducir
nmeros, se puede indicar que aparezca un teclado numrico. Como siempre cuando
te coloques entre las comillas pulsa Control+Espacio para ver las opciones que
puedes poner para este parmetro.
Actitivity (Actividad)
Un Activity (actividad) es una clase que permite manejar los eventos de cualquier
aplicacin desarrollada en Android, est diseada para controlar toda la funcionalidad
de cualquier aplicacin, Podemos decir que todas las pantallas de una aplicacin son
una activity. Ms adelante vamos a ver que existen algunas variaciones, por ejemplo,
que si una aplicacin tiene cinco pantallas, tiene 5 Actividades o activities.
Las activities estn conformadas por dos partes: la parte lgica y la parte grfica. La
parte lgica es una archivo .java que es la clase que se crea para poder manipular,
interactuar y colocar el cdigo de esa actividad. Toda actividad debe tener asociado
una pantalla La parte grfica 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 diseo de una aplicacin en Android se hace similar a una pgina web; XML es
un primo de HTML.
Resumiendo, una actividad est conformada por la parte lgica (un archivo Java) y la
parte grfica (un archivo XML). Profundizando ms 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 mtodos asignados.
Que es la que hace el trabajo de enlazar la parte lgica con la parte grfica. 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 explicacin: 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 lnea que dice "SetContentView" debe llevar
dentro algo parecido a esto: "setContentView"(R.layout.ventanaprincipal).
Ms adelante vamos a ver como agregar una actividad nueva, ya que adems de esto
necesitamos hacer otras cosas en el proyecto. Espero por ahora que quede claro el
trmino de Activity que vamos a estar utilizando.
Android usa los intent como mecanismo para invocar componentes, los intents son
bastante fciles de comprender. Bsicamente nos permiten llamar a aplicaciones
externas a la nuestra, lanzar eventos a los que otras aplicaciones puedan responder,
lanzar alarmas etc.
activity.startActivity(intent);
}
public static void AbrirVentanaLlamada(Activity activity){
Intent intent = new Intent(Intent.ACTION_DIAL);
activity.startActivity(intent);
}
El objetivo de soportar mltiples pantallas es crear una aplicacin 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 informacin acerca de cmo Android se adapta a su
aplicacin a las configuraciones de pantalla y cmo se puede personalizar el aspecto
3. No utilice AbsoluteLayout
A diferencia de los widgets de otros diseos, AbsoluteLayout refuerza el uso de
posiciones fijas para exponer sus vistas, lo que pueden llevar fcilmente 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).
En su lugar, debe utilizar RelativeLayout , que utiliza posicionamiento relativo. Por
ejemplo, puede especificar que un widget de botn debe aparecer "a la derecha de" un
widget de texto.
Antes de publicar su aplicacin, usted debe probarlo a fondo en todos los tamaos de
pantalla admitidos y densidades. El SDK de Android incluye un emulador que puede
utilizar, que replican los tamaos y densidades de configuraciones de pantalla
comunes en los que su aplicacin es probable que se ejecute. Tambin se puede
modificar el tamao predeterminado, la densidad y resolucin del emulador para
reproducir las caractersticas de cualquier pantalla especfica. El uso del emulador y
las configuraciones personalizadas adicionales le permite probar cualquier
configuracin de pantalla posible, por lo que no tiene que comprar varios dispositivos
slo 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 tamaos
de pantalla y densidades que desean. Para ello, puede utilizar el Administrador de
AVD para crear las AVDS y lanzarlos con una interfaz grfica.
La orientacin, se puede configurar dentro por medio de cdigo XML como se aprecia
en la siguiente imagen
Existe la posibilidad de evitar este comportamiento por defecto de Android frente a los
cambios dinmicos de configuracin, simplemente aadiendo en el Manifest a la
activity la opcin
android:configChanges="orientation|keyboardHidden"
Importante! Para que esta tcnica funcione si usamos para nuestra app un target
superior a Gingerbread (API 10) , solo funciona en las versiones superiores :
android:configChanges="orientation|keyboardHidden|screenSize"
Dilogos Y Notificaciones
Notificaciones Toast
ellas. Debido a que un Toast se crea mediante un servicio en segundo plano, puede
aparecer aunque la aplicacin no est visible.
A lo largo de todas las entradas sobre Android, se ha usado mucho este tipo de
notificaciones:
Sintaxis
Toast.makeText(context, text, duration).show();
Duration: es el tiempo de duracin 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:
<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>
R.layout.toast_layout
,(ViewGroup) findViewById(R.id.toastLayout));
NotificationManager mNotificationManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
//Agregando sonido
notification.defaults |= Notification.DEFAULT_SOUND;
//Agregando vibracin
notification.defaults |= Notification.DEFAULT_VIBRATE;
mNotificationManager.notify(HELLO_ID, notification);
El resultado es el siguiente:
Al igual que los Toast, se puede crear un layout personalizado, para ms informacin
visita:
http://developer.android.com/guide/topics/ui/notifiers/notifications.html
Dilogos
Los cuadros de dialogo personalizado permiten realizar operaciones como
confirmacin o ingresar algn dato en una ventana de dialogo existen varios tipos
entre ellos tenemos:
AlertDialog
ProgressDialog
DatePickerDialog
TimePickerDialog
Ejemplo de AlertDialog
Mostrar una ventana de dialogo que preguntar si queremos salir de la aplicacin
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();
Ejemplo es ProgressDialog
Cuadro de dialogo que nunca termina.
ProgressDialog.show(
NotificacionesActivity.this
,"ProgressDialog"
,"Ejemplo dilogo de progreso"
,true
,true);
Diseo dilogos
La clase principal que se usa para crear dilogos 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 dilogo que puede mostrar un ttulo, un mximo de tres botones, una
lista de tems o un layout personalizado.
DatePickerDialog o TimePickerDialog: Un dilogo con una interfaz predefinida que
permite al usuario seleccionar una fecha o una hora.
proporciona todos los controles que necesitamos para crear un dilogo y modificar su
apariencia. La clase DialogFragment fue introducida en Android 3.0 (API 11), si usas
una versin ms antigua, podrs usar la clase DialogFragment, para ver ms detalles
ingresar al siguiente link: http://developer.android.com/tools/support-library/index.html
El cdigo es el siguiente:
La funcionalidad en ejecucin
MENS
Los mens en las aplicaciones son algo que encontramos frecuentemente, de hecho,
casi todos los terminales Android tienen un botn especfico para desplegarlos.
Se dispone de distintos tipo de mens:
Options Menu
El men tpico, que se despliega al pulsar la tecla men, que se divide en dos grupos:
Icon men
Muestra un men con iconos, 6 elementos como mximo.
Expanded Menu
Se usa cuando hay ms de 6 elementos, mostrando un elemento con la palabra Ms.
Options Menu
Lo ms simple y sencillo es definir los mens en XML, colocado en ./res/menu, para
este ejemplo se ha definido el siguiente men, 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 aplicacin">
<men 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"/>
</men>
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.ejemplo_menu, menu);
return true;
}
Ahora, tenemos que responder a las acciones del usuario cuando pulse algn
elemento de nuestro men, para ello vamos a sobrescribir el
mtodo 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 mens contextuales son similares a los mens mostrados al hacer click con el
botn derecho de un ratn en un PC, para crearlos, debemos sobrescribir el
mtodo 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, men);
}
Al igual que en los options men, 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 Mens App"
,Toast.LENGTH_LONG)
.show();
return true;
case R.id.Salir:
finish();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
Pero este men contextual no se va a mostrar, ya que tenemos que asociarlo para que
se lance al realizar una pulsacin prolongada sobre una view, en este caso un botn:
UNIDAD
3
PERSISTENCIA DE DATOS EN
ANDROID
LOGRO DE LA UNIDAD DE APRENDIZAJE
Al trmino de la unidad, el alumno elabora aplicaciones que manejan recursos,
archivos XML, y manejan bases de datos SQLite.
TEMARIO
Android al igual que otros sistemas operativos maneja un sistema de archivos basado
en el ncleo 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
aplicacin, adems de ello se debe especificar el espacio de almacenamiento que se
tendr en la aplicacin cuando se crea una mquina virtual en los dispositivos de
prueba. A continuacin se presenta un ejemplo de configuracin de espacio de
almacenamiento que se debe realizar al momento de configurar la mquina virtual.
Memoria Interna
Android permite leer y escribir datos en ficheros de la memoria interna a travs de los
mtodos habituales para trabajar con ficheros en Java. Tambin nos permite hacer
uso del directorio de cache para tales usos, pero hay que ser precavidos ya que el
chache tendremos que manejarla nosotros y abusar mucho de este directorio puede
ralentizar nuestra aplicacin.
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 aplicacin 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.
Entre las clases ms conocidas para manejar archivos tenemos las siguientes clases:
Para almacenar informacin 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 pblicos 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 grfico:
Shared Preferences
getPreferences( )
Desde dentro de su actividad, a las preferencias especficas de la actividad de
acceso
getSharedPreferences( )
Desde dentro de su actividad para acceder a las preferencias a nivel de
aplicacin
getDefaultSharedPreferences( )
En PreferencesManager, para obtener las preferencias compartidas que
funcionan en concierto con el marco de la preferencia general de Android
Creando carpetas
El siguiente ejemplo muestra cmo crear una carpeta llamada miBkApp en la carpeta
de almacenamiento externo
Para el siguiente ejemplo vamos a continuar con nuestro proyecto inicial creado, para
ello vamos a agregar un botn nuevo que tenga de ttulo grabar archivo y de nombre
tendr BtnGrabarArchivo
Environment
Representa las variables del entorno, tiene propiedades comunes para toda la
aplicacin
Tiene propiedades comunes que utilizaremos para tener las rutas hacia a la carpeta de
nuestro celular, carpeta de imgenes, recursos, carpeta de SD externo o la carpeta
Root del sistema operativo entre otros.
El siguiente grafico muestra los atributos ms comunes de esta clase.
Public Mtodo/Funcin
Methods
getDataDirectory()
static File Recupera la carpeta de datos del usuario 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.
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 despus de ver SQLite que se ver en el
siguiente tema.
Introduccin a SQLite
Caractersticas principales
"/data/data/packake/nombrebasedatos.db"
String StrRutaBaseDatos="/data/data/sise.app.BaseDatos/Contacto.db";
SQLiteDatabaseodb=SQLiteDatabase.openDatabase(StrRutaBaseDatos,
null,SQLiteDatabase.CREATE_IF_NECESSARY);
Tipos de datos
Integer
Valor entero, almacena1, 2, 3, 4, 6, o 8 bytes depende de la magnitud del campo.
Real
Valoresnmericosdecimales8-byte punto flotante.
Text
Se almacena cadena en cdigo (UTF-8, UTF-16BE or UTF-16LE).
Para ms detalles y otros tipos de datos puedes ir al portal oficional de tipos de datos:
http://www.sqlite.org/datatype3.html
Mtodos principales
execSQL
Ejecuta una sentencia SQL de creacin de datos create, drop, etc.
Ejemplo:
Otros Ejemplos:
Importante!
SQLITE usa un campo ivisiblellamadoROWID que identifica como nico registro la fila.
En el ejemplo se usa Cdigo como un campo similar
RawQuery(SentenciaSQL, ParametrosArreglo)
Esta funcin permite recuperar un cursor (tabla) con el fin de cargar los datos en un
adaptador para presentarlo en un contenedor como un listview.
Ejemplo:
Ejemplo de rwaquery:
La clase ContentValues
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();
Ejecuta la sentencia SQL insert para agregar un nuevo registro en la base de datos
Sintaxis
Insert (table, nullColumnHack, values)
Dnde:
Table.- Nombre de tabla
nullColumnHack.- indica que campos tienen soporte a nulos
Values.- Lista de campos con valores a insertar
Ejemplo:
Sintaxis
update(table, values, whereClause, whereArgs)
Dnde:
Table.- Nombre de tabla
Values.- Lista de campos con valores a insertar
Ejemplo:
Sintaxis
delete(table, whereClause, whereArgs)
Dnde:
Table.- Nombre de tabla
whereClause.- Parmetros para actualizar e registro en modificacin
whereArgs.- Valores par los campos de parmetros
Ejemplo:
La clase Cursor
Ejemplo:
Mtodos
getColumnCount().- Permite saber el nmero 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 nmero de registros existentes en el cursor.
getDouble(columnIndex).- permite leer el valor de un campo nmero con decimales
de tipo doubl.
Para aquellos que no estn familiarizados con el MVC, ste es un patrn que divide la
aplicacin en tres niveles distintos, interfaz grfica (Vista), tratamiento de datos
(Modelo) lgica de negocio (Controlador). Esto se hace para permitir una mayor
portabilidad de una aplicacin, e incluso facilitar su mantenimiento. Por ejemplo si
deseamos modificar la interfaz de la aplicacin es decir solo pantallas slo
prestaremos atencin a la capa de la Vista, y si queremos modificar de sistema de
almacenamiento de datos slo tendremos que prestar atencin a la capa del Modelo, y
si lo que queremos es portar la aplicacin a otra plataforma lo que haremos ser
modificar la capa del Controlador, al igual que si queremos modificar el cdigo para
optimizar rendimiento.
Interfaz Grafica
(Vista(
Activity
Controlador
Aplication
Controlador
SQLite
Modelo
Debemos crear una nueva clase. Le damos al botn 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 funcin. Es una buena prctica 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:
Se debe realizar este paso para configurar que nuestra nueva clase ser la que llama
a todos los activitys a partir de ahora
Antes estaba as
clase Application. Sin embargo para poder hacer uso de los mtodos que definamos
en nuestra clase vamos a tener que hacer una conversin al tipo de la clase que
nosotros hemos definido como Application, y a partir de ah podremos hacer la llamada
a los mtodos que contenga la clase. Para que quede ms claro un ejemplo sera:
((MyApplication)getApplication()).metodoDeNuestraClaseApplication();
// Llamada desde la Activity al mtodo de Application
((MyApplication)getApplication()).getNombre()
UNIDAD
4
NETWORKING EN ANDROID
LOGRO DE LA UNIDAD DE APRENDIZAJE
Al trmino de la unidad, el alumno elabora aplicaciones que se conectan a la web
utilizando http y consumen servicios web.
TEMARIO
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 informacin mediante la web. Segn la W3c lo
define como Un Servicio Web (Web Service [WS]) es una aplicacin 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 interaccin entre "agentes software (aplicaciones) utilizando mensajes XML
intercambiados mediante protocolos de Internet.
Segn el ejemplo del grfico, un usuario (que juega el papel de cliente dentro de
los Servicios Web), a travs de una aplicacin, solicita informacin sobre un
viaje que desea realizar haciendo una peticin a una agencia de viajes que
ofrece sus servicios a travs de Internet. La agencia de viajes ofrecer a su
cliente (usuario) la informacin requerida. Para proporcionar al cliente la
informacin que necesita, esta agencia de viajes solicita a su vez informacin a
otros recursos (otros Servicios Web) en relacin con el hotel y la compaa
area. La agencia de viajes obtendr informacin de estos recursos, lo que la
convierte a su vez en cliente de esos otros Servicios Web que le van a
proporcionar la informacin solicitada sobre el hotel y la lnea area. Por ltimo,
el usuario realizar el pago del viaje a travs 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 tecnologas que hacen posible
esta circulacin de informacin. Por un lado, estara SOAP (Protocolo Simple de
Acceso a Objetos). Se trata de un protocolo basado en XML, que permite la
interaccin entre varios dispositivos y que tiene la capacidad de transmitir
informacin compleja. Los datos pueden ser transmitidos a travs 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).
Fuente: http://www.w3c.es/Divulgacion/GuiasBreves/ServiciosWeb
Por otro lado, WSDL (Lenguaje de Descripcin 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 travs 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.
Ejemplos
<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-maana</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>
Caso:
Crear un web Service usando Visual Studio 2010
Dnde:
(1) Al dar click e ServiceDescriptin
Muestra la definicin de servicio como mtodos y funcionalidades como
mtodos pblicos parmetros y tipos de datos
</s:element>
</s:schema>
</wsdl:types>
Usando Protocolo SOAP 1.2 el mismo escenario indicado, sin embargo es para
soporte a plataformas complejas como WCF (Windows comuication fudation)
Android no tiene ninguna librera para consumir web Service por ello debemos utilizar
una librera libre llamada ksoap para consumir nuestro web Service. Para utilizar la
librera se debe descargar desde:
https://code.google.com/p/ksoap2-android/
Una vez descargado ponerlo en una carpeta con ruta corta como C:\AndroidDll
SoapObject
Permite realizar crear la conexin al servicio basado en el namespace y el nombre de
mtodo
SoapObject oRequest=new SoapObject(http://tempuri.org/, Sumar);
addProperty
Propiedad de SoapObject para agregar parmetros
oRequest.addProperty("pNumero1",1);
oRequest.addProperty("pNumero2",2);
SoapSerializationEnvelope
Permite inicializar el enlace de datos con el web service, serializar los datos para
iniciar comunicacin.
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 serializacin
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.
Posteriormente se debe seguir los pasos que se indica en la numeracin para agregar
la referencia en el APK
E Android para las llamadas que pueden demorar el proceso de operacin de las
aplicaciones se debe utilizar un hilo de ejecucin por ello debemos revisar la
documentacin de cmo manejar hilos.
Thread (Hilo).- Clase que permite ejecutar algn proceso en segundo plano.
Thread Ejemplo
Dnde:
1.- es el diseo de la pantalla
2.- las variables a nivel de activity
3.- cdigo del mtodo principal del thead
Objetivo
Crear un web Service que permita realizar operaciones de suma y que retire el
resultado.
Activity en Blanco
<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"
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>
Cdigo fuente
Cdigo para el evento click del botn 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;
EditText oedtnumero1=null;
EditText oedtnumero2=null;
TextView oTvResultado=null;
Button obtnSumar=null;
Button obtnCancelar=null;
@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();
}
});
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();
@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);
}
}
UNIDAD
5
Servicios basados en localizacin
LOGRO DE LA UNIDAD DE APRENDIZAJE
Al trmino de la unidad, el alumno elabora aplicaciones que permitan el uso del
servicio basado en localizacin utilizando Google Maps.
TEMARIO
Que es un fragment
Imagen 51
Fuente: http://jarroba.com/
Ciclo de vida
Al igual que las activity un fragmento tiene un ciclo de vida muy parecido, que el
fragmento depende completamente del activity adems de tener caractersticas
adicionales que es muy utilizado en tiempo de ejecucin para alterarlos.
Lista de eventos invocados en el ciclo de vida de un fragment
onPause Al igual que las actividades, onPause se ejecuta cuando se detecta que el
usuario dirigi el foco por fuera del fragmento.
Cdigo de ejemplo:
Esta clase es la encargada de inflar el cdigo Java a travs del mtodo inflate(). Este
recibe como parmetros 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.
Una vez creada la clase y el layout que representa nuestro fragmento debemos
aadirlo a la actividad. Existen dos formas para realizar este proceso.
Veamos un ejemplo:
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
<Button
android:id="@+id/btnBuscar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
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>
package com.appmovil.fragmentexample;
Por el momento, los nicos cambios en esta clase son para aadir algunas directivas
de importacin y reemplazar el mtodo onCreateView () para asegurarse de que el
archivo de diseo se infla y se visualiza cuando se utiliza el fragmento dentro de una
actividad. La declaracin de la clase tambin debe indicar que la clase ampla 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;
@Override
public view onCreateView (LayoutInflater inflado,
Contenedor ViewGroup, Bulto
savedInstanceState) {
vista regresar;
}
}
LocationManager locManager =
(LocationManager)getSystemService(LOCATION_SERVICE);
List<String> listaProviders = locManager.getAllProviders();
Address
Una clase que representa una direccin, es decir, un conjunto de cadenas que
describen una ubicacin.
Criteria
Una clase con indicacin de los criterios de aplicacin para la seleccin de un
proveedor de ubicacin.
Geocoder
Una clase para el manejo de la geo codificacin.
GpsSatellite
Esta clase representa el estado actual de un satlite GPS.
GpsStatus
Esta clase representa el estado actual del motor GPS.
Location
Google Maps
Google Maps es un servidor de aplicaciones de mapas en la web que pertenece a
Google. Ofrece imgenes de mapas desplazables, as como fotografas por satlite del
mundo e incluso la ruta entre diferentes ubicaciones o imgenes 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 tambin de forma gratuita. En 2014, los documentos filtrados por Edward
Snowden revelaron que Google Maps es parte y vctima del entramado de vigilancia
mundial operado por varias agencias de inteligencia occidentales y empresas
tecnolgicas.
Imagen 215
Fuente: http://www.elandroidelibre.com/wp-content/uploads/2011/05/google-maps-navigation.jpg
Para habilitar las apps de google Maps se debe ingresar a la siguiente direccin:
1
Cfr: http://es.wikipedia.org/wiki/Google_Apps
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 aplicacin con los
siguientes comandos 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" />
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());
}
}
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
createMapView();
addMarker();
}
UNIDAD
6
Servicios
LOGRO DE LA UNIDAD DE APRENDIZAJE
Al trmino de la unidad, el alumno elabora aplicaciones desatendidas basadas en
servicios que permitan realizar operaciones como descarga de archivos grandes,
monitorear usuarios basado en geolocalizacin.
TEMARIO
Los servicios son componentes sin interfaz grfica 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 actualizacin 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 algn
momento la interaccin con del usuario. La plataforma de Android tiene una gran
variedad de servicios que ofrece como por ejemplo los alertas cuando la batera esta
baja o por ejemplo cuando llega un mensaje de texto o alertas para acceder a dichos
servicios se puede realizar con la clase Manager. De esta manera, en nuestras
actividades podremos accesar a estos servicios a travs del
mtodo getSystemService().
Por otro lado, si necesitamos utilizar servicios propios, estos deben ir declarados en el
archivo AndroidManifest.xml.
<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 reproduccin de msica"/>
<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"
android:layout_height="wrap_content"
android:text="Detener servicio"/>
</LinearLayout>
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;
}
}
6. Ahora debes crear una nueva carpeta con nombre raw dentro de la carpeta res.
Arrastra a su interior el ficheroaudio.mp3.
UNIDAD
7
Multimedia y publicacin
LOGRO DE LA UNIDAD DE APRENDIZAJE
Al trmino de la unidad, el alumno elabora aplicaciones que permitan el uso del video y
de sus dispositivos visuales y las publicar en GooglePlay.
TEMARIO
Multimedia
AAC LC/LTP
HE-AACv1 (AAC+)
HE-AACv2 (Enhanced ACC+)
AMR-NB
AMR-WB
FLAC
MP3
MIDI
Ogg Vorbis
PCM/Wave
Reproduccin de audio
La reproduccin de contenido multimedia se lleva a cabo por medio de la clase
MediaPlayer. Dicha clase nos permite la reproduccin de archivos multimedia
almacenados como recursos de la aplicacin, 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 aplicacin para poder ser reproducido durante su ejecucin 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 cdigo como R.raw.nombre_Archivo.
Para reproducir un fichero de audio tendremos que seguir una secuencia de pasos.
Tenemos dos opciones. La primera de ellas consiste en crear una instancia de la clase
MediaPlayer por medio del mtodo create(). En este caso se deber pasar como
parmetro, adems del contexto de la aplicacin, el identificador del recurso, tal como
se puede ver en el siguiente ejemplo:
Dentro del cdigo Java podremos acceder a dicho elemento de la manera habitual, es
decir, mediante el mtodo findViewById(). Una vez hecho esto, asignaremos una
fuente que se corresponder con el contenido multimedia a reproducir. El control
VideoView se encargar de la inicializacin del objeto MediaPlayer. Para asignar un
video a reproducir podemos utilizar cualquiera de estos dos mtodos:
Una vez inicializado el control se puede controlar la reproduccin con los mtodos:
start()
stopPlayback()
pause()
seekTo()
Drawables
Se refiere a todo aquello que se puede dibujar. Es la clase de la cual heredan una
variedad de tipos de grficos, 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 libreras android.graphics.drawable y android.view.animation son
proporcionadas por Android para dibujar y animar imgenes y formas 2D.
ShapeDrawable
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 mtodo onDraw() que incluye la clase ShapeDrawable.
Publicacin de software
Una vez publicado la aplicacin la licencia se valida con la librera de google play
cliente y este se comunica con el servidor de google
Prepara tu APK
Cuando ests listo para realizar cambios en el APK, asegrate de actualizar
tambin el Cdigo de versin de la aplicacin para que los usuarios existentes
reciban la actualizacin.
El nombre de paquete del archivo APK actualizado debe ser el mismo que el
de la versin actual.
La firma del archivo APK actualizado debe coincidir con la firma de la versin actual.
Para comprobar que el archivo APK utiliza la misma certificacin que la versin
anterior, puedes ejecutar el siguiente comando en ambos archivos APK y comparar los
resultados:
Si los resultados son idnticos, significa que ests utilizando la misma clave y que
puedes continuar. Si los resultados son diferentes, tendrs que volver a firmar el
archivo APK con la clave correcta.
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/
Bsica
GARGENTA, Marko
2011 Learning Android (245 pages)
United States of America: OReilly 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
Bibliografa Electrnica
ANDROID Developer
2014 Sitio web oficial de desarrollo Android. (Consulta: 27 de Diciembre
2014)(http://developer.android.com/index.html)
LPEZ, Victoria
2010 Introduccin a Android (117 pginas). (Consulta: 25 de enero 2015)
Espaa: Grupo Tecnologa CM (Universidad Complutense de Madrid)
Recuperado de:
http://pendientedemigracion.ucm.es/info/tecnomovil/documentos/android.pdf
Complementara
GARGENTA, Marco
2011 Learning Android Building applications for be Android Market.
United States of America: OReilly Media, Inc.