82
Android – Introducción CatDroid – Jan. 2011 (por Roberto C. Serrano)

Intro. a Android Instituto Bosc de la Coma en Olot

Embed Size (px)

DESCRIPTION

Intro. a Android Instituto Bosc de la Coma en Olot.Intro y elementos de construcción básicos de una app.

Citation preview

Page 1: Intro. a Android Instituto Bosc de la Coma en Olot

Android – Introducción

CatDroid – Jan. 2011(por Roberto C. Serrano)

Page 2: Intro. a Android Instituto Bosc de la Coma en Olot

Acerca de miRoberto C. SerranoEx-Motorolan (Ingeniero de Software y Developer Advocate.Desarrollador de AndroidResponsible desarrollo dispoitivos móviles para Addapta Technological ServicesCo-fundador de la comunida CatDroidFundador de los grupos Chicago Androids y Barcelona AndroidesInfo de Contacto:

[email protected] o twitter.com/hojalataverde

Page 3: Intro. a Android Instituto Bosc de la Coma en Olot

En esta mini-presentación

Introducción: Introducción al sistema operativo

Android y sus peculiaridades Introducción a un Android Activity y

los Componentes de una Applicación

Page 4: Intro. a Android Instituto Bosc de la Coma en Olot

Introducción al sistema operativo Android y sus

peculiaridades

Page 5: Intro. a Android Instituto Bosc de la Coma en Olot

Demo del shell de Android

Android es casi un Linux (pero con muchas peculiaridades)

http://code.google.com/p/android-vnc/ Get fbvncserver binary Load it into the phone/emulator: adb push fbvncserver /data/local  adb shell chmod 777 /data/local/fbvncserver adb forward tcp:5901 tcp:5901 Run the vnc server: adb shell /data/local/fbvncserver

Page 6: Intro. a Android Instituto Bosc de la Coma en Olot

Openness y Android• “Android es la primera plataforma extensiva

para electrónica movil.…”• Componentes:

– Una referencia de diseño de de hrdw que describe los requisitos mínimos para dar soporte a la plataforma.

– Linux Kernel – Librerias Open Source a– Run time environment (Dalvik)– Framework para aplicaciones– Un framework para interface de usuario – Un paqueta de aplicaciones preinstaladas (un telefono

inteligente 100% funcional)– Un kit de desarrollo (Tools, plug-ins, and documentation)

Page 7: Intro. a Android Instituto Bosc de la Coma en Olot

Android Applications

• Sin Licencia en la plataforma (http://android.git.kernel.org/)– SMS management app.– PIM (Google calendar, etc)– WebKit based browser– Cliente de Mail POP3– Instant Messaging Client (GChat)– Music Player and Picture viewer

• Con Licencia:– Android Market Place – App. Google Maps y navegación– Cliente eMail(GMail)

• Etc.

Page 8: Intro. a Android Instituto Bosc de la Coma en Olot

Carácter. del Android SDK y Plataforma

• Open platform (no fees, no licensing)• Wi-fi hrdw. acess• Full comm. stack (GSM, EDGE, 3G, Bluetooth)• GPS• Multimedia (playback and recording of audio, video, etc)• APIs to accel. And compass hrdwr.• IPC messaging• Share Data stores• Web-Kit browser• Eventually hwrd. accel. 3D graphics (Open GL ES)• Media Libraries (Licensed for MP3, etc…)• And open Application Framework (reuse and replacement)

Page 9: Intro. a Android Instituto Bosc de la Coma en Olot

Funcionalidad disponible• Sistema Agnóstico al Hardware (via el Kernel)• Background services• SQLite DB• Comunicación entre applicaciones • Incluye Soporte multimedia • Sistema de optimización de Mem. y gestión de Procesos• Busqueda rápida desde 1.6• Sintetizador de voz desde 1.6• Gestión Transparente o intencionada de de múltiples resoluciones desde 1.6• API de Blutooth desde 2.0• Gestión centralizada de contactos desde 2.0• Live WallPapers desde 2.0• Reconocimiento de voz desde 2.1• navegación desde 2.1• Mensajes de la Nube al teléfono (Push) desde 2.2• Apps instalables en memoria externa (SD) desde 2.2• NFC desde 2.3• Internet Telephony (SIP protocol desde 2.3

Page 10: Intro. a Android Instituto Bosc de la Coma en Olot

El pastel de Android

HA

LC

OR

E A

ND

RO

ID +

LIB

RA

RIE

S

HAL

Multimedia / Graphics

TCMD

MBM / Boot loader

CONNECTIVITYUSB

BLUETOOTHWi-Fi

CONNECTIVITYMODEM + RIL

KER

NEL+

BS

P

GPS

Page 11: Intro. a Android Instituto Bosc de la Coma en Olot

El concepto de Activity en Android

Page 12: Intro. a Android Instituto Bosc de la Coma en Olot

Activities y Tasks

Definición de Dan Morrill’s:   Una Actividad es como una molécula, un trozo

cuantificable de funcionalidad. Una tarea es una collección de actividades

(parte una o multiples aplicaciones) Un proceso en Android es un “proceso”

estandard de Linux

Page 13: Intro. a Android Instituto Bosc de la Coma en Olot

Activities y Tasks (cont.)

Por defecto cada aplicación de Android vive en su mundo:

– Cada Applicación se ejecuta en su propio proceso por defecto

– Cada proceso se ejecuta dentro de su propia máquina virtual

– Cada aplicación recive su Linux User ID

Page 14: Intro. a Android Instituto Bosc de la Coma en Olot

Activities (continue)

Page 15: Intro. a Android Instituto Bosc de la Coma en Olot

Activities (continue)

Page 16: Intro. a Android Instituto Bosc de la Coma en Olot

Actividad frente a Tarea (apps)

• Una clase concreta en el API

• Encapsula una operación particular

• Se ejecuta en el Proceso del .APK que las instaló

• Opcionalmente asociadas con su ventana (UI)

• Es el contexto de ejecución del APK

• Es más una noción que una parte del API

• Collección de Actividades relaccionas

• Capaz de extenderse a múltiples APKs y procesos

• Asociado con su propio “history stack”

• Son lo que los usuarios de otras plataformas entiende como “aplicaciones”

Page 17: Intro. a Android Instituto Bosc de la Coma en Olot

Process(a) esto...

En que se parece un Android y un Linux?

Android process == Linux process (con su unico UID)

Por defecto, 1 proceso por APK Por defecto, 1 hilo (thread) por proceso La mayoría de los componente conectan

eventos via el hilo principal.

Page 18: Intro. a Android Instituto Bosc de la Coma en Olot

Componentes de una App. en Android

Content Providers: Una abstracción provista para representar cualquier información (data) almacenada en el aparato y a la que necesitan acceso múltiples aplicaciones.Services: Unidad de ejecución provista para que sobreviva más allá de una actividad. Pueden ser ejecutados como parte o independientemente de una actividad.Intents: Mortero que una el resto de los componentes. Mensajes de sistema que transmiten eventos representado cambios de estado en el hardware, acciones, etc. Broadcast Receivers: Los consumidores de los Intents. Registrando tu app. como un broadcast reciever le estas dando a la aplicación la habilidad de consumir Intents que coinciden con un criterio de filtrado específico.Notifications: El framework de notificación a usuarios permite que un Servicio o aplicación comunique con el usuario sin interrumpir su flujo de trabajo.

Page 19: Intro. a Android Instituto Bosc de la Coma en Olot

Otros Componentes Elementos Gráficos: Menus, Dialogs, ListViews, ListActivity, Buttons, Widgets, Toast, etc.Persistent Storage: Sistema de almacenamiento simplificado útil para persistir información de una sesión a otra (usado principalmente para almacenar preferencias).Async Tasks: Además de el método tradicional de java para crear hilos, Android provee de esta clase útil para envolver tareas pesadas para que no interfieran con la experiencia del usuario.WebViewClient: Estructura disponible para que una aplicación pueda mostrar contenido Web (basado en WebKit).PreferenceActivity: Permite la creación de Actividades de Ajustes (settings) y persistencia de los datos de manera simplificada.HTTPClient: Estructura provista para la adquisición de datos desde un servidor web (útil para extrar objetos json o xml).MapView Activity: Estructura que permite hacer uso de la infraestructura de Google Maps desde una aplicación.

Page 20: Intro. a Android Instituto Bosc de la Coma en Olot

Otros elementos a tu disposición (lista no exhaustiva)

Storage: Puedes empaqueta ficheros de datos, para elementos estáticos, como iconos, cadenas de texto, arrays, etc. Se puede obtener espacio en la base de datos (SQLite) y en la memoria principal, o si el usuario provee de tarjeta SD, también se puede usar para almacenar todo ello para almacenar elementos generados de manera dinámica (o descargados de internet).

Network: Desde Java Sockets (via NIO) a pantallas que contengan un navegador, Android provee de un montón de mecanismos para aprovechar la accesibilidad a Internet.

Multimedia: Desde la lógica de una aplicación se puede incluir la reproducción y grabación de Audio y vídeo así como la de captura de imágenes (fotos).

GPS: Aparatos estandarizados de Android tienen la habilidad de reportar la ubicación (con diferentes niveles de granularidad). Además usando google maps, se pueden mostrar mapas, etc.

Phone Services: Una aplicación de android puede hacer uso de los servicios de telefonía, permitiendo el iniciar llamadas, enviar SMS, etc.

Page 21: Intro. a Android Instituto Bosc de la Coma en Olot

Q&A

Page 22: Intro. a Android Instituto Bosc de la Coma en Olot

Android Básico

Introducción: Introducción a un Android Activity y los Componentes de una Applicación

Lo básico: La topografía de un proyecto de Android (visto desde Eclipse)

Life Cycle s de una aplicación Android.

Layouts, Containers y Widgets

Intents

Manejando Inputs (Events):

TouchEvents

Key events

El manifest.xml

Debugging

Etc...

Page 23: Intro. a Android Instituto Bosc de la Coma en Olot

La topografía del Proyecto de Android

(visto desde Eclipse)

Page 24: Intro. a Android Instituto Bosc de la Coma en Olot

Elementos “Automáticos”

Porciones automáticas (gestionadas pro Eclipse y el ADT plugin).Derecha: R class and the android library (no se toca...)

Page 25: Intro. a Android Instituto Bosc de la Coma en Olot

Elem. generados (pero no automáticos)

Pantalla anterior: Manifest (* generado pero no automático), directorios y esqueleto de nuestra aplicación.Izquierda aquí: src, donde tus clases (código de la App reside)Derecha: Resources (recursos), recursos estáticos que constituyen nuestra App. Todos estos recursos son “precompilados” en la clase R

Page 26: Intro. a Android Instituto Bosc de la Coma en Olot

El directorio res y R.class

La clase R provee referencias (direcciones estáticas) a los objetos en binario que representan el directorio res. (layout, strings, media, etc.)De esta manera, estos recursos pueden ser referenciados una vez son “inflados”.En el caso de los layouts, cuando desde onCreate llamamos el método setContentView(int layoutResId) el layout.xml que representa la estructura del layout es inflado y referenciado.Una vez es posible referenciar, podemos establecer conexiones entre objetos de Java y su representación en el Layout mediante la función findViewById(int resId).

Page 27: Intro. a Android Instituto Bosc de la Coma en Olot

Android AVD y SDK Manager

Virtual Devices: Gestión de todas las máquinas virtuales con diferentes perfiles que podemos crear para gestionar las diferentes configuraciones que deseamos testearAvailable Packages: Nos permite gestionar los repositorios donde obtener los paquetes.

Page 28: Intro. a Android Instituto Bosc de la Coma en Olot

New Device

Hardware → New. Nos permite controlar algunos aspectos adicionales sobre el perfil de hardware a emular.

Page 29: Intro. a Android Instituto Bosc de la Coma en Olot

Hello World!!

Creemos un proyecto nuevo.Selecciona File > New > Android Project Vamos a rellenar los detalles del proyecto:Pon HelloWorld como Project NameSelecciona “Create new project in workspace”Entra helloworl in App name.Entra com.materiales.intro in Package Name Enter HelloActiviy in Activity name y adelante...

Page 30: Intro. a Android Instituto Bosc de la Coma en Olot

Project Properties

Project Name Nombre del directorio donde guardaremos en el proyecto en el workspace de Eclipse

Package Name Este es el paquete o namespace (alcance) en el que quieres que tu código exista. Las mismas reglas que en java aplican. El nombre de tu paquete tiene que ser único en tu sistema (teléfono), por eso es relativamente importante incluir nombres que siguen el estilo de los dominios como “com.isoco.departamente”

Activity Name Nombre que le vamos a dar a la clase que el API generará y heredará de Activity.

Application Name This is the human-readTítulo de nuestra aplicación.able title for your application.

Page 31: Intro. a Android Instituto Bosc de la Coma en Olot

Finalmente: Ejecutando Hello World!

Siempre que le damos al botón de play (o Ctrl-F11) una configuración de ejecución se usa para determinar los parámetros de ejecución. Para ajustar esos parámetros ve a Run Configurations (derecha).

Page 32: Intro. a Android Instituto Bosc de la Coma en Olot

Ejecutando H. World (Continua)

Ya desde aquí le podemos dar a Run. En ejecuciones consecutivas podemos usar el icono de 'play' de color verde o ctrl-F11.Elige Android ProjectY a esperar...

Page 33: Intro. a Android Instituto Bosc de la Coma en Olot

Android Activity Life Cycle

Una actividad tiene tres estados básicos

La actividad esta en ejecución y ocupa el primer plano.

Esta pausada pero todavía es visible al usuario (no está enfocada). *Kill.

Esta parada y en segundo plano no visible al usuario. *Kill2.

Page 34: Intro. a Android Instituto Bosc de la Coma en Olot

Android Activity Life Cycle (cont.)

A medida que la actividad transita de un estado a otro, es notificada de los cambios por el OS recibiendo llamadas a los siguientes métodos:

void onCreate(Bundle savedInstanceState)

void onStart()

void onRestart()

void onResume()

void onPause()

void onStop()

void onDestroy()

Page 35: Intro. a Android Instituto Bosc de la Coma en Olot

Más sobre el Lifecycle!

Estos siete métodos definen el ciclo entero de la vida de una actividad. Con tres bucles anidados, puedes monitorizar el ciclo de una de las siguientes maneras:Entre onCreate y onDestroy(). Transfondo (Background).Entre onStart() y onStop(). Visible.Entre onResume() y onPause(). Primer Plano (Foreground).

Leyenda: Óvalos de color representan estados principales. Cuadrados representa los métodos “call back” que puedes refinar (override) en tu actividad para capturar las transiciones entre estados.

Page 36: Intro. a Android Instituto Bosc de la Coma en Olot

Los estados

Page 37: Intro. a Android Instituto Bosc de la Coma en Olot

Guardando el estado de la Actividad

Para capturar el estado antes de que una actividad sea cerrada la aplicación puede implementar onSaveInstanceState(). El método Recibe un objeto Bundle en la que el usuario puede almacenar el estado el estado antes de que la actividad sea vulnerable a ser destruida, usando pares nombre-valor.Este Bundle es pasado de vuelta al método onCreate cuando la actividad es abierta de nuevo.El método no es llamado cuando la actividad es cerrada por la lógica del programa o cuando el usuario pulsa “back” (presuntamente cerrando la actividad de manera expresa).

Page 38: Intro. a Android Instituto Bosc de la Coma en Olot

Q&A

Page 39: Intro. a Android Instituto Bosc de la Coma en Olot

Los materiales de construcción básicos

Page 40: Intro. a Android Instituto Bosc de la Coma en Olot

Layouts, Containers y Widgets

Todos son views.Todos tienen una representación en XMLLa caja de la izquierda contiene quizás el ejemplo más básico:En este ejemplo el Botón es elemento Raiz de nuestro XML, donde normalmente tendríamos un contenedor.Contenedores espacian una colección de widgets (o contenedores hijos) en un área específica.

<?xml version="1.0" encoding="utf-8"?><Button xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/button" android:text="" android:layout_width="fill_parent" android:layout_height="fill_parent"/>

Page 41: Intro. a Android Instituto Bosc de la Coma en Olot

El significado de @+id

@+id/ es equivalente auna abreviación de el directorio ‘res/’ contenido en nuestro proyectoCualquier elemento que necesite ser referenciado desde Java necesita un id '@+id/button'. El texto después de la barra se convertirá el identificador único para el elemento.La Implementación por defecto de onSaveInstanceState() almacenará todos los campos que estén marcados por (@+id).

Page 42: Intro. a Android Instituto Bosc de la Coma en Olot

WidgetsAbsListView

AbsSeekBar

AbsSpinner

AlphabetIndexer

AnalogClock

AutoCompleteTextView

Button

CheckBox

CheckedTextView

DatePicker

Chronometer

CompoundButton

DigitalClock

EditText

ExpandableListView

Gallery

GridView

HorizontalScrollView

ImageButton

ImageSwitcher

Scroller

ScrollView

SeekBar

SlidingDrawer

Spinner

TabHost

TableLayout

TableRow

TabWidget

TextSwitcher

ImageView

ListView

MediaController

MultiAutoCompleteTextView

PopupWindow

ProgressBar

QuickContactBadge

RadioButton

RadioGroup

RatingBar

RemoteViews

TextView

TimePicker

Toast

ToggleButton

TwoLineListItem

VideoView

ZoomButton

ZoomButtonsController

ZoomControls

Page 43: Intro. a Android Instituto Bosc de la Coma en Olot

Widgets

Un Widget es un objeto de tipo View que sirve como interfaz, estableciendo una conexión lógica entre elementos gráficos y eventos, de manera que el usuario pueda interactuar con la aplicación.

Pero, tampoco estás limitado a los widgets que te provee la plataforma y puedes crear los tuyos propios: http://developer.android.com/guide/topics/ui/custom-components.html

Page 44: Intro. a Android Instituto Bosc de la Coma en Olot

UI-Events

Para capturar un evento tenemos dos maneras:

Definir un Listener y registrarlo con la vista (efectivamente manejando el evento desde la clase que esta “inflando” la vista). El ejemplo que nos concierne ahora.

Override el callback de una clase existente del tipo view (manejando el evento desde la clase que define el view).

Page 45: Intro. a Android Instituto Bosc de la Coma en Olot

UI Events - Definiendo el Listener

El listener de un evento es un interface de Java definido en la Vista de la clase concerniente y que contiene un simple callback. Este método será llamado por el framework de Android cundo el listener ha sido registrado desde la vista y el usuario interactua con el elemento en el Interfaz (o el botón físico).

Los pasos a seguir son los siguientes: La clase necesita implementar View.OnClickListener Registra tu calse para que sea “callback” cuando un evento concreto es

disparado, usando los setOn<…> methods Define un on<…> method in your class

Hay dos maneras más de establecer la conexión entre nuestra clase y los eventos de los widgets… Luego les echamos un vistazo.

Page 46: Intro. a Android Instituto Bosc de la Coma en Olot

Lista de eventosRegister Listener Call Back Source More info.

View.setOnClickListener( listener )

onClick() View.OnClickListener()Usuario toca el elemento (durante touchmode), o enfoca con las teclas de navegación ot trackball y pPara capturar un evento tenemos dos maneras:Definir un Listener y registrarlo con la vista (efectivamente manejando el evento desde la clase que esta “inflando” la vista). El ejemplo que nos concierne ahora.Override el callback de una clase existente del tipo view (manejando el evento desde la clase que define el view). ulsa enter o el trackball.

View.setOnLongClickListener( listener )

onLongClick() View.OnLongClickListener()Usuario toca y mantiene la pulsación en elemento (durante touchmode), o enfoca y pulsa con enter o el trackball (durante un segundo).

View.setOnFocusChangeListener( listener )

OnFocusChange()

View.OnFocusChangeListener()

Usuario navega al elemento o se marcha (usando las teclas de navegación o trackball).

View.setOnKey( listener )

OnKey() View.OnKeyListener()Usuario enfoca en elemento o y User is focused on the item and presses or releases a key on the device

View.setOnTouch( listener )

OnTouch() View.OnTouchListener()Usuario realiza un acción de tipo touch, incluyendo pulsar, solta, o cualquier gesto en la pantalla dentro de las coordenadas que componen el elemento en cuestión.

OnCreateContextMenu también está disponeble y lo veremos más tarde. Para ver más detalles mirar: http://developer.android.com/guide/topics/ui/ui-events.html

Page 47: Intro. a Android Instituto Bosc de la Coma en Olot

Conectando el Eventopublic class Ahora extends Activity

implements View.OnClickListener {

Button btn;

@Override

public void onCreate(Bundle icicle) {

super.onCreate(icicle);

setContentView(R.layout.main);

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

btn.setOnClickListener(this);

updateTime();

}

public void onClick(View view) {

updateTime();

}

}

Page 48: Intro. a Android Instituto Bosc de la Coma en Olot

Conectando el Evento 2public class NowRedux2 extends Activity {

Button btn;

private OnClickListener myBtnListener = new OnClickListener() {

public void onClick(View v) {

updateTime();

}

};

@Override

public void onCreate(Bundle icicle) {

super.onCreate(icicle);

setContentView(R.layout.main);

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

btn.setOnClickListener(myBtnListener);

updateTime();

}

private void updateTime() {

btn.setText(new Date().toString());

}

}

public class NowRedux3 extends Activity {

Button btn;

@Override

public void onCreate(Bundle icicle) {

super.onCreate(icicle);

setContentView(R.layout.main);

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

btn.setOnClickListener(new View.OnClickListener() {

public void onClick(View v){

updateTime();

}

});

}

private void updateTime() {

btn.setText(new Date().toString());

}

}

public class NowRedux2 extends Activity {

Button btn;

private OnClickListener myBtnListener = new OnClickListener() {

public void onClick(View v) {

updateTime();

}

};

@Override

public void onCreate(Bundle icicle) {

super.onCreate(icicle);

setContentView(R.layout.main);

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

btn.setOnClickListener(myBtnListener);

updateTime();

}

private void updateTime() {

btn.setText(new Date().toString());

}

}

public class NowRedux3 extends Activity {

Button btn;

@Override

public void onCreate(Bundle icicle) {

super.onCreate(icicle);

setContentView(R.layout.main);

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

btn.setOnClickListener(new View.OnClickListener() {

public void onClick(View v){

updateTime();

}

});

}

private void updateTime() {

btn.setText(new Date().toString());

}

}

Page 49: Intro. a Android Instituto Bosc de la Coma en Olot

Conectando el Eventopublic class Ahora extends Activity

implements View.OnClickListener {

Button btn;

@Override

public void onCreate(Bundle icicle) {

super.onCreate(icicle);

setContentView(R.layout.main);

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

btn.setOnClickListener(this);

updateTime();

}

public void onClick(View view) {

updateTime();

}

}

Page 50: Intro. a Android Instituto Bosc de la Coma en Olot

Depurando e Informando al usuario

Para hacer funciones de depurar, tenemos varias opciones:

Eclipse Breakpoints, y usar DDMS (más tarde lo veremos con más detenimiento)

Podemos mostrar el contenido de variables via LOG (logcat) y via Toast.

Y en relacción a Toast...también podemos crear Alerts (ventanas modales)...

Page 51: Intro. a Android Instituto Bosc de la Coma en Olot

Depurando e Informando al usuario

Para hacer funciones de depurar, tenemos varias opciones:

Eclipse Breakpoints, y usar DDMS (más tarde lo veremos con más detenimiento)

Podemos mostrar el contenido de variables via LOG (logcat) y via Toast.

Y en relacción a Toast...también podemos crear Alerts (ventanas modales)...

Page 52: Intro. a Android Instituto Bosc de la Coma en Olot

Log y logcat

Android dispone de un buffer circular donde al que todos los programas puedes mandar contenido para crear un log.

En cualquier momento se puede acceder a este log usando adb logcat o la vista de ddms de Eclipse.

Para mandar contenido usamos los métodos: Log.v() Log.d() Log.i() Log.w() and Log.e()

Todos siguen este formato más o menos: Log.v(TAG, "index=" + i);

Es buena práctica definir TAG para nuestro activity: private static final String TAG = "MyActivity";

Page 53: Intro. a Android Instituto Bosc de la Coma en Olot

Raise a Toast

Por otra banda Toast cumple una función gráfica en Android ya que se usa para proporcionar mensajes al usuario que son transitivos y no interactivos.

Toast pueden también estar compuestos por views complejos, pero lo normal es que sean texto.

Usando Toast es bastante sencillo:

Toast.makeText(this, "<clink, clink>",

Toast.LENGTH_SHORT).show();

Page 54: Intro. a Android Instituto Bosc de la Coma en Olot

Alert Alert es un diálogo modal que podemos usar para alertar al usuario y exigir su atención.

La forma más fácil de construir un diálogo modal es usar la clase Builder:setMessage(): establece el mensaje desde un String o ID de un recurso tipo string

setTitle() and setIcon(), para configurar el texto o icono que a de apareceren la barra de título

setPositiveButton(), setNeutralButton(), setNegativeButton(), indica que botones han de aparecer en la parte de abajo de la ventan de diálogo y su posición respectivamente (izquierda, centro y derecha respectivamente), que texto debería contener, y el evento que debería ser llamado aparte de cerrar la ventana de diálogo.new android.app.AlertDialog.Builder(this)

.setTitle("MessageDemo")

.setMessage("eek!")

.setNeutralButton("Close", new DialogInterface.OnClickListener() {

public void onClick(DialogInterface dlg, int sumthin) {

// do nothing – it will close on its own

}

})

.show();

Page 55: Intro. a Android Instituto Bosc de la Coma en Olot

Containers

To arrange widgets with some flexibility we have a the following set of “Container” layouts:

FrameLayout: simplest type of layout object. It's basically a blank space on your screen that you can later fill with a single object — for example, a picture that you'll swap in and out. All child elements of the FrameLayout are pinned to the top left corner of the screen; you cannot specify a different location for a child view. Subsequent child views will simply be drawn over previous ones, partially or totally obscuring them.

LinearLayout TableLayout RelativeLayout View Groups (all of the above plus a few more such us:

spinner, SurfaceView, TabHost, etc.)

Page 56: Intro. a Android Instituto Bosc de la Coma en Olot

Linear Layout

Alinea todos los hijos en una sola dirección. El atributo “orientation” determina si los objetos son alineado vertical o horizontalmente.Respeta los márgenes entre los hijos el atributo “gravity” (right, center, or left) de cada uno de los hijos. También tiene la habilidad de asignar pesos (weight) a cada hijo individual y usar este atributo para determinar como el conjunto se expandirá y usara el espacio proporcionado por el contenedor.

Example linear_layout_8.xml from ApiDemos

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="fill_parent" android:layout_height="fill_parent" android:padding="30dip"> <LinearLayout android:id="@+id/layout" android:orientation="vertical" android:background="@drawable/blue" android:layout_width="fill_parent" android:layout_height="fill_parent" android:padding="30dip">

<TextViewandroid:background="@drawable/box"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@string/linear_layout_8_c"/>

<TextViewandroid:background="@drawable/box"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@string/linear_layout_8_b"/>

<TextViewandroid:background="@drawable/box"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@string/linear_layout_8_c"/>

</LinearLayout>

</FrameLayout>

Page 57: Intro. a Android Instituto Bosc de la Coma en Olot

Conceptos importantes para LinearLayout

Orientation: Determina si el layout es una columna o una fila. Fill Model: Si las dimensiones del conjunto de elementos dentro de los diferentes

elementos del LinearLayout son dispares, necesitamos un comportamiento para determinar el relleno dándole un valos a layout_width and layout_height. Estas propiedades tienen las siguientes opciones:

Tamaño específico fill_parent. wrap_content.

Weight: Permite que uno o más elementos del layout se lleven el espacio “restante” siguiendo un criterio de pesos. El peso por defecto es zero. Si queremos que un elemento ocupe el doble que otro, le damos peso 2 y al otro peso 1.

Gravity: Por defecto todo es “left and top” aligned, de manera que si creamos una columna, los hijos se alinearan a la izquierda. Pero tenemos las siguientes opciones para columnas: left, right, center-horizontal. Y para una fila podemos variar el base line para hacerlos center-vertical.

Padding: android:padding nos permite añadir un margen de manera consistente alrededor del widget. Si queremos hacerlo de manera dispar podemoa usar android:paddingLeft, android:paddingRight, android:paddingTop y android:paddingBottom

Page 58: Intro. a Android Instituto Bosc de la Coma en Olot

Table Layout• TableLayout posicionas sus hijos en

filas y columnas. • No dibuja bordes entre las filas y

columnas o celdas (es posicionamiento)

• La tabla tendrá tantas columnas como la fila con más celdas.

• Una tabla puede dejar celdas vacías, pero celdas no puede “span” múltiples columnas. Pero si puedes tener un hijo que expanda múltiples columnas.

• Los objetos TableRow son Views hijas de TableLayout ( cada TableRow define una sola fila en la tabla).

• Cada Row tiene cero o mas celdas, cada una está definida por cualquier tipo de vista. De esta manera, las celdas de una fila se componen de una variedad de objetos de tipo View, como ImageView or TextView objects.

• Una celda puede ser compuesta también de un objeto ViewGroup (por ejemplo, una celda puede anidar un TableLayout).

<?xml version="1.0" encoding="utf-8"?><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="@string/table_layout_4_open" android:padding="3dip" /> <TextView android:text="@string/table_layout_4_open_shortcut" android:gravity="right" android:padding="3dip" />

</TableRow> <TableRow> <TextView

android:text="@string/table_layout_4_save" android:padding="3dip" /> <TextView android:text="@string/table_layout_4_save_shortcut" android:gravity="right" android:padding="3dip" />

</TableRow> </TableLayout>

Page 59: Intro. a Android Instituto Bosc de la Coma en Olot

Conceptos importantes para TableLayout

Podemos intercalar TableRow con otros tipos de views. Cuando hacemos esto estos elementos tenderán a ocupar el mismo ancho que la columna más ancha.

También disponemos de las propiedades android:stretchColumns, android:shrinkColumns, android:collapseColumns, que aceptan uno o más valores.

Page 60: Intro. a Android Instituto Bosc de la Coma en Olot

Relative LayoutPermite a las vistas hijas definir su posición relativa a su padre o entre ellas, especificado el ID de las mismas. Los parámetros definibles son: width, height, below, alignTop, toLeft, padding [Bottom|Left|Right|Top], and margin [Bottom|Left|Right|Top].De todos los layouts RelativeLayout es posiblemente el más flexible y el más capaz de escalar.

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="fill_parent" android:layout_height="fill_parent">

<!-- view1 goes on top --> <TextView android:id="@+id/view1" android:background="@drawable/red" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:text="@string/relative_layout_1_top"/>

<!-- view2 goes on the bottom --> <TextView android:id="@+id/view2" android:background="@drawable/green" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:text="@string/relative_layout_1_bottom"/>

<!-- view3 stretches betweeen view1 and view2 --> <TextView android:id="@+id/view3" android:background="@drawable/yellow" android:layout_width="fill_parent" android:layout_height="0dip" android:layout_above="@id/view2" android:layout_below="@id/view1" android:text="@string/relative_layout_1_center"/>

</RelativeLayout>

Page 61: Intro. a Android Instituto Bosc de la Coma en Olot

Conceptos Importantes para RelativeLayout

Propiedades para “relative to container”.

Propiedades para definir “relative to other widgets”.

Orden de evaluación: a partir de 1.6 android hace dos pasadas, de manera que podemos referir a widgets todavía no definidos.

Page 62: Intro. a Android Instituto Bosc de la Coma en Olot

ScrollView

Es un contenedor que provee de un mecanismo de scrolling para el contenido de cualquier layout.

Simplemente envolvemos el layout que necesita scrolling

ScrollView determina por si solo si tiene que activarse.

Page 63: Intro. a Android Instituto Bosc de la Coma en Olot

ViewGroup, etc Si lo anterior no resulta suficientemente flexible se puede crear una clase que

herede de ViewGroup (o otros tipos de views) y “overriding” onMeasure, onLayout, podemos de manera programática crear cualquier distribución arbitraria.

A partir de este mismo concepto nos encontramos con montones de widgets compuestos en la plataforma como: spinner, TabHost, etc.

Además, fuera del alcance de estos días existe surfaceView. SurfaceView provee de una superficie embebida y dedicada interna a la jerarquía de la clase view. Hay controles para el formato, tamaño, etc. La idea es de proveer de un lienzo (buffer de altas prestaciones) que permita conectar el hardware con las capas más altas y permitir salida de vídeo, captura de imágenes desde la cámara, 3D optimizado y acelerado por el hardware, etc.

Otros elementos que nos dejamos en el tintero (por ahora?): Selection Widget (y Adapter Array), SelectionSpinner, GridLayout, ListView, AutoCompleteTextView, Gallery, ImageSwitcher, etc.

Page 64: Intro. a Android Instituto Bosc de la Coma en Olot

Adapter ViewLa clase AdapterView es una subclase de ViewGroup cuyas vistas hijas son decididas por un Adaptador que enlaza los datos de algún tipo predefinido (Strings, ViewImages, etc).Tienen dos responsabilidades:

Llenar el layout con la información Gestionar la selección del usuario

Útil cuando es necesario mostra información almacenada o descargada (frente a mostrar recursos o drawablesUseful whenever you need to display stored data en el layout. Gallery, ListView, Spinner, son ejemplos de subclases del Adapter Viewhttp://developer.android.com/guide/topics/ui/binding.html for more info.Vamos a montar un ejemplo…

Page 65: Intro. a Android Instituto Bosc de la Coma en Olot

Usando un ArrayAdapter

Array Adapter tiene tres parámetros:

El contexto (típicamente la instancia de

nuestra actividad) El ID del recurso o vista a usar

(ListView en el caso de la derecha) El Array a usar como opciones.

Otros controles disponibles y muy útiles a cubrir más tarde:

CursorAdapter, convierte datos de un content providers SimpleAdapter, convierte datos de un recurso de XML

//List Activity Layout Definition<?xml version="1.0" encoding="utf-8"?><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:id="@+id/selection" android:layout_width="fill_parent" android:layout_height="wrap_content"/><ListView android:id="@android:id/list" android:layout_width="fill_parent" android:layout_height="fill_parent" android:drawSelectorOnTop="false"/></LinearLayout>

//ListActivity Codepublic class ListViewDemo extends ListActivity {TextView selection;String[] items={"lorem", "ipsum", "dolor", "sit", "amet", "consectetuer", "adipiscing","elit", "morbi", "vel", "ligula", "vitae", "arcu", "aliquet", "mollis", "etiam", "vel","erat", "placerat", "ante", "porttitor", "sodales", "pellentesque", "augue", "purus"}; @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); setContentView(R.layout.main); setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, items)); selection=(TextView)findViewById(R.id.selection); } public void onListItemClick(ListView parent, View v, int position, long id) { selection.setText(items[position]); }}

Page 66: Intro. a Android Instituto Bosc de la Coma en Olot

Creando un menu de contexto// Igual que el ejemplo de antes@Overridepublic void onCreate(Bundle icicle) {... setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, items)); selection=(TextView)findViewById(R.id.selection); ListView list = (ListView)findViewById(R.id.listOfItems); registerForContextMenu(getListView());}

public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo){

if (v.getId()==getListView().getId()) { AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo)menuInfo; menu.setHeaderTitle(items[info.position] + " opciones"); String[] menuItems = getResources().getStringArray(R.array.menu); for (int i = 0; i<menuItems.length; i++) { menu.add(Menu.NONE, i, i, menuItems[i]); } }}

public boolean onContextItemSelected(MenuItem item) {

AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo)item.getMenuInfo(); int menuItemIndex = item.getItemId(); String[] menuItems = getResources().getStringArray(R.array.menu); String menuItemName = menuItems[menuItemIndex]; String listItemName = items[info.position]; selection.setText(String.format("Seleccionado %s para elemento %s",

menuItemName, listItemName)); return true;}

Crear un context menu es tán sencillo como:

Registrar nuestro listView en el método onCreate

Override el método y onCreateContextMenu, a cargo de dibujar el menú

Override el método onContextItemSelected, a cargo de responder a la selección.

Como estamos utilizando una actividad especial (ListActivity) tenemos que utilizar getListView() para obtener una referencia

Page 67: Intro. a Android Instituto Bosc de la Coma en Olot

Q&A

Page 68: Intro. a Android Instituto Bosc de la Coma en Olot

A propósito de recursos

Los siguientes recursos están disponibles para la inclusión de elementos estáticos en nuestra aplicación:

Images (res/drawable): Fotos e Iconos estáticos Raw (res/raw): Para incluir ficheros arbitrarios que tienen

sentido en el contexto de la aplicación, pero no necesariamente al framework de Android.

Strins, colors, arrays, y dimensions (res/values/), para provee de constantes symbolicas y mantenerlas separadas del código (util para internacionalización y localización).

XML (res/xml), para la inclusión estática de estructuras de datos definidas en XML

Page 69: Intro. a Android Instituto Bosc de la Coma en Olot

Strings

Strings pueden almacenar todos los datos textuales de nuestra aplicación (etiquetas, mensages, etc.)

Una idea excelente por la flexibilidad que otorga a la hora de localizar.

Siempre una buena idea para centralizar los recursos que de otra manera típicamente acabarían definidos dentro del código.

Además, podemos aplicar estilos y formatear nuestros recursos.

Page 70: Intro. a Android Instituto Bosc de la Coma en Olot

Intents – Cual es tu “Intentción”

Page 71: Intro. a Android Instituto Bosc de la Coma en Olot

Intro.

Intents son mensajes de sistema que notifican aplicaciones de vaios eventos:

Activity events: lanzamiento de la aplicación, etc.

Cambios del estado de ciertas partes del hardware (pantalla, botón físico apretado, etc).

Es posible crear tu propios Intents para lanzar aplicaciones de manera expresa o implícita.

Page 72: Intro. a Android Instituto Bosc de la Coma en Olot

Intents – Descripción

Actividades, servicios, broadcast receiver todos usan intents para empezar (ser disparados). Cada uno con su mecanismo de resolución.

Intents son estructuras de datos pasivas capaces de mantener una descripción abstracta de una operación (cuando un broadcast de un evento es lanzado).

Es un mecanismo que permite “late run-time binding” para componentes en la misma o diferentes aplicaciones (via intent-filters).

Page 73: Intro. a Android Instituto Bosc de la Coma en Olot

Intent – El objeto Component name: Quien gestiona el Intent? Es el nombre de

una clase (FullyQualified class name, tipo: “com.example.project.app.ActivityName”)

Action: Un String nombrando la acción a realizar. (Mirar Intent class description para obtener una lista de constantes predefinidas para acciones genéricas)

http://developer.android.com/reference/android/content/Intent.html Data: Los datos para ser usados en la acción. (Si la acción es

uns llamada, los datos serían un URI con el número de teléfono) Categoría: String que contienen cualquier información sobre el

tipo de componente que debería gestionar el evento. Extras: Pares de Llave-valor conteniendo información adicional. Flags: Flags predefinidos (por la clase Intent) que proveen de

lógica adicional.

Page 74: Intro. a Android Instituto Bosc de la Coma en Olot

Intent Filter

Expone la funcionalidad de un componente

Usado durante la instalación y arranque.

Define tests para intent implicitos Multiples filtros para un componente,

son OR

Page 75: Intro. a Android Instituto Bosc de la Coma en Olot

Filter II

Action Test TAKE_PICTURE Intent sin acción siempre aceptado

Data/Mime-type test content://contacts/people/1 geo:0,0?q=pizza image/jpeg o text/html Filtros con wildcards aceptan todo lo

especificado

Page 76: Intro. a Android Instituto Bosc de la Coma en Olot

Filter III

Category test: CATEGORY_BROWSABLE Todas las categorías tienen que cohincidir Intents para actividade siempre incluyen

CATEGORY_DEFAULT Usuario puede escoger si hay más de

un target. Excepción si el Target no aparece

Page 77: Intro. a Android Instituto Bosc de la Coma en Olot

Intent Resolution

Dos tipos de Intents: Intents Explicitos: nombran el componente

a ejecutar. Se usan normalmente para componentes internos.

Implicit intents: no especifican un objetivo, el campo

Page 78: Intro. a Android Instituto Bosc de la Coma en Olot

Lanzando un Intent

4 maneras: startActivity() startActivityForResult() sendBroadcast() sendOrderedBroadcas

t() El más común es el

startActivity type Broadcast esta

orientado a eventos y pasar mensajes.

public Button.OnClickListener mBrowse = new

Button.OnClickListener() { public void onClick(View v) { Uri uri =

Uri.parse("http://developer.android.com");

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

}};

public Button.OnClickListener mScan = new

Button.OnClickListener() { public void onClick(View v) { Intent intent = new

Intent("com.google.zxing.client.android.SCAN");

intent.putExtra("SCAN_MODE", "PRODUCT_MODE");

startActivityForResult(intent, 0); }};

// Making a call:String

toDial="tel:"+number.getText().toString();

startActivity(new Intent(Intent.ACTION_DIAL,

Uri.parse(toDial)));

Page 79: Intro. a Android Instituto Bosc de la Coma en Olot

Q&A

Page 80: Intro. a Android Instituto Bosc de la Coma en Olot

The Manifest La función principal es la de actuar

como nexo entre el sistema de Android y tu Aplicación:

Declara los permisos que la aplicación necesitará (uses-permission)

Declara los permisos que la actividades o servicios necesitará (permission)

Provee de instrumentación de elementos (instrumentation)

Define el corazón y las tuberías de la aplicación

Provee de los enlaces que conectan componentes opcionales como mapping, etc. (uses-library)

Determina el SDK target y mínimo para nuestra aplicación.

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

package="com.materiales.android" android:versionCode="1" android:versionName="1.0">

<uses-permissionandroid:name="android.permission.ACCESS_LOCATION" /> <uses-permissionandroid:name="android.permission.ACCESS_GPS" /> <uses-permissionandroid:name="android.permission.ACCESS_ASSISTED_GPS" /> <uses-permissionandroid:name="android.permission.ACCESS_CELL_ID" />

<application> <activity android:name=".Now" android:label="Now"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category

android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity></application>

<uses-sdk android:minSdkVersion="3" android:targetSdkVersion="7" /></manifest>

Page 81: Intro. a Android Instituto Bosc de la Coma en Olot

Application – el corazón del Manifest, el corazón de la App.

Intent-Filter define los tipos de acciones que nuestra App recivirá

Activity define las actividades que nuestra app contiene

Service define los servicios.

También tenemos content providers, declarados con el tag provider.

<application> <activity android:name=".CameraView" android:label="@string/app_name" android:configChanges="keyboardHidden|orientation" android:screenOrientation="landscape"

android:theme="@android:style/Theme.NoTitleBar.Fullscreen"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category

android:name="android.intent.category.LAUNCHER" />

</intent-filter> <intent-filter> <action android:name="android.intent.action.SEND" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="image/*" /> </intent-filter> </activity> <activity android:name="FotoRideManager" android:label="@string/manager_title" android:configChanges="orientation" android:screenOrientation="landscape"> </activity> <activity android:name="FotoRidePreferences" android:label="@string/pref_fotoride_title"> </activity> <service android:name=".FotoRideService" /> </application>

Page 82: Intro. a Android Instituto Bosc de la Coma en Olot

BroadcastReceiver

La respuesta a SendBroadcast.

Clase muy sencilla con un método onRecive(Context, Intent).

Más detalles: http://developer.android.com/

reference/android/content/BroadcastReceiver.html

Lista de todos los Intents de la plataforma:

http://developer.android.com/reference/android/content/Intent.html

<application> .. Activities, Services, etc ..

<receiver android:name=".OnWiFiChangeReceiver"> <intent-filter> <action android:name="android.net.wifi.WIFI_STATE_CHANGED" /> </intent-filter></receiver>

<receiver android:name=".OnBootReceiver"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> </intent-filter></receiver>

<receiver android:name=".OnAlarmReceiver"></receiver>

</application>