Taller Práctico de Android
-
Upload
javier-munoz -
Category
Technology
-
view
5.575 -
download
0
description
Transcript of Taller Práctico de Android
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