Taller Práctico de Android

57
Taller Práctico de Android Javier Muñoz ([email protected]) http://www.nabbel.es @jmunozf

description

Transparencias de apoyo del Taller Práctico de Android impartido en la iParty 13 (http://iparty.aditel.org). El código fuente del caso de estudio puede encontrarse aquí: https://bitbucket.org/jmunoz/android-example-eltiempo

Transcript of Taller Práctico de Android

Page 1: Taller Práctico de Android

Taller Práctico de AndroidJavier Muñoz

([email protected])

http://www.nabbel.es

@jmunozf

Page 2: Taller Práctico de Android

Presentación

Autobombo

Conceptos Básicos

Desarrollo Aplicación

Page 3: Taller Práctico de Android

Presentación

Autobombo

Conceptos Básicos

Desarrollo Aplicación

Page 4: Taller Práctico de Android

¿Quién soy?

Formación Académica● 2003 Ing. Informática

Universitat Jaume I

● 2008 PhD Ing. SoftwareUniversidad Politécnica de Valencia

Exp. Profesional● 2010 Nabbel

Director

● 2008 ProdevelopJefe de Proyectos, I+D+iMOSKitt http://www.moskitt.org

● 2007 IntegranovaJefe de Proyectos

@jmunozf

Experiencia con Android● https://play.google.com/store/apps/developer?id=Nabbel● Profesor Curso Introducción Android en Universidad de Verano de la Universidad CEU Cardenal Herrera

Page 5: Taller Práctico de Android

¿Qué vamos a hacer hoy?

Lector del tiempoDatos de http://www.aemet.es/

AprenderemosUso básico del SDK

Estructura proyecto Android

Implementar pantallas

Parseo XML datos remotos

ContentProviders

Tareas en background

https://bitbucket.org/jmunoz/android-example-eltiempo

Page 6: Taller Práctico de Android

Presentación

Autobombo

Conceptos Básicos

Desarrollo Aplicación

Page 7: Taller Práctico de Android

Presentación

Autobombo

Conceptos Básicos

Desarrollo Aplicación

Page 8: Taller Práctico de Android

Necesidad de Información

¿Cuándo empieza?

¿Dónde es?

¿Quién participa?

¿Qué ocurre ahora?

¿Cómo llegar?

¿Hay más parecidos?

Page 9: Taller Práctico de Android

Escenarios de Aplicación

Museos

Fiestas Populares Parques Temáticos

Ferias

Festivales Musicales

Competiciones Deportivas

Eventos de Empresa

Congresos

Page 10: Taller Práctico de Android

Algunas Aplicaciones Nabbel

San Silvestre2010

Eventosfera

Romeria 2011

INNOVALENCIA

Follow Us

Page 11: Taller Práctico de Android

Algunas Aplicaciones Nabbel

Page 12: Taller Práctico de Android

Presentación

Autobombo

Conceptos Básicos

Desarrollo Aplicación

Page 13: Taller Práctico de Android

Presentación

Autobombo

Conceptos Básicos

Desarrollo Aplicación

Page 14: Taller Práctico de Android

Android: Arquitectura

Page 15: Taller Práctico de Android

Android: SDK

SDK + AVDPlataforma + Emuladores

Documentación + Ejemplos

Librerías de 3as partesGoogle Maps

GalaxyTab

Eclipse PluginProyecto Eclipse tipo Android

Herramientas Empaquetado

Debugging

Gestión del Emulador (copiar archivos, pantallazos, etc.)

Page 16: Taller Práctico de Android

Android: Arquitectura Aplicaciones

ActivitiesPantallas... independientes entre sí

Concepto principal

ServicesFuncionalidad de larga duración sin UI

Services vs Threads → Services funcionan con app cerrada

Content ProvidersAcceso a datos entre aplicaciones

Independientes de su persistencia (XML, SQLite, remoto...)

Broadcast ReceiversEscucha mensajes de difusión

Ejemplos: pantalla apagada, archivo descargados, batería baja...

Page 17: Taller Práctico de Android

Android: Arquitectura Aplicaciones

IntentsMensajes asíncronos entre componentes

Enlazan componentes en tiempo de ejecución

Contienen:

Action

URI

Extras

¿Qué acciones hay?

Definidas en SDK

OpenIntents:

Acciones estándar:ACTION_MAIN

ACTION_VIEW

ACTION_ATTACH_DATA

ACTION_EDIT

ACTION_PICK

ACTION_CHOOSER

ACTION_GET_CONTENT

ACTION_DIAL

ACTION_CALL

ACTION_SEND

ACTION_SENDTO

ACTION_ANSWER

ACTION_INSERT

ACTION_DELETE

ACTION_RUN

ACTION_SYNC

ACTION_PICK_ACTIVITY

ACTION_SEARCH

ACTION_WEB_SEARCH

ACTION_FACTORY_TESThttp://www.openintents.org/en/intentstable

Page 18: Taller Práctico de Android

Android: Arquitectura Aplicaciones

Ejemplos de Acción/URI en IntentsACTION_VIEW content://contacts/people/1

ACTION_DIAL content://contacts/people/1

ACTION_DIAL tel:123

ACTION_EDIT content://contacts/people/1

Ejecución de IntentsIntent i = new Intent(this, IntentA.class);

startActivity(i);

Uri uri = Uri.parse( "http://iparty.aditel.org" );

startActivity( new Intent( Intent.ACTION_VIEW, uri ) );

Page 19: Taller Práctico de Android

Presentación

Autobombo

Conceptos Básicos

Desarrollo Aplicación

Page 20: Taller Práctico de Android

Presentación

Autobombo

Conceptos Básicos

Desarrollo Aplicación

Page 21: Taller Práctico de Android

Desarrollo Aplicación1.- Crear Proyecto

2.- Crear Emulador

3.- Lanzar App en el Emulador

4.- Editar Interfaz Usuario

5.- Actualizar Interfaz de Usuario

6.- Leer Datos del Servidor

7.- Cargar Imagen en Background

8.- Configurar Spinner

9.- Empaquetar para Distribución

Page 22: Taller Práctico de Android

Paso 1: Crear proyecto

New > Android Projet

Select Build Target:Usaremos 2.1 (level 7)

Page 23: Taller Práctico de Android

Android: Arquitectura Aplicaciones

Activity básica

package com.example.helloandroid;

import android.app.Activity;

import android.os.Bundle;

public class HelloAndroid extends Activity {

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

}

}

Page 24: Taller Práctico de Android

Ciclo de VidaActivities: Ciclo de Vida

Page 25: Taller Práctico de Android

Desarrollo Aplicación1.- Crear Proyecto

2.- Crear Emulador

3.- Lanzar App en el Emulador

4.- Editar Interfaz Usuario

5.- Actualizar Interfaz de Usuario

6.- Leer Datos del Servidor

7.- Cargar Imagen en Background

8.- Configurar Spinner

9.- Empaquetar para Distribución

Page 26: Taller Práctico de Android

Desarrollo Aplicación1.- Crear Proyecto

2.- Crear Emulador

3.- Lanzar App en el Emulador

4.- Editar Interfaz Usuario

5.- Actualizar Interfaz de Usuario

6.- Leer Datos del Servidor

7.- Cargar Imagen en Background

8.- Configurar Spinner

9.- Empaquetar para Distribución

Page 27: Taller Práctico de Android

SDK y AVD Manager

● Gestionar emuladores

Paso 2: Crear Emulador

● AVD Manager

Page 28: Taller Práctico de Android

Desarrollo Aplicación1.- Crear Proyecto

2.- Crear Emulador

3.- Lanzar App en el Emulador

4.- Editar Interfaz Usuario

5.- Actualizar Interfaz de Usuario

6.- Leer Datos del Servidor

7.- Cargar Imagen en Background

8.- Configurar Spinner

9.- Empaquetar para Distribución

Page 29: Taller Práctico de Android

Desarrollo Aplicación1.- Crear Proyecto

2.- Crear Emulador

3.- Lanzar App en el Emulador

4.- Editar Interfaz Usuario

5.- Actualizar Interfaz de Usuario

6.- Leer Datos del Servidor

7.- Cargar Imagen en Background

8.- Configurar Spinner

9.- Empaquetar para Distribución

Page 30: Taller Práctico de Android

Herramientas● Emulator

● Basado en QEMU● Diferentes instancias

– Tamaños de pantalla y densidad– Skins

● Soporta:– Ubicaciones– SD Cards

● NO soporta– Cámara– Multi-touch

Paso 3: Lanzar App en el Emulador

Page 31: Taller Práctico de Android

Desarrollo Aplicación1.- Crear Proyecto

2.- Crear Emulador

3.- Lanzar App en el Emulador

4.- Editar Interfaz Usuario

5.- Actualizar Interfaz de Usuario

6.- Leer Datos del Servidor

7.- Cargar Imagen en Background

8.- Configurar Spinner

9.- Empaquetar para Distribución

Page 32: Taller Práctico de Android

Desarrollo Aplicación1.- Crear Proyecto

2.- Crear Emulador

3.- Lanzar App en el Emulador

4.- Editar Interfaz Usuario

5.- Actualizar Interfaz de Usuario

6.- Leer Datos del Servidor

7.- Cargar Imagen en Background

8.- Configurar Spinner

9.- Empaquetar para Distribución

Page 33: Taller Práctico de Android

Paso 4: Editar Interfaz de Usuario

Definición declarativa (XML) de la InterfazLayouts → Posicionamiento

Views → Interacción

Page 34: Taller Práctico de Android

Android: Interfaz de Usuario

Page 35: Taller Práctico de Android

Android: Interfaz de Usuario

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

<!-- Main Layout of Status Activity -->

<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:gravity="center"

android:textSize="30sp"

android:layout_margin="10dp" android:text="@string/titleStatus"/>

<EditText android:layout_width="fill_parent"

android:layout_height="fill_parent" android:layout_weight="1"

android:hint="@string/hintText" android:id="@+id/editText"

android:gravity="top|center_horizontal"></EditText>

<Button android:layout_width="fill_parent"

android:layout_height="wrap_content" android:text="@string/buttonUpdate"

android:textSize="20sp" android:id="@+id/buttonUpdate"></Button>

</LinearLayout>

Page 36: Taller Práctico de Android

Android: Interfaz de Usuario

Page 37: Taller Práctico de Android

Desarrollo Aplicación1.- Crear Proyecto

2.- Crear Emulador

3.- Lanzar App en el Emulador

4.- Editar Interfaz Usuario

5.- Actualizar Interfaz de Usuario

6.- Leer Datos del Servidor

7.- Cargar Imagen en Background

8.- Configurar Spinner

9.- Empaquetar para Distribución

Page 38: Taller Práctico de Android

Desarrollo Aplicación1.- Crear Proyecto

2.- Crear Emulador

3.- Lanzar App en el Emulador

4.- Editar Interfaz Usuario

5.- Actualizar Interfaz de Usuario

6.- Leer Datos del Servidor

7.- Cargar Imagen en Background

8.- Configurar Spinner

9.- Empaquetar para Distribución

Page 39: Taller Práctico de Android

Definición UI

Procedural

TextView tv= new TextView(this)

tv.setWidth(100);

tv.setHeight(60);

tv.setText("phone");

setContentView(tv);

Declarativa

<TextView

android:id="@+id/nameLabel"

android:text="phone:"

android:layout_width="100"

android:layout_height="60"

/>

Paso 5: Actualizar Interfaz de Usuario

Definición UI

Page 40: Taller Práctico de Android

Android UI XML

● El atributo id identifica la vista dentro de la jerarquía

● El símbolo (@) indica que viene un identificador

● El símbolo (+) indica que es un nombre nuevo (no una referencia)

● Todas las vistas deben definir:● android:layout_width

● android:layout_height

<TextView android:id="@+id/nameLabel" android:text="phone:" android:layout_width="100" android:layout_height="60" />

Identificación Componentes UI

Page 41: Taller Práctico de Android

Android UI XML

● Clase Java con los identificadores de recursos:

● Generada automáticamente al compilar (no tocar!!)● Se llamará: nuestro.paquete.R● Contiene identificadores de:

– Widgets de los Layouts– Los archivos contenidos en “res/” (layouts, drawables, strings,

colors, etc.)

● Widgets accesibles desde el código Java

Button btn = (Button) findViewById(R.id.acceptButton);

Referenciar Componentes UI

Page 42: Taller Práctico de Android

Desarrollo Aplicación1.- Crear Proyecto

2.- Crear Emulador

3.- Lanzar App en el Emulador

4.- Editar Interfaz Usuario

5.- Actualizar Interfaz de Usuario

6.- Leer Datos del Servidor

7.- Cargar Imagen en Background

8.- Configurar Spinner

9.- Empaquetar para Distribución

Page 43: Taller Práctico de Android

Desarrollo Aplicación1.- Crear Proyecto

2.- Crear Emulador

3.- Lanzar App en el Emulador

4.- Editar Interfaz Usuario

5.- Actualizar Interfaz de Usuario

6.- Leer Datos del Servidor

7.- Cargar Imagen en Background

8.- Configurar Spinner

9.- Empaquetar para Distribución

Page 44: Taller Práctico de Android

Tratamiento de XML● Opciones para manejar el XML

● SAX– Basado en eventos

– Compatible con handlers Java pre-existente

– El más “estándar”

● SAX Simplificado– Se asocian eventos a etiquetas

– Evita gestión en el handler de situación actual

● DOM– Estructura tipo árbol

– Mayor consumo de memoria

● XMLPull– Lectura del XML guiada

– Pedimos elementos

Paso 6: Leer datos del servidor

Page 45: Taller Práctico de Android

SAX Simplificado

public List<Noticia> parse(){ final List<Noticia> noticias = new ArrayList<Noticia>(); RootElement root = new RootElement("rss"); Element channel = root.getChild("channel"); Element item = channel.getChild("item"); item.setStartElementListener(new StartElementListener(){ public void start(Attributes attrs) { noticiaActual = new Noticia(); } }); item.setEndElementListener(new EndElementListener(){ public void end() { noticias.add(noticiaActual); } });

item.getChild("title").setEndTextElementListener( new EndTextElementListener(){ public void end(String body) { noticiaActual.setTitulo(body); } });

item.getChild("link").setEndTextElementListener( new EndTextElementListener(){ public void end(String body) { noticiaActual.setLink(body); } });

item.getChild("description").setEndTextElementListener( new EndTextElementListener(){ public void end(String body) { noticiaActual.setDescripcion(body); } });

. . .

Xml.parse(this.getInputStream(), Xml.Encoding.UTF_8, root.getContentHandler()); return noticias;

}

SAX Simplificado

Page 46: Taller Práctico de Android

Desarrollo Aplicación1.- Crear Proyecto

2.- Crear Emulador

3.- Lanzar App en el Emulador

4.- Editar Interfaz Usuario

5.- Actualizar Interfaz de Usuario

6.- Leer Datos del Servidor

7.- Cargar Imagen en Background

8.- Configurar Spinner

9.- Empaquetar para Distribución

Page 47: Taller Práctico de Android

Desarrollo Aplicación1.- Crear Proyecto

2.- Crear Emulador

3.- Lanzar App en el Emulador

4.- Editar Interfaz Usuario

5.- Actualizar Interfaz de Usuario

6.- Leer Datos del Servidor

7.- Cargar Imagen en Background

8.- Configurar Spinner

9.- Empaquetar para Distribución

Page 48: Taller Práctico de Android

Android: Cosas que quizá no sepas (3)

Tareas en background: AsyncTask

private class DownloadImageTask extends AsyncTask<String, Void, Bitmap> {

ProgressDialog dialog = new ProgressDialog(context);

protected void onPreExecute() {

this.dialog.setMessage("Progress start");

this.dialog.show();

}

protected Bitmap doInBackground(String... urls) {

return loadImageFromNetwork(urls[0]);

}

protected void onPostExecute(Bitmap result) {

mImageView.setImageBitmap(result);

dialog.dismiss();

}

} new DownloadImageTask().execute(“http://urlimage”);

Paso 7: Cargar Imagen en Background

Page 49: Taller Práctico de Android

Desarrollo Aplicación1.- Crear Proyecto

2.- Crear Emulador

3.- Lanzar App en el Emulador

4.- Editar Interfaz Usuario

5.- Actualizar Interfaz de Usuario

6.- Leer Datos del Servidor

7.- Cargar Imagen en Background

8.- Configurar Spinner

9.- Empaquetar para Distribución

Page 50: Taller Práctico de Android

Desarrollo Aplicación1.- Crear Proyecto

2.- Crear Emulador

3.- Lanzar App en el Emulador

4.- Editar Interfaz Usuario

5.- Actualizar Interfaz de Usuario

6.- Leer Datos del Servidor

7.- Cargar Imagen en Background

8.- Configurar Spinner

9.- Empaquetar para Distribución

Page 51: Taller Práctico de Android

Spinner

● Desplegable de Selección● Adapter para las opciones

AdaptersAndroid: Cosas que quizá no sepas (3)Paso 8: Configurar Spinner

Page 52: Taller Práctico de Android

Adapters

● Adaptar datos para una necesidad● LisAdapters (Interface)→ Datos para ser mostrados en ListView

● (abstract) android.widget.BaseAdapter

– Clase base para todos los Adapter

● android.widget.ArrayAdapter<T>

– Mostrar contenido de un Array o List

public ArrayAdapter (Context context, int resource, int textViewResourceId, List<T> objects)

Android: Cosas que quizá no sepas (3)Paso 8: Configurar Spinner

Page 53: Taller Práctico de Android

Desarrollo Aplicación1.- Crear Proyecto

2.- Crear Emulador

3.- Lanzar App en el Emulador

4.- Editar Interfaz Usuario

5.- Actualizar Interfaz de Usuario

6.- Leer Datos del Servidor

7.- Cargar Imagen en Background

8.- Configurar Spinner

9.- Empaquetar para Distribución

Page 54: Taller Práctico de Android

Desarrollo Aplicación1.- Crear Proyecto

2.- Crear Emulador

3.- Lanzar App en el Emulador

4.- Editar Interfaz Usuario

5.- Actualizar Interfaz de Usuario

6.- Leer Datos del Servidor

7.- Cargar Imagen en Background

8.- Configurar Spinner

9.- Empaquetar para Distribución

Page 55: Taller Práctico de Android

Compilar y Firmar● Utilizando Eclipse

● Opción del menú contextual:– Android Tools > Export Signed Application Package

● Asistente para seleccionar:– Archivo destino– Almacén de clave– Clave

● Zipalign– Ejecutado por el asistente– Los datos descomprimidos empiezan en

una cierta posición– Mejora de rendimiento en dispositivos

Android: Cosas que quizá no sepas (3)Paso 9: Empaquetar para Distribución

Page 56: Taller Práctico de Android

Crear clave privada

● Condiciones● Contiene los datos tuyos o de tu organización● Validez después de 22 Octubre 2033● NO utilices la de debug

● Creación

● Pedirá:– Definir los datos de la organización

– Crear el password del almacén de claves

– Crear el password de la clave

$ keytool -genkey -v -keystore my-release-key.keystore -alias alias_name -keyalg RSA -keysize 2048 -validity 10000

Android: Cosas que quizá no sepas (3)Creación Clave Privada

Page 57: Taller Práctico de Android

Taller Práctico de AndroidJavier Muñoz

([email protected])

http://www.nabbel.es

@jmunozf