TALLER DE INICIACIÓN A ANDROID Eduardo Guzmán José Antonio Montenegro {guzman, monte}@lcc.uma.es Universidad de Málaga
Qué es Android? Una plataforma software y un sistema operativo para dispositivos móviles Basada en el kernel de Linux Desarrollado inicialmente por Google y posteriormente por la Open Handset Alliance (OHA) Permite la escritura de código en Java Permite la escritura de aplicaciones en otros lenguajes y compilarlos al código nativo ARM La plataforma fue anunciada el 5 de Noviembre de 2007 a la vez que se funda la OHA Está presente en móviles, tabletas, auriculares, Relojes, portátiles, netbooks, Google TV, etc.
Qué es Android? Crecimiento en cuanto a presencia en dispositivos
Qué es Android? Su nombre es un homenaje a la novela de Philip K. Dick Sueñan los Androides con Ovejas Eléctricas? Cada versión recibe el nombre en inglés de un postre siguiendo un orden alfabético (fuente: wikipedia): A: Apple Pie (v1.0), Tarta de manzana B: Banana Bread (v1.1), Pan de plátano C: Cupcake (v1.5), Magdalena glaseada D: Donut (v1.6), Rosquilla E: Éclair (v2.0/v2.1), pastel francés conocido en España como pepito, petisú, suso o canuto. F: Froyo (v2.2), (Abreviatura de «frozen yogurt») Yogur helado. G: Gingerbread (v2.3), Pan de jengibre. H: Honeycomb (v3.0/v3.1/v3.2), Panal de miel. I: Ice Cream Sandwich (v4.0), Sándwich de helado. J: Jelly Bean (v4.1/v4.2), Judía de gominola. K: Key Lime Pie (v4.3), Tarta de lima.
Qué es la Open Handset Alliance? Un consorcio de diversas compañías Objetivo: avanzar en el desarrollo de estándares para dispositivos móviles Desarrollan tecnologías que disminuirán significativamente el coste de desarrollo y distribución de dispositivos y servicios móviles
Arquitectura
La plataforma No es específica para un hardware concreto, sino que puede adaptarse a diversas configuraciones Sistema operativo: Utiliza linux para los drivers de los dispositivos, la gestión de la memoria, los procesos y la red. El siguiente nivel contiene las librerías nativas Android Están escritas en C/C++ aunque se invocan a través de interfaces Java Contiene: Gestor de superficie, gráficos 2D y 3D, codecs, una base de datos SQL (SQLite) y un navegador web nativo (WebKit) Máquina virtual Dalvik: ejecuta archivos dex que obtiene, en tiempo de compilación, a partir de clases estándar y archivos jar. Conectividad: Soporta comunicación wireless (GSM, 3G y redes Wi-Fi 802.11)
Desarrollo de aplicaciones Requisitos: Java Android SDK (Software Development Kit) La IDE Eclipse (opcional) Plugin: Android Developer Tools (ADT) Descargar en: http://developer.android.com/intl/es/sdk/index.html
Emulador: Creación de un dispositivo móvil virtual Android Virtual Device Manager
Estructura de un proyecto en Android Carpeta src: código fuente de la aplicación, código de la interfaz gráfica, clases auxiliares, etc. Inicialmente, Eclipse creará por nosotros el código básico de la pantalla (Activity) principal de la aplicación Carpeta res: ficheros de recursos necesarios para el proyecto: imágenes, vídeos, cadenas de texto, etc. /res/drawable/: imágenes de la aplicación /res/layout/: ficheros de definición de las diferentes pantallas de la interfaz gráfica. /res/anim/: definición de las animaciones utilizadas por la aplicación. /res/menu/: definición de los menús de la aplicación. /res/values/: otros recursos como por ejemplo cadenas de texto (strings.xml), estilos (styles.xml), colores (colors.xml), etc. /res/xml/: ficheros XML utilizados por la aplicación. /res/raw/: recursos adicionales.
Estructura de un proyecto en Android Carpeta gen: contiene una serie de elementos de código generados automáticamente al compilar el proyecto. El más importante, quizás, es la clase R.java: contiene una serie de constantes con los ID de todos los recursos incluidos en la carpeta /res/ Podemos acceder fácilmente a estos recursos. Ejemplo: la constante R.drawable.icon contendrá el ID de la imagen icon.png contenida en la carpeta /res/drawable/ Archivo AndroidManifest.xml: Contiene la definición en XML de los aspectos principales de la aplicación, como por ejemplo: su identificación (nombre, versión, icono, ), sus componentes (pantallas, mensajes, ), o los permisos necesarios para su ejecución
Compilación y empaquetado de una aplicación Las aplicaciones una vez compiladas se convierten al formato DEX de Dalvik El código resultante junto con otros datos y recursos se empaquetan en un fichero APK (App PacKage) que es el que se empleará para distribuir e instalar la aplicación Cada APK debe ser firmado con un certificado que identifica al autor
Componentes de una aplicación Android Activity: representan el componente principal de la interfaz gráfica de una aplicación Android. Equivale a una ventana View: componentes básicos con los que se construye la interfaz gráfica (cuadros de texto, botones, listas desplegables, imágenes, etc.) Equivale a los controles Service: Componentes sin interfaz que se ejecutan en segundo plano pueden realizar cualquier tipo de acciones (actualizar datos, lanzar notificaciones, o mostrar activities) Content Provider: mecanismo para compartir datos entre aplicaciones Broadcast Receiver: componente destinado a detectar y reaccionar ante determinados mensajes o eventos globales generados por el sistema (batería baja, SMS recibido, tarjeta SD insertada, etc.) o por otra aplicaciones Intent: Elemento básico de comunicación asíncrona entre componentes Widget
Themes Para dar un estilo consistente a las aplicaciones en Android se utilizan los temas (Themes) El estilo especifica las propiedades visuales (color, altura, tamaño de fuente, relleno) de los elementos que caracterizan el aspecto de la interfaz Android proporciona 3 temas, para la versión Ice Cream Sandwich, de entre los cuales podemos elegir el que más nos guste para nuestra aplicación: Holo light Holo dark Holo light con ActionBar negra Eduardo Guzmán José Antonio Montenegro
Activity Lo más habitual es que una aplicación tenga varias activities En cada momento sólo habrá una activa El control se puede pasar de una activity a otra a través del método startactivity Intent intent = new Intent(this,NuevaActivity.class); startactivity(intent); Tanto para ceder el control de una activity a otra como para pasarle información, se utilizan objetos de la clase Intent Intent intent = new Intent(this, OtraActivity.class); intent.putextra("variable_integer", objeto.getid()); intent.putextra("variable_string", objeto.getnombre()); intent.putextra("objeto_float", objeto.getprecio()); startactivity(intent);
Activity Cómo indicamos recogemos la información enviada a otro Activity a través del Intent? Int vble_integer = getintent().getintextra("variable_integer"); String vble_string = getintent().getstringextra("variable_string"); float vble_float = getintent().getfloatextra("objeto_float");
Activity Cómo indicamos cuál es el Activity que se inicia cuando arranca la aplicación? <activity android:name=".exampleactivity" android:icon="@drawable/app_icon"> <intent-filter> <action android:name="android.intent.action.main" /> <category android:name="android.intent.category.launcher" /> </intent-filter> </activity>
Activity <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res /android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <TextView android:id="@+id/text" android:layout_width="wrap_content android:layout_height="wrap_content android:text="hello, I am a TextView" /> <Button android:id="@+id/button android:layout_width="wrap_content android:layout_height="wrap_content android:text="hello, I am a Button" /> </LinearLayout> Asociado a cada Activity tiene que haber un fichero XML con la descripción de los componentes que contiene En la clase del Activity, cuando se crea, hay que vincular la descripción XML del aspecto que tendrá, con la clase que modelará su comportamiento public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.main_layout); }
Activity setcontentview(r.layout.hello_activity); //cargará el archivo XML Eduardo Guzmán José Antonio Montenegro
Flujo de funcionamiento de un Activity
Activity public class ExampleActivity extends Activity { @Override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); // La activity está siendo creada. } @Override protected void onstart() { super.onstart(); // La activity va a ser visible. } @Override protected void onresume() { super.onresume(); // La activity es visible. }
Activity @Override protected void onpause() { super.onpause(); // Otra activity está recibiendo el foco (ésta va a ser pausada). } @Override protected void onstop() { super.onstop(); // La activity deja de ser visible (está ahora detenida). } @Override protected void ondestroy() { super.ondestroy(); // La activity va a ser destruida. } }
Componentes para construir interfaces Scrollable tabs Fixed tabs Lists
Componentes para construir interfaces Text Fields Spinners Buttons Sliders http://developer.android.com/guide/topics/ui/controls.html Eduardo Guzmán José Antonio Montenegro
Componentes para construir interfaces Progress bar Toggle Button Checkbox Picker Radio Button
View Clase que representa a los componentes para la construcción de las interfaces Ocupa un área rectangular en la pantalla y es responsable de la gestión de: el pintado del componente los eventos que se produzcan Operaciones que admite: Modificar sus propiedades. Ejemplo: cambiar el string que se muestra en un TextView Recibir el foco de la interfaz: requestfocus() Establecer de listeners de eventos Mostrar/ocultarse: setvisibility(int)
View Todo componente visual debe declararse en xml del Activity en el que se encuentra Es donde se especifican sus propiedades <Button android:id="@+id/my_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/my_button_text"/> La propiedad id será la que sirva para luego vincular esta declaración con el objeto correspondiente Button mybutton = (Button) findviewbyid(r.id.my_button); ViewGroup: Clase que modela los layouts, que no son más que contenedores de componentes que se organizan de acuerdo a una determina disposición
Eventos Las acciones que el usuario realiza se traducen en eventos sobre los elementos de la interfaz Android proporciona los mecanismos necesarios para realizar acciones a partir de esos eventos para ello se implementan los event listeners Las interfaces event listener tienen los siguientes métodos, que se activarán en función de la acción que realice el usuario: OnClick: Al tocar la pantalla OnLogClick: Tocar de manera prolongada OnFocusChange: Si se recibe o pierde el foco onkey: al pusar una tecla hardware ontouch: movimiento gestual en la pantalla oncreatecontextmenu: Tras un long click se crea un menú
Eventos // Implementación de OnClickListener private OnClickListener mcorkylistener = new OnClickListener() { public void onclick(view v) { // Hacer algo cuando el botón se pulsa } }; protected void oncreate(bundle savedvalues) { Button button = (Button)findViewById(R.id.corky); // Registramos el listener correspondiente al pulsado del botón button.setonclicklistener(mcorkylistener);... }
Toast Es una pequeña ventana flotante que permite mostrar un breve mensaje La ventana se ajusta automáticamente al tamaño del texto Context context = getapplicationcontext(); CharSequence text = "Hello toast!"; int duration = Toast.LENGTH_SHORT; Toast toast = Toast.makeText(context, text, duration); toast.show(); Puedo determinar cuál será la posición del Toast? toast.setgravity(gravity.top Gravity.LEFT, 0, 0);
Menús A partir de la versión 3.0 (API level 11) los dispositivos Android no tienen por qué tener un botón menú Se añaden los ActionBars Los menús se definen primero en XML en res/menu: <?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android" > <item android:id="@+id/new_game" android:icon="@drawable/ic_new_game" android:title="@string/new_game" android:showasaction="ifroom"/> <item android:id="@+id/help" android:icon="@drawable/ic_help" android:title="@string/help" /> </menu>
Menús Cómo hacemos que se muestre el menú? @Override public boolean oncreateoptionsmenu(menu menu) { MenuInflater inflater = getmenuinflater(); inflater.inflate(r.menu.game_menu, menu); return true; }
Menús Cómo capturamos la acción de seleccionar una opción del menú? @Override public boolean onoptionsitemselected(menuitem item) { switch (item.getitemid()) { case R.id.opcion_menu1: // Realizar acción return true; case R.id.opcion_menu2: // Realizar acción return true; default: return super.onoptionsitemselected(item); } }
Preferencias Podemos almacenar pequeñas piezas de información (nombre de usuario, etc.) Se utiliza la API SharedPreferences Cómo almacenamos información? SharedPreferences sharedpref = getpreferences(context.mode_private); Editor editor = sharedpref.edit(); editor.putstring( clave", valor ); editor.putint( claveint", valorint ); editor.commit(); Cómo recuperamos lo almacenado? SharedPreferences sharedpref = getpreferences(context.mode_private); String str = sharedpref.getstring( clave", "); int num = sharedpref.getstring( claveint", 0); Valores por defecto
Cómo depurar Existe la posibilidad de generar logs de ejecución Android ofrece su propio servicio a través de la clase: android.util.log Todos los mensajes que se generan tienen el siguiente formato: Fecha/hora Gravedad del mensaje (Error, Warning, Info, Debug, Verbose) PID Etiqueta descriptiva (tag) Mensaje Log.e( Error, "Mensaje de error"); Log.w( Warning, "Mensaje de warning"); Log.i( Info, "Mensaje de información"); Log.d( Debug, "Mensaje de depuración"); Log.v( Verbose, "Mensaje de verbose");
Referencias Android developers. http://developer.android.com Desarrolladores de Android en español. http://groups.google.com/group/desarrolladores-android Lars Vogel. Android Development Tutorial. http://www.vogella.com/android.html Desarrollo en Android. http://www.sgoliver.net/blog/?p=1313 Bruce Scharlau, Google Android Mobile Computing. University of Aberdeen, 2010 Shane Conder & Lauren Darcey. Android Wireless Application Development. Addison-Wesley Professional (vol I y II). 2012
I Android SI ERES ESTUDIANTE DE LA E.T.S. INGENIERÍA INFORMÁTICA DE LA UMA, PARTICIPA INDIVIDUALMENTE O EN PAREJA EN ESTE CONCURSO, DESARROLLANDO UNA APLICACIÓN ORIGINAL EN ANDROID ORGANIZA: Patrocinan: BASES DEL CONCURSO EN: www.informatica.uma.es Síguenos también en: @InformaticaUMA