Primeros pasos en Android

Esto es una ayuda teórico-práctica para familiarizarnos con Android y empezar programando cosas sencillas, para luego ser capaces de llevar a cabo una aplicación más compleja.

Se aconseja leer el contenido de esta ayuda, profundizar en aquellos temas en los que queden dudas siguiendo los enlaces proporcionados, y hacer uso de los ejercicios prácticos y de los ejemplos que provee el SDK.

Contenidos:

  1. Mi primer proyecto Android
  2. Documentación y Ejemplos
  3. Definir una interfaz de usuario
  4. Aplicaciones en Android

Mi primer proyecto Android

El IDE más apropiado para trabajar con Android es Eclipse. Puedes instalar las ADT (Android Development Tools) sobre Eclipse para Java y configurar tu emulador siguiendo las instrucciones de la guía para desarrolladores de Android.

Para crear un nuevo proyecto, en el menú de Eclipse seleccionamos File > New > Project... y en el diálogo que se nos abrirá, Android > Android Project. Entonces debemos introducir:

  1. Project name: elegiremos un nombre para nuestro proyecto, por ejemplo HolaAndroid
  2. Build target: hay que seleccionar para qué plataforma queremos desarrollar; lo mejor es seleccionar siempre la de menor nivel, ya que nos aseguramos compatibilidad con todos los dispositivos Android. Por tanto, elegiremos Android 1.5, que corresponde a la API de nivel 3
  3. Application name: es el nombre de la aplicación, le vamos a llamar Hola Android
  4. Package name: obligatoriamente debemos proporcionar un paquete para la aplicación, el cual debe tener al menos dos niveles. Para la asignaturas usaremos siempre el nivel raíz am, y para este ejemplo añadiremos ejemplo: por tanto, nuestro paquete será am.ejemplo
  5. Create Activity: Toda aplicación debe tener al menos una Activity (más tarde veremos de qué se trata), que será la pantalla que veamos al iniciar la aplicación. Por eso, dejamos el cuadro seleccionado, y le damos un nombre: HolaAndroid

Al pulsar Finish, en el panel que hay en el lado izquierdo llamado Package, veremos que se ha creado nuestro proyecto HolaAndroid.

En el proyecto vamos a encontrar los siguientes contenidos:

Nota: Si en el proyecto aparece el error "The project cannot be built until build path errors are resolved", hay que pinchar con el botón derecho sobre el proyecto y entrar en Build Path > Configure Build Path... En la pestaña "Order and Export" de la propiedad "Java Build Path" deben estar selecciondos los tres elementos: HolaAndroid/src, HolaAndroid/gen y Android 1.5.

Para ejecutar el proyecto en el emulador, si ya hay un dispositivo configurado para la plataforma correspondiente, se puede seleccionar Run [As] > Android Application en el menú de Eclipse o en el que aparece al pinchar con el botón derecho sobre el proyecto. Igualmente, se puede depurar seleccionando Debug en vez de Run.

Si no hay ninguno configurado, nos preguntará si queremos crear uno. Respondiendo afirmativamente, nos abrirá un diálogo llamado Android SDK and AVD Manager, donde podemos crear uno nuevo. Para esto, manteniendo seleccionado en el panel de la izquierda Virtual Devices, pinchamos el botón New... En el diálogo Create new AVD, rellenamos algunos campos:

Cuando pinchemos el botón Create AVD, finalizaremos la configuración y podremos verlo en la lista de dispositivos virtuales. Ya podremos cerrar esa ventana y volver a lo que estábamos haciendo. En el diálogo Android Device Chooser que aparecerá, seleccionaremos Launch a new Android Virtual Device y pincharemos el botón Refresh para cargar la información del dispositivo virtual que hemos creado. Lo podemos seleccionar y pinchar OK.

Tanto si ya existía como si lo acabamos de crear, deberíamos ver al cabo de algún tiempo (tarda un poco en cargarse) esta pantalla:

Como vemos, aparece nuestra aplicación. Se trata de una barra de título donde aparece su nombre y la pantalla definida en main.xml

Documentación y Ejemplos

Se pueden consultar gran cantidad de ejemplos y tutoriales en la pestaña Resources de la página de Android Developers (todo en inglés).

Los ejemplos listados en ella se pueden encontrar también en la instalación del SDK de la máquina virtual, en la carpeta C:\android-sdk-windows\platforms\android-1.5\samples

La API completa (muy documentada) está disponible en la pestaña Reference de Android Developers.

Definir una interfaz de usuario

La forma de crear interfaces en Android es parecida a Java Swing: se dispone de un objeto View raíz, que puede contener una o más View o ViewGroup anidados. Podremos crear, por ejemplo, una plantilla de tipo lineal que contenga en la primera fila un texto, en la segunda fila un campo de edición de texto, y en la tercera un botón para aceptar los datos introducidos.

Esta tarea se puede hacer de tres formas: definiendo toda la estructura en un documento XML (como res/layout/main.xml), mediante código Java, o las dos anteriores conjugadas. Puedes encontrar información general sobre este tema en esta guía sobre la interfaz de usuario, y más detallada sobre cómo crear la plantilla en XML en esta otra guía para declarar plantillas. Si quieres saber cómo acceder a objetos de la interfaz a través del código, consulta los métodos de las clases View y ViewGroup.

Lo más sencillo y visual es definir la interfaz en XML. El código que representaría el ejemplo del principio de este apartado sería el siguiente:

<?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:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/app_name"/>
<EditText android:id="@+id/textBox"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@android:drawable/editbox_background" />
<Button android:id="@+id/buttonOK"
android:text="OK"
android:layout_height="wrap_content"
android:layout_width="fill_parent" />
</LinearLayout>

Sin embargo, las plantillas pueden dar problemas de ejecución incomprensibles. Si las usas, una buena práctica es probarlas primero desde MS-DOS con la herramienta layoutopt.bat (situada en C:\android-sdk-windows\tools de la máquina virtual). Hay información sobre la herramienta y ejemplos de resultados en este enlace. Antes de ejecutarla por primera vez tendrás que editar el ejecutable (botón derecho, Edit) y, en la última línea del fichero, añadir "-jar " antes de "%jarpath%".

Además, es aconsejable no depender únicamente de plantillas porque hay cosas que layoutopt no detectará pero que sin embargo producirán errores del tipo "Sorry! The application [...] has stopped unexpectedly. Please try again." al lanzar la aplicación. El diseño de la plantilla XML anterior puede reproducirse mediante únicamente código como en el ejemplo siguiente:

public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//setContentView(R.layout.prueba);

// LinearLayout
LinearLayout ll = new LinearLayout( this );
ll.setOrientation( LinearLayout.VERTICAL );
ll.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));

// TextView
TextView tv = new TextView(this);
tv.setText(R.string.app_name);
tv.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
ll.addView(tv);

// EditText
EditText et = new EditText(this);
et.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
et.setBackgroundResource(android.R.drawable.editbox_background);
ll.addView(et);

// Button
Button b = new Button(this);
b.setText("OK");
ll.addView(b);

setContentView( ll );
}
Ejercicios propuestos
  1. Crea un nuevo fichero llamado ejemplo.xml en el proyecto HolaAndroid en la carpeta res/layout y copia en él el ejemplo anterior. Ahora, en la Activity HolaAndroid.java, cambia main por ejemplo en la llamada setContentView(R.layout.main). Ejecútalo y observa qué ocurre.

  2. Ahora, cambia el código del método onCreate() por el del ejemplo y comprueba que el resultado es el mismo.

  3. Cambia esta plantilla o algunas de las que hay en C:\android-sdk-windows\platforms\android-1.5\samples\ApiDemos\res\layout para probar las distintas interfaces que puedes generar.

  4. Asocia al botón llamado buttonOK un manejador de eventos de tipo Click. Aquí tienes un ejemplo:

    Button button = (Button)findViewById(R.id.buttonOK);
    button.setOnClickListener(new OnClickListener() {
    public void onClick(View v){
    Toast.makeText(this, "Esto es "+R.string.app_name, Toast.LENGTH_SHORT).show();
    }
    });

    ¿Qué ocurre cuando pulsas el botón? ¿Cómo podrías acceder al texto introducido en el campo textBox para mostrarlo en el mensaje? ¿Cómo cambiaría el código anterior si en vez de en la plantilla añadiste el botón mediante código Java?

Aplicaciones en Android

Al crear un proyecto vimos que necesitábamos tener una Activity y que ésta era la pantalla de entrada de la aplicación. Vamos a aprender algo más sobre ellas y qué otras cosas hay en una aplicación Android.

En realidad, lo que el usuario percibe como una aplicación, se llama "tarea" (task), y es una pila de Activities que se mueven juntas. Como es una pila, al seleccionar la tarea en el menú sólo se ve la que está en lo alto de la pila. Probablemente, interaccionando con la Activity que está visible sea necesario mover otra que está más abajo a lo alto, y entonces será la nueva Activity la que sea visible. El tema de la visibilidad es importante, porque el ciclo de vida de una Activity depende mucho de él. En una misma tarea pueden convivir Activities definidas en aplicaciones diferentes.

Hay cuatro tipos de componentes diferentes en las aplicaciones:

Cuando un componente precisa llamar a otro, lo que hace es lanzar un Intent. Un Intent es un objeto que contiene información sobre el tipo de acción que se necesita y sobre qué datos para que el sistema operativo encuentre el componente más apropiado para llevarla a cabo; o bien especifica un componente concreto ya definido para evitar que sea el sistema operativo el que elija.

Cuando se lanza un Intent, el sistema operativo elige un componente en función de los filtros de Intents que hay definidos para todos los componentes de los que tiene conocimiento. Estos filtros se especifican dentro de la información de cada componente que hay definido en el fichero AndroidManifest.xml

Puedes aprender más sobre cada componente pinchando sobre su nombre, sobre los Intents y los filtros en este artículo y sobre el fichero AndroidManifest.xml en esta ayuda.

Ejercicios propuestos
  1. Vuelve a la aplicación Hola Android y examina el código fuente de su fichero AndroidManifest.xml, identificando:

  2. En el método onCreate() de HolaAndroid.java, añade el código necesario para lanzar un Intent que abra el navegador por defecto en la página www.google.es (te puede venir bien la información de esta página).

  3. Crea una nueva actividad en la aplicación. Para esto, pincha con el botón derecho sobre el paquete am.ejemplo y selecciona New > Class... Hay que darle un nombre, por ejemplo ActividadSecundaria. También hay que hacer que herede de android.app.Activity en lugar de java.lang.Object, que es lo que viene por defecto. Al pulsar Finish, se crea el esqueleto de la Activity.

    Añade la Activity en AndroidManifest.xml: para esto, abre el fichero y selecciona la pestaña Application. Abajo, en el cuadro Application Nodes, pincha Add... y selecciona Activity en el cuadro emergente. Verás que a la derecha han aparecido una serie de campos para insertar la información sobre la nueva Activity. El único campo obligatorio es Name, escribe en él el nombre de la Activity: .ActividadSecundaria, pinchando en otro sitio verás que se actualizan los datos. Guarda y abre el código fuente de este fichero para ver el código nuevo.

    Implementa el método onCreate() de la superclase de forma similar al de HolaAndroid y asígnale una plantilla (layout) diferente, para poder ver que efectivamente cambias de pantalla.

    Ahora, lanza un Intent desde HolaAndroid que haga pasar específicamente a ActividadSecundaria.

    Ejecuta la aplicación para comprobar que lo has hecho todo bien.

  4. Hay dos formas diferentes de usar un Service: comenzarlo con un Intent o usando llamadas tipo RPC. Observa las diferencias entre las dos alternativas y cómo implementarlas con la información contenida en la documentación de Service y con las clases de ejemplo: C:\android-sdk-windows\platforms\android-1.5\samples\ApiDemos\src\com\example\android\apis\app\LocalService.java, LocalServiceController.java y LocalServiceBinding.java