Está en la página 1de 22

Curso GUGLER

Desarrollo de
aplicaciones
móviles

Parte (a)
Contenido General del curso

Capítulo 1 – Introducción al Mundo Móvil

Capítulo 2 – Elementos de una Aplicación Móvil (Android)

Capítulo 3 – Componentes Visuales y Almacenamiento (Android)

Capítulo 4 – Accediendo al Hardware del Teléfono (Android)

Capítulo 5 – Aplicaciones Móviles Multiplataforma (JQuery Mobile)

Capítulo 6 – Aplicaciones Móviles Multiplataforma (Apache Cordova)

Capítulo 1: Introducción al mundo móvil

Historia del desarrollo móvil

 Antiguamente el desarrollo de aplicaciones móviles se limitaba a aplicaciones mínimas o


portales WAP que se visualizaban en un navegador.
 A finales de los años 90 comienzan a salir los “SmartPhones” o teléfonos inteligentes con
los cuales cambia todo el concepto.
 Sumado a éste hecho aparecen tecnologías de conectividad como EDGE permitiendo
mayor transferencias de datos.
 No obstante, en un principio sólo podían desarrollar aplicaciones los fabricantes y no se
habría el mercado para desarrolladores externos.
 En el año 2007 Apple libera su Iphone el cual plantea una estrategia totalmente nueva.
 El nuevo concepto de Apple Store permitió que desarrolladores independientes pudieran
subir aplicaciones.
 Paralelamente Google compra Android Inc, y lanza a Android como Sistema Operativo
Móvil OpenSource en 2008.
 Comienzan a fabricarse SmartPhones de bajo costo basados en Android.
 Compañías y Aplicaciones utilizan este nuevo concepto.
 Actualmente nos encontramos con aplicaciones móviles para todo tipo de uso.

Sistemas Operativos: Android

 Es un Sistema Operativo basado en el Kernel de Linux.


 Desarrollado por Android Inc. y luego adquirido por Google.
 Utiliza Java principalmente como lenguaje de programación.
 Contiene una máquina virtual llamada Dalvik VM.
Tecnologías que abarca el curso

 Android SDK:
- Kit de desarrollo oficial y multiplataforma de Google.
- Kit de desarrollo oficial y multiplataforma de Google.
- Contiene herramientas como IDEs, depuradores y emuladores.
- Disponibles para Windows, GNU/Linux y Mac OSX.
- Requiere la JDK instalada.
- Contiene además herramientas para descargar y actualizar software.
 Phonegap – Apache Cordova:
- Framework HTML5 multiplataforma.
- Permite desarrollar aplicaciones portables.
- Ofrece acceso al Hardware del teléfono mediante plugins.
- Permite incluso gestionar, emular y empaquetar la aplicación.¡.
- Creado por Adobe y mantenido por Apache Software Foundation.
 JQuery Mobile:
- Framework HTML5 multiplataforma.
- Permite desarrollar aplicaciones portables.
- Ofrece acceso al Hardware del teléfono mediante plugins.
- Permite incluso gestionar, emular y empaquetar la aplicación.
- Creado por Adobe y mantenido por Apache Software Foundation.

Android como Sistema Operativo móvil

¿Qué es Android?:

 Es un conjunto de Software que contiene un Kernel basado en Linux, una interfaz de


usuario, aplicaciones y una API de desarrollo.
 Es un software de código abierto mantenido por Google y por la Open Handset Alliance de
muy fácil adaptabilidad.
 Contiene muchas aplicaciones que podemos invocar, así como también una poderosa API
de desarrollo.
 Se basa en el uso de una Máquina Virtual, DalvikVM creada por Dan Borenstein en
conjunto con ingenieros de Google.
 Su idea principal es facilitar las tareas de desarrollo, ocultando complejidad y abstrayendo
al desarrollador del hardware.

Arquitectura de Android:

 Aplicaciones
- Todas las aplicaciones están desarrolladas en Java.
 Framework de Aplicaciones
- Tenemos acceso completo a la API de desarrollo, usada por las aplicaciones base.
- Está pensado y diseñado para simplificar el uso y reutilización de componentes.
- Permite a una aplicación enviar mensajes y compartir información con otras.
- Permite que el desarrollador inclusive cree componentes o reutilice los existentes.
- Contiene herramientas para gestionar recursos, actividades, noticaciones y otras
características del Sistema Operativo.
 Librerías
- Android incluye un conjunto de librerías escritas en C y C++ para trabajar con
componentes del sistema.
- Utiliza una librería en C al igual que Linux para dialogar con el núcleo.
- Contiene librerías SQLite para almacenar y trabajar con información.
- Contiene OpenGL, una potente librería para desarrollo en 2D y 3D.
- La librería Webkit nos permite visualizar y navegar páginas Web.
 Android Runtime
- Se basa en el uso de una Máquina Virtual, DalvikVM creada por Dan Borenstein en
conjunto con ingenieros de Google.
- Esta máquina virtual ejecuta todas las aplicaciones no nativas de Android.
- A la hora de desarrollar nuestras aplicaciones (código fuente Java) son compiladas a
un formato que es luego interpretado en cualquier otra plataforma android (archivos
.dex) .
- El código binario de Dalvik no es compatible con el bytecoode de Java, sólo se utiliza
Java como lenguaje de programación.
- En Android KitKat 4.4, se cambia DalvikVM se reemplaza por ART Runtime para una
mejor performance y funcionamiento.
 Kernel de Linux
- Android utiliza el mismo kernel de Linux para su simplicidad.
- La idea de ésta arquitectura es la de permitir abstraer al desarrollador del hardware y
de brindar seguridad.
- Justamente por ésto, el concepto de “rootear” un sistema Android consiste en tener
acceso como root o administrador.
- El Kernel se encarga de todas las tareas de gestión de memoria y recursos.

Historia y evolución de Android

Algo de historia

 Google en primera medida financia el desarrollo de Android Inc, a quien luego compra en
2005.
 El 5 de noviembre de 2.007 se forma la Open Handset Alliance, con compañías como
Samsung, Broadcom, Motorola, Intel y LG (entre otros).
 En un principio el desarrollo de Android se continuaba dentro del Kernel de Linux, pero
luego fue removido por motivos de licencias.
Versiones de Android

 Cada versión recibe el nombre de un postre en inglés.


 Comienzan a nomenclarse alfabéticamente.
 Con el pasar del tiempo existieron muchas versiones hasta un gran congelamiento de la
versión 4.x.x
 La próxima versión Android 4.6 “Lime Pie” tiene fecha tentativa de junio / julio del
corriente año.

Elementos básicos de una aplicación

Estructura de una aplicación Android


Activity

 Componente principal de una Aplicación Android, representan clases que permiten


funcionar como controlador en una aplicación MVC.
 Una aplicación Android está formada por varias actividades, una de ellas es la marcada
como “Main” o “Principal”.
 Una actividad puede llamar a otra, esperando o no su respuesta. Al realizar ésta tarea, la
actividad origen se detiene.
 Las actividades se gestionan en un formato de pila, las aplicaciones colocan o eliminan
elementos de la pila según se necesite.

Activity – Definición

Activity – Comunicación
Activity – Ciclo de vida

 Una actividad pasa por N estados durante su ciclo de vida.


 Si deseamos ejecutar alguna acción podemos sobreescribir métodos de nuestra actividad
padre, tales como onCreate(), onStart(), onResume(), onDestroy() u otros.
 Algunos métodos útiles a sobreescribir:

Intent (Intento)

 Es el elemento básico de comunicación entre distintos componentes en Android.


 Son considerados como “mensajes” o “peticiones” que pueden enviarse entre distintos
componentes de una aplicación o entre distintas aplicaciones.
 Es una descripción abstracta de una operación que se va a llevar a cabo.
 Permiten invocar actividades e inclusive pasar información entre las mismas.

Comunicando actividades mediante intentos

 Como vimos anteriormente podemos comunicar actividades mediante intentos:


 Pero también podemos pasar información mediante un objeto de tipo Bundle:

 Para recuperar el objeto de recurso accedemos al método getIntent(), el cual nos devuelve
cual fue el intento que invocó a la actividad actual:

Intentos y criterios

 Podemos asociar a un intento con una acción, datos y una categoría.


 Cada actividad puede declarar que tipo de acciones pueden llevar a cabo y que datos
pueden gestionar.
 Las acciones son cadenas de texto que describen lo que una actividad puede hacer.
 También pueden definirse categorías, en donde se configura desde donde puede lanzarse
la actividad.
 Esto permite que al llamar a una actividad podemos no especificar a cual, sino definir el
criterio sobre el cual se va a invocar.
 En éste caso Android se encarga de determinar a que actividad va a invocar en base a el
criterio definido y automáticamente le pasa datos en el formato que especificamos.
Capítulo 2: Elementos Básicos de una Aplicación Android

Vistas y grupos de vistas

Vista (View) en Android

 Son los elementos base de una UI en Android, están formados por una parte en código
Java y una parte en formato XML.
 Los elementos se estructuran en una jerarquía de árbol de elementos View.
 La clase View es la clase padre de todo componente visual en Android y sirve para todo
Widget.
 Las vistas adoptan diferentes formas y tamaños, y podemos modificar sus atributos en la
medida que lo necesitemos.
 Permiten el manejo de eventos implementando listeners o métodos para ejecutar
acciones.
 Android proporciona un amplio conjunto de objetos View en el paquete android.view.
 Dentro de las vistas se agrupan los Grupos de Vistas – ViewGroup, la cual es una subclase
de View.
 El objetivo de los ViewGroup es el de agrupar elementos de vistas para formar estructuras
de datos visuales complejas.
 Toda subclase de View tiene acceso a sus métodos de clase base, que permiten realizar
operaciones gráficas con la UI.

El método findViewByid()

 Es un método disponible en la clase Activity, y por ende disponible en cualquiera de


nuestras actividades.
 Permite acceder a un objeto View desde una actividad.
 Recibe como parámetro el identificador de la vista a la que deseamos acceder
(comúnmente ubicado en la clase R.java)
 Una vez obtenida la referencia al objeto podemos manipularla y los cambios serán
reflejados inmediatamente.
Método Descripción

setBackgroundColor(int color) Establece el color de fondo.

setBackgroundDraweable(Drawable d) Establece una imagen de fondo.

setMinimunHeight(int minHeight) Establece la altura mínima.

setOnClickListener(OnClickListener l) Establece un Listener para atrapar los


eventos de tipo click.

setOnFocusChangeListener( Establece un Listener para atrapar el evento


OnFocusChangeListener l) de obtener el foco.

Listeners para gestionar eventos

 Son objetos que están “escuchando” o a la espera de que ocurra un evento en particular y
tienen acceso al componente que las invoca.
 Entre los principales eventos tenemos el de presionar una tecla, hacer click, perder o
ganar el foco.
 Para implementarlos debemos implementar una determinada interface.
 Pueden especificarse utilizando clases anónimas.

Listeners – Ejemplo
Componentes de UI

Componentes gráficos simples

 Botones
- Representan el elemento de comunicación básica con el usuario.
- Podemos enlazas acciones utilizando un Listener o definiendo un método y
enlazándolo en nuestro archivo XML mediante el atributo onClick
 TextViews
- Se utilizan para simbolizar etiquetas en una aplicación.
- Por defecto no pueden editarse ni modificarse, para eso utilizaremos EditText.
- El atributo textIsSelectable permite al usuario copiar el contenido de la etiqueta.
- Podemos obtener y establecer su contenido con los métodos getText() y setText().
 EditText
- Es una subclase de EditText que puede ser editable.
- De acuerdo al tipo que definamos, cambia la presentación del teclado para utilizarse.
- Podemos establecer mensajes de validaciones utilizando el método setError().
- Podemos asociar Watchers en la medida que cambia su contenido para realizar
acciones.
- Para gestionar los cambios en el contenido deberemos utilizar una clase que
implemente la interface TextWatcher.
 CheckBox
- Es un componente específico con dos estados (true o false).
- Podemos obtener su estado mediante el método isChecked().
- Podemos establecer su estado mediante el método setChecked().
 Pickers
- Permiten seleccionar valores ya sea de hora o fecha.
- La API provee las clases TimePickerDialog y DatePickerDialog.
- Para implementarlas deberemos crear una subclase de DialogFragment.
- Para implementarlas deberemos crear una subclase de DialogFragment.
- Para invocarlos deberemos invocar a un objeto de dicho tipo.
 DialogFragments
- Se utilizan para representar cuadros de dialogo con opciones.
- Podemos crear dialogos utilizando las clases Builder de Android.
- Otra opcion es crear una subclase de DialogFragment.
 Toast
- Se utiliza para enviar mensajes de tipo notificación al usuario.
- Toma el aspecto nativo de la versión de Android que estemos utilizando.
- Nos permite especificar su duración y contenido.
- Lo invocamos con el método show().
 ListView
- Es un componente de tipo ViewGroup utilizado para crear una lista de items.
- Para instertar datos en la lista se utiliza una clase ListAdapter.
- Posee una subclase llamada ExpandableListview que permite el agrupamiento de
items.
- Primeramente creamos un archivo XML aparte para el componente
- A continuación crearemos una subclase de ListActivity.
- Finalmente escribiremos un Listener para cuando se selecciona un elemento de la
lista.

Mas componentes complejos

Adaptadores

 Son considerados una interface común al modelo de datos que existe por detrás de todos
las herramientas de selección.
 Todas las herramientas de selección acceden a la información a través de un adaptador.
 También son responsables de generar vistas específicas que se mostrarán dentro de la
herramienta de selección.
 La API de Android proporciona algunos adaptadores base, aunque también podemos
desarrollar los nuestros en la medida que lo necesitemos.

Adaptadores – Tipos más comunes

 ArrayAdapter: es el más sencillo y provee de datos a una herramienta de selección a partir


de un Array de objetos de cualquier tipo.
 SimpleAdapter: se utiliza para mapear datos sobre estructuras de datos más complejas
como mapas o listas.
 SimpleCursorAdapter: se utiliza para mapear columnas de un cursor abierto sobre una
base de datos sobre los elementos visuales de una herramienta de selección.
Spinners

 Este componente permite representar una lista desplegable.


 Funcionan en forma similar a los ListView que ya vimos, pero en forma colapsada.
 Permiten una forma simple y rápida de seleccionar un elemento de una lista.
 Al presionar sobre el control, se desplega la lista completa de opciones.
 Primeramente definimos un archivo XML con información para leer.
 A continuación definimos un elemento Spinner en nuestro XML de la actividad.
 Finalmente inicializamos un adaptador y cargamos su contenido.

GridViews

 Presenta un conjunto de valores de opciones seleccionables en forma tabular.


 Es muy útil para representar opciones en filas y columnas.
 Funcionan de forma similar a los componentes ya vistos.
 Primeramente definimos el modelo de datos a utilizar
 A continuación definimos un elemento GridView en nuestro XML de la actividad.
 Finalmente inicializamos un adaptador y cargamos su contenido.

Layouts para gestionar contenido

Layouts

 Cumplen la función de definir una estructura visual para una UI.


 Permiten distribuir los componentes en una distribución determinada.
 Permiten fácil adaptabilidad y cambio en la disposición gráfica.
 Podemos crearlos programáticamente (vía código) o mediante XML.

Linear Layout

 Apila los elementos que lo contienen en forma horizontal o vertical (dependiendo del
parámetro android:orientation).
 Los elementos contenidos pueden establecer sus propiedades android:layout_width y
android:layout_heigth para determinar sus dimensiones dentro del Layout.
 La propiedad android:layout_weight permite a los elementos definir tamaños
proporcionales para completar la UI.

Table layout

 Permite distribuir sus elementos hijos en forma tabular, definiendo filas y columnas.
 La estructura se define en formato similar al HTML, es decir en filas y columnas.
 Para definir las filas utilizaremos objetos de tipo TableRow y dentro de los mismos
insertaremos los elementos de la fila necesarios.
 El número total de columnas de cada fila será representado por la fila que más
componentes contenga.

Relative layout

 Es el layout más flexible de todos, ya que permite especificar la posición de cada


elemento.
 Podemos definir la ubicación de cada componente de forma relativa a su elemento padre
o a cualquier otro elemento.
 De ésta forma podemos al incluir un nuevo elemento indicar que debe colocarse a
continuación de otro componente o en una determinada alineación de su Layout padre.

Absolute layout

 Es una capa donde se utilizan coordenadas X e Y para indicarle donde colocar elementos
dentro del contenedor.
 En cada elemento definimos la posición que ocupará en la pantalla.
 Para ésto utilizamos las propiedades android:layout_x y android:layout_y.
 Este Layout se encuentra deprecado.

Frame layout

 Es considerado el Layout más simple de todos.


 Coloca todos sus controles hijos alineados en la parte superior izquierda de la pantalla,
pero sólo uno es visible.
 Suele utilizarse para mostrar un único control en su interior, por ejemplo una imagen.
 Los componentes incluídos en un FrameLayout podrán establecer sus propiedades
android:layout_width y android:layout_heigth con los valores “fill_parent” o
“wrap_content”

Menúes y menúes contextuales

Menúes

 En Android podemos encontrar 3 tipos de menú:


 Menús Principales: aparecen en la zona inferior de la pantalla al pulsar el botón de “menú”
del teléfono.
 Submenús: son menús secundarios que se pueden mostrar al pulsar sobre una opción del
menú principal.
 Menúes Contextuales: aparecen al presionar una pulsación larga sobre un elemento de la
pantalla.
 Se pueden crear utilizando un archivo XML o programáticamente mediante código Java.
Menúes código JAVA

 Creamos el menú dinámicamente vía código Java en lugar de tomar como base un archivo
XML.

Tomando la opción seleccionada

 Debemos sobreescribir el método onOptionsItemSelected en la actividad donde lo


necesitemos.
 Dicho método recibe como parámetro el elemento del menú pulsado.
Menúes contextuales

 Permiten mostrar un menú luego de una pulsación larga sobre un objeto de tipo View.
 Debemos asociar el componente como disponible para un menú contextual.
 Luego definimos el menú de cualquiera de las dos formas anteriores (XML o Java).
 Deberemos escribir código para el método oncreateContextMenu.
 A la hora de seleccionar un elemento del menú sobreescribiremos el método
onContextItemSelected.

Capítulo 3: Almacenamiento de datos y aspectos avanzados

Almacenamiento de datos

Almacenamiento móvil

 Una aplicación en Android generalmente cuenta con tres tipos de formas de


 almacenamiento:
 Bases de Datos SQLite.
 Gestión de Archivos en el teléfono o en la tarjeta de memoria.
 Guardar configuración de nuestra aplicacion en forma de preferencias.
 Generalmente las aplicaciones utilizan más de una forma de guardar información.

Bases de datos SQLite

SQLite

 Es una base de datos muy popular debido a que tiene un tamaño muy reducido y no
requiere de un servidor.
 Tampoco necesita configurarse y ofrece soporte para transacciones.
 Android incorpora todas las herramientas para la creación, uso y gestión de Bases de
Datos SQLite.

Creando una base de datos

 Deberemos crear una clase Helper que extienda de SQLiteOpenHelper.


 Definiremos posteriormente métodos para crear y actualizar nuestra base de datos.
 Ejecutaremos los scripts de DDL y DML necesarios para dar a nuestra DB un estado inicial
válido.
 También podemos definir scripts de actualización de nuestra base de datos.
 Deberemos crear una clase Helper que extienda de SQLiteOpenHelper.
 Luego obtenemos una instancia a la misma y podemos utilizarla para guardar información.

 Las bases de datos se almacenan en la carpeta /data/data/<nombre del paquete de la


aplicación/nombreArchivo> en la memoria del teléfono.
 La creación de una DB de tipo SQLite puede tener varios efectos:
 Si la DB ya existe y su versión actual coincide con la solicitada simplemente se realizará
una conexión.
 Si la DB existe, pero su versión es anterior a la solicitada se llamará al método
onUpgrade().
 Si la DB no existe se creará el archivo correspondiente y se invocará al método oncreate().
Sentencias de DML y DDL

 Para realizar sentencias que no devuelven resultados podemos utilizar tanto la opción del
metodo execSQL obtenido de una instancia.

 Si bien estos métodos son fáciles de usar, de ésta forma no son muy parametrizables.
 Otra forma de proceder es utilizar los métodos insert(), update() y delete() que posee la
clase ContentValues

 También podemos parametrizar los métodos anteriores, para trabajar de una mejor forma

Consultar y recuperar registros

 Para consultar información podemos utilizar el método rawQuery() el cual recibe una
sentencia SQL como parámetro y opcionalmente las condiciones.
 O podemos utilizar el método query() en el cual especificaremos de otra forma la tabla, los
campos y el filtro de búsqueda a realizar.
- La clase Cursor posee métodos para recorrer el resultado de una consulta y procesar
sus resultados: boolean moveToFirst() ; boolean moveToLast() ; xxx getXXX(String) ;
xxx getXXX(int) ; String[] getColumnNames() ; int getColumnIndex(String) ; String ;
getColumnName(int) int getCount(int) ; boolean moveToNext() ; boolean ;
moveToPrevious() ; boolean moveToPosition(int) ; boolean move(int).
 Métodos de Movimiento: las posiciones comienzan en 0:
- boolean moveToFirst(): Se coloca al inicio de la consulta.
- boolean moveToLast(): Se coloca al final de la consulta.
- boolean moveToNext(): Avanza un registro.
- boolean moveToPrevious():Se mueve vía posición relativa.
- boolean move(int): Retrocede un registro.
- boolean moveToPosition(int): Avanza a la posición N.
 Métodos para obtener valores:
- String[] getColumnNames():Devuelve todos los nombres de las columnas.
- int getColumnIndex(String): Devuelve la posición de una columna.
- xxx getXXX(String): Obtiene el valor de una columna por nombre.
- xxx getXXX(int): Obtiene el valor de una columna por posición.
- int getCount(int): Devuelve la cantidad de registros resultante de la consulta.
- String getColumnName(int): Devuelve el nombre de la columna en la posición X.

Gestión de archivos

Manejo de archivos en Android

 La API de Android permite trabajar con archivos en forma muy similar a Java.
 Podemos leer y escribir archivos ubicados en:
- La memoria interna del dispositivo.
- Dispositivos de almacenamiento externo, si existen.
- La propia aplicación, en forma de recurso.
Trabajando en la memoria interna

 Se deben tener en cuenta las limitaciones de la memoria interna del dispositivo.


 Para crear archivos utilizaremos el método openFileOutput(), el cual necesita como
parámetros el nombre del archivo y su modo de acceso, entre los cuales tenemos:
- MODE_PRIVATE: acceso privado desde nuestra aplicación al archivo.
- MODE_APPEND: para añadir información a un archivo ya existente.
- MODE_WORLD_READABLE: permite a otras aplicaciones leer el archivo.
- MODE_WORLD_WRITABLE: permite a otras aplicaciones escribir el archivo.
 Los archivos se almacenan siguiendo el mismo patrón que las bases de datos.

 Para abrir y leer un archivo utilizaremos el método openFileInput() y el método readLine()


para leer línea a línea del mismo.
Manejando archivos como Recursos

 Este método es ideal para definir archivos de “parametros” en nuestra aplicación.


 Los archivos que definamos no pueder ser modificados, sólo leerse.
 Deberemos almacenarlos en el directorio /res/raw de nuestra aplicación.
 Para acceder a archivos utilizaremos el método getResources() y el método
openRawResource() especificando el Id del archivo a leer.

Manejando Archivos en la Tarjeta de Memoria

 Debemos tener en cuenta de que la tarjeta puede no estar presente o no ser reconocida.
 Contamos con un método estático getExternalStorageStatus() de la clase Environment que
nos devuelve el estado, entre los cuales tenemos:
- MEDIA_MOUNTED: la memoria externa está disponible y lista para su uso.
- MEDIA_MOUNTED_READ_ONLY: la memoria está disponible en modo solo lectura.
- MEDIA_UNMOUNTED: no se encuentra accesible la tarjeta.
- MEDIA_REMOVED: se ha expulsado la tarjeta.

 Estando en condiciones de acceder a la tarjeta de memoria contamos con el método


getExternalStorageDirectory() de la clase Environment para comenzar.
 Una vez obtenida la ruta podemos comenzar a crear objetos para escribir o leer en la
tarjeta.
 Para poder acceder a ésta funcionalidad necesitaremos solicitar permiso en el archivo
AndroidManifest.xml .

También podría gustarte