Taller Práctico de Android

Post on 18-Nov-2014

5.576 views 0 download

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

Taller Práctico de AndroidJavier Muñoz

(jmunoz@nabbel.es)

http://www.nabbel.es

@jmunozf

Presentación

Autobombo

Conceptos Básicos

Desarrollo Aplicación

Presentación

Autobombo

Conceptos Básicos

Desarrollo Aplicación

¿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

¿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

Presentación

Autobombo

Conceptos Básicos

Desarrollo Aplicación

Presentación

Autobombo

Conceptos Básicos

Desarrollo Aplicación

Necesidad de Información

¿Cuándo empieza?

¿Dónde es?

¿Quién participa?

¿Qué ocurre ahora?

¿Cómo llegar?

¿Hay más parecidos?

Escenarios de Aplicación

Museos

Fiestas Populares Parques Temáticos

Ferias

Festivales Musicales

Competiciones Deportivas

Eventos de Empresa

Congresos

Algunas Aplicaciones Nabbel

San Silvestre2010

Eventosfera

Romeria 2011

INNOVALENCIA

Follow Us

Algunas Aplicaciones Nabbel

Presentación

Autobombo

Conceptos Básicos

Desarrollo Aplicación

Presentación

Autobombo

Conceptos Básicos

Desarrollo Aplicación

Android: Arquitectura

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.)

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...

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

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 ) );

Presentación

Autobombo

Conceptos Básicos

Desarrollo Aplicación

Presentación

Autobombo

Conceptos Básicos

Desarrollo Aplicación

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

Paso 1: Crear proyecto

New > Android Projet

Select Build Target:Usaremos 2.1 (level 7)

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);

}

}

Ciclo de VidaActivities: Ciclo de Vida

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

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

SDK y AVD Manager

● Gestionar emuladores

Paso 2: Crear Emulador

● AVD Manager

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

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

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

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

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

Paso 4: Editar Interfaz de Usuario

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

Views → Interacción

Android: Interfaz de Usuario

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>

Android: Interfaz de Usuario

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Spinner

● Desplegable de Selección● Adapter para las opciones

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

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

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

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

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

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

Taller Práctico de AndroidJavier Muñoz

(jmunoz@nabbel.es)

http://www.nabbel.es

@jmunozf