Page 72
__rendered_path__11
Proyecto Fin de Carrera
Desarrollo de aplicaciones para dispositivos móviles sobre la plataforma Android de Google
3.12.4
Archivo AndroidManifest.xml
Un elemento imprescindible en cualquier aplicación para Android es el archivo
denominado “AndroidManifest.xml”. Este archivo, generado de forma automática por el
plug-in de Eclipse, representa un manifiesto escrito en XML que describe de forma
genérica cada uno de los componentes que forman la aplicación (a saber: Activity,
Broadcast Intent Receiver, Service y Content Provider). Esta descripción abarca
aspectos como sus capacidades y requisitos, las clases que los implementan, los datos
que pueden manejar o cuándo deben ser lanzados. En este fichero también pueden
concretarse permisos y políticas de seguridad que afectan a toda la aplicación.
__rendered_path__11
Formato del manifiesto
La estructura que ha de tener este importante documento se muestra a continuación a
través de un básico DTD. No se han incluido en él los atributos que pueden llevar
algunos elementos, ya que excedería el objetivo ilustrativo que persigue, pero sí se
indica su cardinalidad:
__rendered_path__50
__rendered_path__50
<!ELEMENT manifest
__rendered_path__51
(uses-permission*, permission*, instrumentation*, application?)>
__rendered_path__50
<!ELEMENT application
__rendered_path__50
(activity+, receiver*, service*, provider*)>
__rendered_path__52
<!ELEMENT activity
__rendered_path__52
(intent-filter*, metadata*)>
__rendered_path__54
<!ELEMENT receiver
__rendered_path__54
(intent-filter*, metadata*)>
__rendered_path__57
<!ELEMENT service
__rendered_path__57
(intent-filter*, metadata*)>
__rendered_path__54
<!ELEMENT provider
__rendered_path__54
(metadata*)>
__rendered_path__60
<!ELEMENT intent-filter
__rendered_path__60
(action+, category+, data*)>
__rendered_path__60
__rendered_path__60
__rendered_path__54
Código 10. DTD reducido de un fichero “AndroidManifest.xml”
__rendered_path__54
__rendered_path__60
__rendered_path__60
Los elementos XML que se pueden encontrar en la declaración del manifiesto se
__rendered_path__60
describen en las siguientes líneas:
__rendered_path__60
__rendered_path__60
<manifest>: el nodo raíz, bajo el cuál se declararán todos los contenidos del
__rendered_path__60
manifiesto.
__rendered_path__54
__rendered_path__54
<uses-permission>: declara requisitos de seguridad para que el paquete
__rendered_path__60
pueda ser desplegado correctamente.
__rendered_path__60
__rendered_path__60
Jaime Aranaz Tudela
72
__rendered_path__60__rendered_path__54__rendered_path__54__rendered_path__57__rendered_path__57__rendered_path__72__rendered_path__72__rendered_path__73__rendered_path__72__rendered_path__72__rendered_path__74__rendered_path__74__rendered_path__85__rendered_path__85
Ingeniería en Informática

Page 73
Proyecto Fin de Carrera
Desarrollo de aplicaciones para dispositivos móvile
Un elemento especialmente interesante dentro del fichero “AndroidM
merece la pena extender un poco más es
Jaime Aranaz Tudela
Ingeniería en Informática
__rendered_path__12
__rendered_path__12
__rendered_path__12
__rendered_path__12
__rendered_path__12
__rendered_path__12
__rendered_path__12
__rendered_path__12
__rendered_path__12
__rendered_path__12
__rendered_path__12
__rendered_path__11
s sobre la plataforma Android de Google
<permission>: define permisos utilizados para restringir a los componentes de
esta aplicación el acceso a ciertos servicios de Android.
<instrumentation>: declara componentes utilizados para probar la
funcionalidad de este u otro paquete.
<application>: elemento raíz que enumera, uno por uno, los componentes
básicos que constituyen la presente aplicación. Contempla muchos atributos que
matizan su configuración.
<activity>: representa un componente Activity presente en la aplicación,
encargado de representar una acción concreta y generalmente asociado a una
__rendered_path__11
interfaz de usuario. Deberá haber tantos elementos <activity> como
componentes Activity haya en la aplicación.
<intent-filter>: declara lo que se denomina un Intent Filter, encargado de
describir cuándo y dónde puede ejecutarse la Activity de la que pende. Mediante
este elemento se especifica qué acciones puede manejar la presente actividad, es
decir, qué elemento Intent puede atender. Permite además la inclusión de varios
atributos que matizan su funcionamiento.
<action>: acción soportada por la Activity.
<category>: categoría de la Activity.
<data>: datos aceptados por la Activity.
<meta-data>: metadatos sobre la Activity definidos por el desarrollador.
<receiver>: elemento que representa a un componente Broadcast Intent
Receiver, cuya misión es lanzar una acción en respuesta a un evento. Deberá
haber tantos elementos <receiver> declarados como componentes Broadcast
Intent Receiver haya en la aplicación.
<service>: este elemento se corresponde con un componente Service presente
en la aplicación, encargado de ejecutar una acción en background. Deberán
aparecer tantos elementos <service> como componentes Service haya en la
aplicación.
<provider>: elemento que encarna a un componente Content Provider,
utilizado en la aplicación para almacenar y compartir datos. Debería haber tantos
elementos <provider> declarados como componentes Content Provider haya
en la aplicación.
anifest.xml” y que
<intent-filter>. Tal y como se expone en
__rendered_path__12
73

Page 74
__rendered_path__11
Proyecto Fin de Carrera
Desarrollo de aplicaciones para dispositivos móviles sobre la plataforma Android de Google
el listado anterior, este elemento especifica cuándo y dónde puede ejecutarse una
determinada Activity.
En Android, cuando una aplicación está ejecutándose, quiere realizar una determinada
acción y necesita para ello algún componente externo entre los disponibles (como, por
ejemplo, abrir una página web o utilizar un visor de imágenes) lanza lo que se denomina
un Intent. Este elemento contiene información sobre quién desea hacer algo, qué desea
hacer y cómo desea hacerlo. Es entonces cuando Android utiliza los Intent Filter
declarados en los “AndroidManifest.xml” para filtrar y decidir: compara en cada uno de
ellos el valor del elemento <intent-filter> y averigua qué aplicación es la más
óptima para hacerse cargo de la acción requerida.
__rendered_path__11
Manifiesto de “Hola Mundo”
En el ejemplo anteriormente visto, “Hola Mundo”, se puede encontrar el siguiente
“AndroidManifest.xml”, generado de forma automática por el plug-in de Eclipse:
__rendered_path__48
__rendered_path__48
<?xml version="1.0" encoding="utf-8"?>
__rendered_path__49
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
__rendered_path__48
package="com.android.hola">
__rendered_path__48
__rendered_path__50
<application android:icon="@drawable/icon"
__rendered_path__50
android:label="@string/app_name">
__rendered_path__52
__rendered_path__52
<activity android:name=".HolaMundo" android:label="@string/app_name">
__rendered_path__55
<intent-filter>
__rendered_path__55
<action android:name="android.intent.action.MAIN" />
__rendered_path__52
<category android:name="android.intent.category.LAUNCHER" />
__rendered_path__52
</intent-filter>
__rendered_path__52
</activity>
__rendered_path__52
__rendered_path__55
</application>
__rendered_path__55
__rendered_path__60
</manifest>
__rendered_path__60
__rendered_path__55
__rendered_path__55
Código 11. Manifiesto del ejemplo “Hola Mundo”
__rendered_path__55
__rendered_path__55
__rendered_path__60
En este manifiesto, primero se declara el documento como un XML válido y se adjunta
__rendered_path__60
un espacio de nombres adecuado en el elemento <manifest>, así como el paquete al
__rendered_path__55
que pertenece con el atributo package.
__rendered_path__55
__rendered_path__52
A continuación, existe un elemento <application> que se dispone a declarar los
__rendered_path__52
componentes que forman la aplicación completa. Recuérdese que solamente puede
__rendered_path__52
haber un único elemento <application> por manifiesto. El atributo android:icon
__rendered_path__52
indica que existe un recurso del tipo “drawable”, ubicado en la carpeta
__rendered_path__55
HolaMundo\res\drawable y de nombre “icon”, que debe ser usado como el icono
__rendered_path__55
Jaime Aranaz Tudela
74
__rendered_path__52__rendered_path__52__rendered_path__52__rendered_path__52__rendered_path__52__rendered_path__52__rendered_path__55__rendered_path__55__rendered_path__48__rendered_path__48__rendered_path__49__rendered_path__48__rendered_path__48__rendered_path__50__rendered_path__50
Ingeniería en Informática

Page 75
__rendered_path__11
Proyecto Fin de Carrera
Desarrollo de aplicaciones para dispositivos móviles sobre la plataforma Android de Google
representativo de esta aplicación. Además, el atributo android:label señala que
existe también un recurso, de tipo string y con nombre “app_name”, que será la etiqueta
de texto visible para el usuario. Este recurso se encontrará ubicado en la carpeta
HolaMundo\res\values, dentro del fichero “strings.xml”.
Dentro del elemento <application> se declara el único componente que constituye la
aplicación, un componente Activity. El elemento <activity> declara un atributo
androide:name que especifica el nombre de la clase que implementa dicha Activity,
así como la misma etiqueta de texto “app_name” para darle un nombre visible, a través
del atributo android:label.
Por último, la Activity declarada lleva asociado un Intent Filter, que anuncia cómo y
__rendered_path__11
cuándo debe ser lanzada dicha actividad. El elemento <intent-filter> define,
mediante los elementos <action> y <category>, que la presente actividad ha de ser
considerada la clase principal de la aplicación (android.intent.action.MAIN) y
que se ha de ejecutar cuando el usuario quiera lanzar la aplicación “Hola Mundo”
(android.intent.category.LAUNCHER).
3.13 Definición de interfaces de usuario con XML
En el ejemplo de “Hola Mundo”, se crea una sencilla interfaz consistente únicamente en
una ventana con un título desde la que se imprime un mensaje. Esta interfaz está
embebida en el propio código fuente; en casos tan sencillos como éste, cambiar la
interfaz para ampliarla o sencillamente para darle un aspecto completamente nuevo a
nuestra aplicación sería tarea fácil.
Sin embargo, piénsese ahora en aplicaciones para Android mucho más complejas, con
cientos o miles de líneas de código fuente dedicadas únicamente a la interfaces de
usuario que pueda tener. Este código acaba siempre vinculándose en exceso al resto de
código fuente ajeno a la interfaz, provocando que ligeros cambios de interfaz
signifiquen muchas horas de trabajo en cambios y nuevos diseños del código completo.
Por ello, Android contempla una forma más sencilla, y sobre todo independiente, de
configurar interfaces de usuario sin tener que afectar apenas al código fuente de la
aplicación.
El método alternativo para construir interfaces en Android consiste en utilizar ficheros
escritos en XML y configurar en ellos los aspectos relacionados con esas interfaces. El
fichero XML resultante se vincula al proyecto simplemente ubicándolo en la carpeta de
recursos “\res\layout” y referenciándolo brevemente en el código fuente.
Por ejemplo, una forma de utilizar XML para crear la misma interfaz de usuario que ya
se tenía en “Hola Mundo” sería la siguiente:
Jaime Aranaz Tudela
75
Ingeniería en Informática

Page 76
__rendered_path__11
Proyecto Fin de Carrera
Desarrollo de aplicaciones para dispositivos móviles sobre la plataforma Android de Google
__rendered_path__14
__rendered_path__14
<?xml version="1.0" encoding="utf-8"?>
__rendered_path__15
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
__rendered_path__14
android:layout_width="fill_parent"
__rendered_path__14
android:layout_height="fill_parent"
__rendered_path__16
android:text="Hello, Android"/>
__rendered_path__16
__rendered_path__18
__rendered_path__18
Código 12. Ejemplo de interfaz con XML
__rendered_path__18
__rendered_path__18
__rendered_path__22
El formato del fichero es muy simple: consiste en construir un árbol de elementos, de tal
__rendered_path__22
forma que cada elemento se corresponda con el nombre de una clase View válida (como
__rendered_path__11__rendered_path__18
TextView) y utilizar los atributos y la anidación de elementos para configurar el tipo
__rendered_path__18
de interfaz que se desee.
__rendered_path__25
__rendered_path__25
En el Código 12 se puede comprobar como se define, en primer lugar, el documento
__rendered_path__14__rendered_path__27
XML como un documento válido. A continuación, se indica un único elemento
__rendered_path__14__rendered_path__27
<TextView>, que se corresponde con la clase TextView utilizada ya anteriormente.
__rendered_path__15
Observamos los siguientes atributos:
__rendered_path__14
__rendered_path__14
xmlns:android: declara el espacio de nombres Android válido.
__rendered_path__54
android:layout_width: indica qué cantidad del ancho de la pantalla ha de
__rendered_path__54
ser ocupado por este elemento View. En este caso, se declara que la caja de texto
ocupe toda la pantalla.
android:layout_height: declara qué cantidad del alto de la pantalla va a
__rendered_path__54
ocupar el elemento View al que hace referencia. Al igual que antes, en este caso
se desea que ocupe todo el alto de la pantalla.
android:text: simplemente indica el texto que se desea mostrar en este
__rendered_path__54
elemento View.
Para comprobar su funcionamiento, se deben realizar dos pasos:
1. Sustituir el contenido del fichero “main.xml” presente en la carpeta
“\res\layout”, por el XML presente en el Código 12.
2. Cambiar el fichero fuente “HolaMundo.java” para que tenga contenido mostrado
en el Código 13:
__rendered_path__14
__rendered_path__90__rendered_path__14
package com.android.hola;
__rendered_path__92
__rendered_path__14
import android.app.Activity;
__rendered_path__14
import android.os.Bundle;
__rendered_path__16
__rendered_path__16
public class HolaMundo extends Activity {
__rendered_path__93
__rendered_path__18
__rendered_path__18
Jaime Aranaz Tudela
76
__rendered_path__96__rendered_path__25__rendered_path__25__rendered_path__96__rendered_path__25__rendered_path__25__rendered_path__93__rendered_path__18__rendered_path__18__rendered_path__102__rendered_path__22__rendered_path__22__rendered_path__93__rendered_path__18__rendered_path__18__rendered_path__93__rendered_path__18__rendered_path__18__rendered_path__90__rendered_path__14__rendered_path__14__rendered_path__92__rendered_path__14__rendered_path__14__rendered_path__16__rendered_path__16
Ingeniería en Informática

Page 77
__rendered_path__11
Proyecto Fin de Carrera
Desarrollo de aplicaciones para dispositivos móviles sobre la plataforma Android de Google
__rendered_path__14
__rendered_path__12__rendered_path__14
/** Called when the activity is first created. */
__rendered_path__15
@Override
__rendered_path__14
public void onCreate(Bundle savedInstanceState) {
__rendered_path__14
super.onCreate(savedInstanceState);
__rendered_path__16
setContentView(R.layout.main);
__rendered_path__16
}
__rendered_path__17
}
__rendered_path__37
__rendered_path__37
__rendered_path__17
Código 13. Código fuente de “Hola Mundo” usando interfaz en XML
__rendered_path__37
__rendered_path__37
__rendered_path__41
El único cambio presente en “HolaMundo.java” es la eliminación de las referencias a la
__rendered_path__11__rendered_path__46
clase TextView, sustituyéndolas por una única llamada a setContentView(). Este
__rendered_path__46
método accede al diseño o layout llamado “main” presente en el fichero de recursos
__rendered_path__17
“R.java”. En este, como se recordará, quedan declarados de forma completamente
__rendered_path__37
automática, y sin intervención del desarrollador, todos los tipos de recursos existentes
__rendered_path__37
en la carpeta “\res”.
__rendered_path__50
__rendered_path__54
Más adelante, en esta misma memoria, se detallarán los aspectos concernientes a la
__rendered_path__54
construcción de interfaces de usuario más complejas utilizando declaraciones en
__rendered_path__50
formato XML.
__rendered_path__54
__rendered_path__54
__rendered_path__17
__rendered_path__37
__rendered_path__37
Jaime Aranaz Tudela
77
__rendered_path__57__rendered_path__59__rendered_path__59__rendered_path__60__rendered_path__59__rendered_path__59__rendered_path__61__rendered_path__61
Ingeniería en Informática

Page 78
__rendered_path__11
Proyecto Fin de Carrera
Desarrollo de aplicaciones para dispositivos móviles sobre la plataforma Android de Google
4 CONTACTMAP: LOCALIZADOR DE CONTACTOS
En este capítulo se explica paso a paso el desarrollo completo de ContactMap, una
aplicación cuyo objetivo es localizar y mostrar en un mapa los contactos almacenados
en el dispositivo, añadiendo además otra serie de funcionalidades.
Mediante este desarrollo se busca ilustrar de una forma más práctica las características
principales que ofrece Android y pretende además servir como ejemplo para la creación
de otras aplicaciones.
__rendered_path__11
Algunos de los aspectos más interesantes de Android y que se explican con esta
aplicación son los siguientes:
Uso de componentes Activity.
__rendered_path__34
Uso de componentes Service.
__rendered_path__34
Solicitudes a través de Intents.
__rendered_path__34
Utilización de los servicios de Google Maps.
__rendered_path__34
Comunicaciones por HTTP.
__rendered_path__34
Uso de la base de datos SQLite.
__rendered_path__34
Composición del archivo “AndroidManifest.xml”.
__rendered_path__34
Acceso a la información de los contactos.
__rendered_path__34
Acceso a información sobre el propio dispositivo.
__rendered_path__34
Uso de interfaces remotas con AIDL.
__rendered_path__34
Composición de interfaces de usuario, tanto con código como con XML.
__rendered_path__34
Declaración y uso de recursos externos.
__rendered_path__34
Composición gráfica de elementos en pantalla.
__rendered_path__34
Gestión de opciones de menú.
__rendered_path__34
Control del GPS.
__rendered_path__34
Control de la conexión Wi-Fi.
__rendered_path__34
Llamadas telefónicas.
__rendered_path__34
Envío de SMS.
__rendered_path__34
Envío de correo electrónico.
__rendered_path__34
4.1 Análisis y diseño de la aplicación
4.1.1 Introducción a ContactMap
El objetivo básico de ContactMap es mostrar al usuario la ubicación geográfica de los
contactos que tenga almacenados en el propio dispositivo móvil. Para ello utiliza
fundamentalmente tres servicios:
Jaime Aranaz Tudela
78
Ingeniería en Informática

Page 79
__rendered_path__11
Proyecto Fin de Carrera
Desarrollo de aplicaciones para dispositivos móviles sobre la plataforma Android de Google
Google Maps, para mostrar al usuario las localizaciones de los contactos
__rendered_path__12
La señal GPS del propio dispositivo móvil, para conocer la propia localización
__rendered_path__12
Una conexión a Internet, con el fin de poder intercambiar información de
__rendered_path__12
localización con los demás usuarios.
El usuario visualiza la situación geográfica de sus contactos gracias a los mapas y
servicios de Google Maps, que son ofrecidos por Android a través de una serie de API
específicas. El uso de esta potente herramienta permite tener acceso a miles de imágenes
y mapas, convirtiéndose en uno de los elementos de Android que más juego está dando
en todo tipo de aplicaciones dentro de la recién creada comunidad de desarrolladores.
Así mismo, la aplicación utiliza el componente GPS presente en el mismo dispositivo
__rendered_path__11
móvil para conocer la propia ubicación, pudiendo de este modo tanto mostrársela al
usuario en el mapa como comunicársela al resto de usuarios. El servicio de GPS,
aunque todavía hoy no es de los accesorios más extendidos en los dispositivos móviles,
sí que lo será a corto plazo al estar incluido en muchos de los nuevos modelos de
smartphones a la venta (el primer teléfono con Android, el modelo HTC G1, incluye
GPS de serie) y todo parece indicar que en pocos años su incorporación será tan
frecuente como lo es hoy la cámara digital o el reproductor de música.
ContactMap no requiere la presencia de GPS para poder funcionar, pero su ausencia
significa que el usuario no podrá conocer su propia ubicación ni, por tanto,
comunicársela a los demás usuarios.
Por otro lado, mediante el establecimiento de una conexión a Internet a través de la
Wi-Fi, la aplicación ContactMap realiza intercambios de información sobre
localizaciones con los demás usuarios. Este intercambio no se realiza nodo a nodo, es
decir, entre cada usuario, sino que existe un servidor central donde cada uno de los
usuarios consulta las localizaciones de sus contactos, además de actualizar su propia
localización. Este intercambio se realiza utilizando el estándar XML y sobre el
protocolo HTTP, aunque el funcionamiento mas detallado de esta comunicación y el del
servidor se detalla en apartados posteriores.
Al igual que con el GPS, no es imprescindible disponer de manera constante de una
conexión a Internet para que ContactMap pueda mostrar las ubicaciones de los
contactos. Por defecto, ContactMap intenta mostrar la ubicación más reciente de cada
usuario, pero en caso de no poder conectarse mostrará siempre la última ubicación
conocida. Por ello sí es necesario conectarse al menos una vez para obtener las
localizaciones correspondientes
Además de mostrar ubicaciones geográficas, ContactMap permite también realizar otra
serie de acciones asociadas a cada uno de los contactos como, por ejemplo, realizar una
llamada telefónica, enviar un mensaje de texto o escribir un correo electrónico.
Jaime Aranaz Tudela
79
Ingeniería en Informática