Desarrollo de aplicaciones basadas en Android

Índice
- Introducción
- Objetivos
- 1.Introducción a Android
- 1.1.Pasado, presente y futuro de Android
- 1.2.¿Qué es Android?
- 1.2.1.Kernel o núcleo
- 1.2.2.Bibliotecas
- 1.2.3.Entorno de ejecución
- 1.2.4.Marco de aplicaciones
- 1.2.5.Aplicaciones
- 2.Fundamentos de las aplicaciones
- 2.1.Componentes de una aplicación
- 2.2.Ciclo de vida
- 2.3.Intenciones (Intents)
- 2.4.Content providers
- 2.5.Manifiesto
- 2.5.1.Definición de componentes
- 2.5.2.Definición de requisitos
- 2.6.Recursos
- 2.6.1.Recursos alternativos
- 3.Interfaz gráfica
- 3.1.Elementos de la interfaz gráfica
- 3.1.1.ViewGroup
- 3.1.2.View
- 3.1.3.Fragments
- 3.1.4.Otros elementos de la interfaz gráfica
- 3.2.Events
- 3.2.1.AsyncTask y loaders
- 3.1.Elementos de la interfaz gráfica
- 4.Otras partes del SDK
- 4.1.Almacenamiento de datos
- 4.2.Acceso nativo
- 4.3.Location based application
- 4.4.Comunicaciones
- 4.4.1.Bluetooth
- 4.4.2.NFC
- 4.4.3.SIP
- 4.4.4.Widgets
- 4.4.5.Sincronización de datos
- 5.Herramientas de desarrollo de Android
- 5.1.SDK de Android
- 5.2.Plugin ADT para Eclipse
- 5.3.Depurando la aplicación en dispositivo real
- 5.4.Herramientas de testeo
- 5.5.Otras herramientas
- 5.5.1.DroidDraw
- 5.5.2.Sensor Simulator
- 5.5.3.App Inventor
- 6.Distribución y negocio
- Resumen
- Actividades
- Glosario
- Bibliografía
Introducción
-
No veremos ningún tutorial, por lo que no existirá la descripción sobre cómo hacer un desarrollo paso a paso. Para eso, os proporcionarán recursos existentes fuera del módulo y específicamente diseñados para ello.
-
No os presentaremos una guía de referencia exhaustiva del desarrollo en Android; para ello están las referencias oficiales, que son mucho más amplias y están actualizadas. Sin embargo, os expondremos casos concretos para ayudaros a comprender el desarrollo.
-
Presuponemos que, gracias a otras asignaturas, tenéis bases de programación y de patrones de diseño de software.
Objetivos
-
Que sepáis qué es Android y cuáles son sus posibilidades.
-
Que sepáis cómo funcionan la aplicaciones en Android y dominéis las bases para poder desarrollarlas haciendo uso de las principales herramientas que existen.
-
Que tengáis una visión global de todas las posibilidades que ofrece la plataforma, tanto en lo que respecta a las arquitecturas como en lo referente a API.
-
Que conozcáis el proceso de comercialización de una aplicación Android, de modo que podáis llevarlo a cabo si es necesario, y su posterior seguimiento.
1.Introducción a Android
1.1.Pasado, presente y futuro de Android
1.2.¿Qué es Android?

1.2.1.Kernel o núcleo
1.2.2.Bibliotecas
-
Gestor de superficies (1) : Se encarga de componer, a partir de capas gráficas 2D y 3D, las imágenes que se muestran en la pantalla. Cada vez que la aplicación pretende dibujar algo en la pantalla, la biblioteca no lo hace directamente sobre ella. En vez de eso, realiza los cambios en imágenes (mapas de bits) que almacena en memoria y que después combina para formar la imagen final que se envía a la pantalla. Esto permite realizar con facilidad diversos efectos gráficos.
-
Scalable Graphics Library (SGL): Desarrollada por Skia (empresa adquirida por Google en el 2005) y utilizada tanto en Android como en Chrome (navegador web de Google), se encarga de representar elementos en dos dimensiones.
-
OpenGL for Embedded Systems (OpenGL ES): Motor gráfico 3D basado en las API (2) de OpenGL ES 1.0, 1.1 y 2.0. Utiliza aceleración hardware (si el dispositivo la proporciona) o un motor software altamente optimizado cuando no la hay.
-
Bibliotecas multimedia: Basadas en OpenCORE, permiten visualizar, reproducir e incluso grabar numerosos formatos de imagen, vídeo y audio.
-
WebKit: Motor web utilizado por el navegador (tanto como aplicación independiente como embebido en otras aplicaciones). Es el mismo motor que utilizan Google Chrome y Safari (el navegador de Apple, tanto en Mac como en el iPhone).
-
Secure Sockets Layer (SSL): Proporciona seguridad al acceder a Internet por medio de criptografía.
-
FreeType: Permite mostrar fuentes tipográficas, tanto basadas en mapas de bits como vectoriales.
-
SQLite: Motor de bases de datos relacionales, disponible para todas las aplicaciones.
-
Biblioteca C de sistema (libc): Está basada en la implementación de Berkeley Software Distribution (BSD), pero optimizada para sistemas Linux embebidos. Proporciona funcionalidad básica para la ejecución de las aplicaciones.
1.2.3.Entorno de ejecución
1.2.4.Marco de aplicaciones
-
Administrador de actividades (activity manager): Se encarga de controlar el ciclo de vida de las actividades y la propia pila de actividades. Sobre estas se puede hacer una metáfora con las ventanas de las aplicaciones de escritorio.
-
Administrador de ventanas (windows manager): Se encarga de organizar lo que se muestra en pantalla y de crear, para ello, superficies que pueden ser "rellenadas" por las actividades.
-
Proveedor de contenidos (content provider): Permite encapsular un conjunto de datos que va a ser compartido entre aplicaciones y crear, de esa manera, una capa de abstracción que permita acceder a dichos datos sin perder el control sobre cómo se accede a la información. Por ejemplo, uno de los proveedores de contenido existentes permite a las aplicaciones acceder a los contactos almacenados en el teléfono. Esta biblioteca nos permite crear también nuestros propios proveedores para permitir que otras aplicaciones accedan a información que gestiona la nuestra.
-
Vistas (views): Si antes equiparábamos las actividades con las ventanas de un sistema operativo de PC, las vistas las podríamos equiparar con los controles que se suelen incluir dentro de esas ventanas. Android proporciona numerosas vistas con las que construir las interfaces de usuario: botones, cuadros de texto, listas, etc. También proporciona otras más sofisticadas, como un navegador web o un visor de Google Maps.
-
Administrador de notificaciones (notification manager): Proporciona servicios para notificar al usuario cuando algo requiera su atención. Normalmente, las notificaciones se realizan mostrando alerta en la barra de estado, pero esta biblioteca también permite emitir sonidos, activar el vibrador o hacer pardear los LED del teléfono (si los tiene).
-
Administrador de paquetes (package manager): Las aplicaciones Android se distribuyen en paquetes (archivos .apk) que contienen tanto los archivos .dex como todos los recursos y archivos adicionales que necesite la aplicación, para facilitar su descarga e instalación. Esta biblioteca permite obtener información sobre los paquetes actualmente instalados en el dispositivo Android, además de gestionar la instalación de nuevos paquetes.
-
Administrador de telefonía (telephony manager): Proporciona acceso a la pila hardware de telefonía del dispositivo Android, si la tiene. Permite realizar llamadas o enviar y recibir SMS y MMS, aunque no permite reemplazar o eliminar la actividad que se muestra cuando una llamada está en curso (por motivos de seguridad).
-
Administrador de recursos (resource manager): Proporciona acceso a todos los elementos propios de una aplicación que se incluyen directamente en el código: cadenas de texto traducidas a diferentes idiomas, imágenes, sonidos e, incluso, estructuraciones de las vistas dentro de una actividad (layouts). Permite gestionar esos elementos fuera del código de la aplicación y proporcionar diferentes versiones en función del idioma del dispositivo o la resolución de pantalla que tenga, para poder contrarrestar la fragmentación actual de dispositivos.
-
Administrador de ubicaciones (location manager): Permite determinar la posición geográfica del dispositivo Android (usando el GPS o las redes disponibles) y trabajar con mapas.
-
Administrador de sensores (sensor manager): Permite gestionar todos los sensores hardware disponibles en el dispositivo Android: acelerómetro, giroscopio, sensor de luminosidad, sensor de campo magnético, brújula, sensor de presión, sensor de proximidad, sensor de temperatura, etc.
-
Cámara: Proporciona acceso a las cámaras del dispositivo Android, tanto para tomar fotografías como para grabar vídeo.
-
Multimedia: Conjunto de bibliotecas que permiten reproducir y visualizar audio, vídeo e imágenes en el dispositivo.
1.2.5.Aplicaciones
2.Fundamentos de las aplicaciones
-
Se pueden tener varias aplicaciones compartiendo un recurso (para ello deben tener el mismo user ID), para lo cual es necesario que estén firmadas con el mismo certificado.
-
Si una aplicación sabe de antemano que quiere acceder a recursos como, por ejemplo, la cámara, Bluetooth, etc., debe pedírselo al usuario de forma explícita en el momento de instalarla. Esto se lleva a cabo gracias al manifiesto.
2.1.Componentes de una aplicación
2.2.Ciclo de vida


2.3.Intenciones (Intents)
-
El nombre del componente que queremos avisar. Por ejemplo, la aplicación de correo electrónico.
-
La acción que se quiere lanzar. Por ejemplo, editar, llamar, sincronizar, información de batería baja, etc.
-
Los datos sobre la acción. Por ejemplo, escribir un nuevo correo.
-
La información extra. La dirección de correo del destinatario y el título.
-
Explícita: Se especifica de forma explícita en el código que componente es el encargado de gestionar el intent.
-
Implícita: Es la plataforma la que determina, mediante el proceso de resolución de intenciones, qué componente es el más apropiado para manejar el intent.
2.4.Content providers

-
A es la parte fija para identificar que se trata de un provider.
-
B es el nombre de la clase provider. Es necesario que se declare en el manifiesto.
-
C es el path del content provider, que puede ser nulo (si solo se provee información de un tipo) o tan complejo como se desee si hay varios tipos (por ejemplo, trains/bcn, trains/mdm, etc.).
-
D identifica una fila de los datos de manera única.
-
La URI que hemos visto antes: Si la última parte (D) está presente, se consultará únicamente una fila.
-
El nombre de las columnas que queremos conseguir: Si este parámetro es nulo, significa que queremos todos los datos.
-
Un filtro al estilo SQL: Sería todo lo que puede venir en la sentencia WHERE, pero sin la palabra WHERE en concreto. Si es nulo se entregarán todas las filas.
-
Una serie de argumentos de selección: Al igual que en otros lenguajes de consulta SQL, dentro de vuestros filtros podéis añadir caracteres interrogantes (?), que solo serán conocidos en el tiempo de ejecución. Aquí pondréis los valores correspondientes a esos interrogantes (en caso de existir).
-
Un criterio de ordenación: Al igual que en SQL, podéis definir el orden ascendente o descendente.
2.5.Manifiesto
-
Permisos necesarios para poder funcionar, como acceso a la cámara.
-
El nivel de la API de Android necesario para trabajar.
-
Las características hardware y software necesarias para trabajar (como, por ejemplo, tener cámara o no).
-
Las API que necesita acceder, además de las que están incorporadas en la Android Framework API. Por ejemplo, la librería de Google Maps.
-
Los componentes que forman nuestra aplicación.
2.5.1.Definición de componentes
-
<activity>, que corresponde a una actividad.
-
<service>, para definir un servicio en segundo plano.
-
<receiver>, para definir un receptor de eventos.
-
<provider>, para definir un proveedor de contenidos.
-
La acción (o acciones) a la que está asociado el componente. Este campo es obligatorio y define la estructura del resto del filtro. Aquí se define la acción que se desea (por ejemplo, ACTION_VIEW, ACTION_EDIT, ACTION_MAIN, etc.).
-
La categoría. Sirve para definir información adicional sobre la acción a ejecutar.
-
El tipo. Define el tipo de los datos del intent.
-
Y algunos elementos más, que no son obligatorios.
2.5.2.Definición de requisitos
-
Tipos de pantallas, que se definen en el elemento <supports-screens> y especifican aspectos como el tamaño de la pantalla (con opciones como small, normal, large y extra large) o la densidad de píxeles (con las opciones de low density, medium density, high density y extra high density).
-
Configuraciones de elementos de entrada, definidas en el elemento <uses-configuration>. Si vuestra aplicación requiere algún elemento especial (como los teclados, el trackball, un elemento de navegación direccional, etc.), lo debe especificar en esta sección.
-
Características del dispositivo, definido en <uses-features>, determina si se necesita algún tipo de comunicación específica o algún sensor, o si se requiere cámara.
-
Nivel de la API, definido en el elemento <uses-sdk>. Puede definir un mínimo y un máximo de las versiones del SDK soportadas.
-
Permisos, definido en <permission>. Sirven para limitar el acceso a las partes sensibles del sistema, como android.permission.READ_OWNER_DATA. Estos permisos se deben definir para que la aplicación pueda acceder a esas partes sensibles. También se pueden definir, en el mismo manifiesto, nuevos permisos.
-
Librerías externas, definido en <uses-library>. Tendremos un elemento por cada librería externa.
2.6.Recursos
-
Drawable: Son, básicamente, ficheros de imágenes o animaciones en XML.
-
Layout: Son ficheros que definen el diseño o distribución de los elementos en la pantalla.
-
Values: Son valores de cadenas de caracteres, enteros, colores, etc. que, por ejemplo, son candidatos a ser internacionalizados.
-
Otros pueden ser anim (para ficheros XML de animaciones), raw (para ficheros arbitrario) o menu (para ficheros XML que definen un menú).
2.6.1.Recursos alternativos
-
Operador y nación: Sirve para identificar el operador que nos da la cobertura. Se puede identificar solo al código de nación, o nación y operador. Por ejemplo, mcc310 o mcc310-mnc004.
-
Idioma y región: Lo idiomas con dos posibles componentes separados por un guión. Primero se define el idioma (según ISO639-1) y después se define la región (precedido de la letra r y, después, del código del ISO3166-1-alpha-2). Por ejemplo, fr-rFR, fr-rCA.
-
Tamaño de la pantalla: Hay cuatro tipos, small, normal, large y xlarge.
-
Orientación de la pantalla: Define la orientación actual. Existen dos opciones:
-
port, para orientación de retrato o vertical
-
land, para orientación de paisaje u horizontal
-
-
Modo noche: Indica si es de día o de noche. Es útil para colores, por ejemplo. Tenemos dos opciones: night y notnight.
-
Densidad de la pantalla (dpi): Define varias opciones en número de píxeles posibles según la densidad de la pantalla. Por ejemplo:
-
ldpi: 120 dpi
-
hpdi: 240 dpi
-
xhdpi: 320 dpi
-
-
Modo de entrada de texto primario: Indica el tipo de teclado del que se dispone. Así, podemos tener lo siguiente:
-
nokeys: No se dispone de teclado físico.
-
qwery: Se dispone de un teclado completo.
-
12key: El dispositivo dispone de un teclado de doce teclas.
-
3.Interfaz gráfica
-
Mediante el fichero layout.xml.
-
Mediante la programación de los componentes visuales, como se hace en la mayoría de las aplicaciones de sobremesa.
-
Mediante otras técnicas, que suelen ser la combinaciones de las anteriores (como, por ejemplo, el uso de LayoutInflater).
3.1.Elementos de la interfaz gráfica

3.1.1.ViewGroup
-
FrameLayout: Es el tipo más simple, con un espacio en blanco en el centro (que se puede rellenar con un objeto).
-
LinearLayout: Dispone a todos sus hijos en una sola dirección, horizontal o vertical, uno detrás de otro.
-
ListView: Muestra a todos los hijos en una columna vertical con barra de desplazamiento.
-
TableLayout: Muestra a sus hijos de manera tabular, por columnas o filas.
-
TabLayout: Sirve para dividir nuestra interfaz con pestañas, de manera que podamos tener, en una misma activity, vistas distintas organizadas por pestañas.
-
RelativeLayout: Muestra los elementos de manera relativa a otros elementos o al contenedor. Es uno de los contenedores más utilizados, debido a su versatilidad a la hora de añadir nuevos elementos y a su capacidad para adaptarse a cambios de la interfaz (por nuevos datos, por ejemplo).
-
AbsoluteLayout: Se definen los elementos en función de sus sus coordenadas x e y correspondientes a la esquina superior izquierda.
3.1.2.View
-
WebView: Es un elemento visual que incluye el resultado de visualizar un sitio web. Podéis habilitar o inhabilitar el uso de Javascript para este elemento según os convenga.
-
Gallery: Sirve para mostrar elementos en una galería horizontal. Se selecciona un elemento central, y el siguiente y el anterior se suelen poder ver. Es, en realidad, un contenedor de elementos, pero se suele usar dentro de otros contenedores.
-
Autocomplete: Es una caja de texto, donde se le hacen sugerencias de texto al usuario mientras escribe.
-
Google Map View: Sirve para visualizar elementos objetos utilizando como contenedor un mapa de Google Maps.
3.1.3.Fragments

3.1.4.Otros elementos de la interfaz gráfica
Menús
-
Menú de opciones: Aparece cuando se pulsa el botón menú desde una activity.
-
Menú contextual: Aparece después de pulsar de manera prolongada una view.
-
Submenú: Aparece en caso necesario, cuando se pulsa un elemento de otro menú.
Notificaciones y diálogos
-
AlertDialog: Sirve para mostrar información. Le damos de una a tres opciones al usuario y una lista de elementos entre los que elegir (con checkboxes o radiobuttons).
-
ProgressDialog: Muestra un dialogo que informa que la aplicación está trabajando, y puede determinar su evolución.
-
DatePickerDialog/TimePickerDialog: Sirve para escoger una fecha.

Estilos y temas
Objetos 3D y animaciones
Otras formas de definir la interfaz
3.2.Events
public class HelloWorldActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Button btn = (Button) findViewById(R.id.button); btn.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { Toast.makeText(HelloWorldActivity.this, "Click", Toast.LENGTH_SHORT).show(); } }); } }
-
onClick: Es un clic básico sobre un objeto visual.
-
onLongClick: Es un event de clic sin movimiento de este, pero con una duración más elevada.
-
OnDown: Ocurre cuando un usuario pulsa la pantalla; es decir, en el momento de pulsar. Sería el equivalente al keyDown de una tecla o botón.
-
onScroll: Se trata del event de hacer scroll, tanto vertical como horizontal.
-
onSingleTapUp: Sucede cuando se libera la pantalla pulsada. Por ejemplo, si se realiza con un dedo, tiene lugar cuando se deja de tocar la pantalla (después de la acción táctil).
-
onFling: Es una sucesión de events (tocar la pantalla, mover, dejar de tocar la pantalla). Suele utilizarse para desplazar objetos visuales.
-
ACTION_DOWN: Pulsación de la primera acción de tocar la pantalla.
-
ACTION_POINTER_DOWN: Pulsación de la segunda acción de tocar la pantalla.
-
ACTION_MOVE: Acción de movimiento mientras se tienen los dos puntos pulsados.
-
ACTION_UP: Acción de liberar la pantalla correspondiente a la primera pulsación.
-
ACTION_POINTER_UP: Acción de liberar la pantalla correspondiente a la segunda pulsación.
public class ListenGestouresActivity extends Activity implements OnGesturePerformedListener { private GestureLibrary mLibrary; ... public void onCreate(Bundle savedInstanceState) { ... mLibrary = GestureLibraries.fromRawResource(this, R.raw.numbers); if (!mLibrary.load()) { finish(); } GestureOverlayView gestures =(GestureOverlayView) findViewById(R.id.gestures); gestures.addOnGesturePerformedListener(this); ... } }
public void onGesturePerformed(GestureOverlayView overlay, Gesture gesture) { ArrayList<Prediction> predictions = mLibrary.recognize(gesture); ... Prediction p = predictions.get(i); String text = "got " + p.name + " with a precision of " + p.score; ... }
3.2.1.AsyncTask y loaders
public void onClick(View v) { new DownloadImageTask().execute("http://example.com/image.png"); } private class DownloadImageTask extends AsyncTask<String, Void, Bitmap> { protected Bitmap doInBackground(String... urls) { return loadImageFromNetwork(urls[0]); } protected void onPostExecute(Bitmap result) { mImageView.setImageBitmap(result); } }
-
onPreExecute: Invocado dentro del hilo de la interfaz, justo antes de empezar la tarea. Es útil para actualizar la interfaz gráfica (por ejemplo, con una barra de progreso).
-
doInBackground(Params...): Invocado en un hilo distinto después del onPreExecute. Es donde se realiza el trabajo costoso. En esté método se pueden realizar publishProgress(Progress...) para informar a la interfaz del progreso.
-
onProgressUpdate(Progress...): Invocado en el hilo de la interfaz después de cada llamada al publishProgress(Progress...) (realizado en el paso anterior).
-
onPostExecute(Result): Se ejecuta en el hilo de ejecución de la interfaz al finalizar el trabajo.
-
Se pueden asociar a cada una de las activities o fragments.
-
Permiten recoger datos de manera asíncrona.
-
Monitorizan los recursos, de manera que, cuando hay cambios en los datos, entregan cichos datos automáticamente.
-
Después de un cambio de la configuración, se conectan automáticamente al cursor de los datos antes de dicho cambio, de manera que no es necesario volver a preguntar por dichos datos.
4.Otras partes del SDK
4.1.Almacenamiento de datos
-
mediante las preferencias de la aplicación
-
en ficheros en el almacenamiento interno
-
en ficheros en el almacenamiento externo
-
mediante bases de datos
-
mediante la red
4.2.Acceso nativo
-
Implementando nuestra aplicación de manera tradicional, con las API del SDK de Android, y utilizando JNI para hacer llamadas a nuestros componentes NDK. Está disponible desde la versión 1.5 de Android.
-
Implementando las clases directamente nativas, utilizando la clase NativeActivity. Su definición cambia en el manifiesto, pero el ciclo de vida no. Está disponible desde la versión 2.3 de Android.
4.3.Location based application
4.4.Comunicaciones
4.4.1.Bluetooth
-
Escanear para encontrar otros dispositivos.
-
Pedir al adaptador de Bluetooth local por dispositivos ya enlazados.
-
Establecer canales RFCOMM.
-
Conectar con otros dispositivos mediante el servicio de discovery.
-
Transferir datos a otros y desde otros dispositivos
-
Gestionar múltiples conexiones.
-
BluetoothAdapter: Es el principal punto de acceso en la interacción. Sirve para encontrar, por ejemplo, dispositivos ya enlazados o no, y para crear sockets para comunicaciones con otros dispositivos.
-
BluetoothDevice: Representa un dispositivo al que se puede interrogar sobre información o contra el que se pueden abrir conexiones.
-
BluetoothSocket: Es el canal de comunicaciones para intercambiar información.
-
BluetoothServerSocket: Sirve para recibir conexiones cuando nuestro dispositivo está en modo servidor.
4.4.2.NFC
-
NfcManger: Sirve para gestionar varios adaptadores físicos de nuestros dispositivo en NFC. Como normalmente solo se dispone de uno, se puede usar el método estático getDefaultAdapter.
-
NfcAdapter: Representa nuestro adaptador al dispositivo NFC. Sirve para registrar cambios de tag hacia activity, y para trabajar con mensajes NFED.
-
NfcMessage y NfcRecord: NfcMessage es un contenedor de cero o más NfcRecords. Cada NfcRecord tiene información NDEF.
-
Tag: Representa al objeto pasivo de NFC. Estos tags pueden tener diferentes tecnologías y se pueden preguntar mediante el método getTechList().
4.4.3.SIP
-
Solo está disponible para dispositivos 2.3 o superiores.
-
SIP funciona con una red de datos inalámbricos y, por tanto, no se puede probar en los emuladores, solo en dispositivos físicos.
-
Cada miembro de la comunicación necesita una cuenta SIP (identificada en un servidor SIP).
-
SipManager: Sirve para trabajar con las tareas SIP (como iniciar conexiones o dar acceso a servicios SIP).
-
SipProfile: Define un perfil SIP e incluye la información del servidor y de la cuenta.
-
SipAudioCall: Sirve para gestionar una llamada sobre IP mediante SIP.
4.4.4.Widgets

-
AppWidgetProviderInfo. Sirve para definir, generalmente a través del Android Manifest, la información de configuración del widget. Entre esta información destaca el tamaño mínimo (alto y ancho), el periodo de actualización, el layout visual (definido de igual manera que en el caso de las Activity) y la opción de añadir una Activity sólo dedicada a configurarlo.
-
AppWidgetProvider. El encargado de actualizar el widget según los eventos que vayan llegando. Algunos de los eventos importantes que tiene que gestionar son los de actualización (onUpdate), activación (onEnabled), borrado (onDelete). El más importante es el de actualización, que normalmente se realiza desde un service para evitar bloqueos y el consiguiente mensaje de error de una aplicación que tarda mucho en ejecutarse (ANR: application not responding).
-
El layout propio, que ha sido configurado anteriormente en el primer punto. Se define de igual manera que el caso de las Activity: utilizando un fichero XML y los views tradicionales.
4.4.5.Sincronización de datos
5.Herramientas de desarrollo de Android
5.1.SDK de Android
-
Sqlite3: Herramientas para gestionar bases de datos mediante sentencias SQL.
-
Hprof-conv y dmtracedump: Herramientas para hacer perfilado (en inglés, profiling) de nuestra aplicación; es decir, para mejorar el rendimiento mediante la detección de posibles problemas de memoria o de CPU.
-
Layoutopt y Draw 9-patch: Herramientas para mejorar nuestra interfaz gráfica. La primera, para mejorar y analizar el rendimiento de nuestros layouts y, así, optimizar su rendimiento. La segunda, para la creación de gráficos.
-
Monkey y monkeyrunner: Herramientas para realizar tests de estrés sobre nuestra aplicación.
-
Zipalign, ProGuard: Herramientas para mejorar los ficheros correspondientes a nuestra aplicación.
-
Emulator: El emulador donde podemos probar nuestras aplicaciones.
-
Logcat: Visualizador de los logs de sistema de un dispositivo o emulador.
-
Android: Gestor de los dispositivos virtuales o AVD.
-
Adb: Herramienta para poder ver el estado de nuestro emulador.


5.2.Plugin ADT para Eclipse

5.3.Depurando la aplicación en dispositivo real
-
Marcar vuestra aplicación como debuggable. Para ello debemos fijar el atributo Android:debuggable a valor true.
-
Permitir que se conecte el debugger en vuestro dispositivo En vuestro dispositivo, id a la pantalla principal, pulsad MENU, después Applications > Development > USB debugging.
-
Hacer que vuestro sistema operativo reconozca el dispositivo. Dependerá del sistema operativo que estéis usando para desarrollar.
5.4.Herramientas de testeo
5.4.1.Herramientas de testeo incluidas en el SDK
-
Tests unitarios normales, basados en las librerías de JUnit, pero sin utilizar ni instalar objetos especiales de Android. Sirven para probar la lógica de aplicación, principalmente.
-
Tests unitarios que utilicen la infraestructura de Android.
-
Tests unitarios de estrés.
-
número de events a lanzar
-
limitaciones (como solo lanzar events hacia un paquete de código)
-
tipo y frecuencia de los events
-
opciones de debugging
-
Si queréis testear solo un paquete, y se intenta ejecutar alguna parte fuera de este paquete, la aplicación bloquea esta ejecución, con las posibles consecuencias.
-
Si la aplicación tiene un problema o una excepción no controlada, la herramienta parará e informará sobre el error.
-
Si la aplicación provoca que aparezca un error del tipo "Application not responding", la herramienta parará e informará sobre el error.
5.4.2.Herramientas externas de testeo
-
Roboelectric: Tests unitarios para cada activity de Android.
-
Robotium: Tests de aceptación. Es decir, se lanza la aplicación y vuestro test va realizando acciones como si fuera un usuario normal. Si este test funciona, significa que la parte probada de vuestra aplicación está aceptada y funcionando.
public class EditorTest extends ActivityInstrumentationTestCase2<EditorActivity> { ... public void testPreferenceIsSaved() throws Exception { solo.sendKey(Solo.MENU); solo.clickOnText("More"); solo.clickOnText("Preferences"); solo.clickOnText("Edit File Extensions"); Assert.assertTrue(solo.searchText("rtf")); solo.clickOnText("txt"); solo.clearEditText(2); solo.enterText(2, "robotium"); solo.clickOnButton("Save"); solo.goBack(); solo.clickOnText("Edit File Extensions"); Assert.assertTrue(solo.searchText ("application/robotium")); } ... }
5.5.Otras herramientas
5.5.1.DroidDraw

5.5.2.Sensor Simulator

5.5.3.App Inventor


6.Distribución y negocio
6.1.Firma de la aplicación
-
Dos aplicaciones quieren compartir información en tiempo de ejecución. Esto es debido a que dos aplicaciones con el mismo certificado se pueden ejecutar dentro del mismo proceso y, por tanto, tienen los mismos recursos de sistema, como si fueran un único proceso. Con esto se pueden tener aplicaciones distintas que interactúan intensamente.
-
Modularizar nuestra aplicación. Si tenéis vuestra aplicación dividida en partes y queréis que cada una de estas partes se pueda actualizar por separado, una manera de hacerlo es realizar aplicaciones distintas, pero firmadas con el mismo certificado.
6.2.Versionado de las aplicaciones
-
android:versionCode: Corresponde a un entero que representa la versión del código de la aplicación y es relativo a versiones previas.
-
android:versionName: Es un texto que identifica, para los usuarios, el nombre de la versión. Puede ser algo (como sucede con Android) que identifique la versión de manera decimal (X.Y.Z), para identificar claramente el nivel de cambios de una versión respecto a otra.
6.3.Consideraciones previas a publicación
-
Debéis haber probado la aplicación con dispositivos reales. Como habéis visto anteriormente, existen herramientas en el SDK de Android (y fuera del mismo) que os ayudan a ello. Esto es importante para evitar la frustración de los usuarios y la posible mala reputación de nuestra aplicación.
-
En el caso de que sea necesario, debéis añadir un contrato de licencia de usuario final (EULA), en inglés end user license agreement, para informar de las condiciones de nuestra aplicación y, en especial, de sus repercusiones.
-
Si se trata de una aplicación no gratuita, considerad añadirle una licencia a la aplicación, de manera que podáis gestionara dentro del sistema de licencias de Android.
-
Definir el icono y el nombre de la aplicación.
-
Verificar que vuestros filtros del manifiesto son correctos, de manera que no se podrá instalar la aplicación en un dispositivo o tipo de dispositivo que haya sido probado.
-
Eliminar del código correspondiente la depuración, ya sea de logging excesivo o de otras fuentes.
-
Conseguir las claves propias para producción de librerías, como, por ejemplo, las claves de la API de Google Maps.
-
Realizar la firma para distribuir la aplicación.
-
Finalmente, probar la aplicación firmada en dispositivos reales.
6.4.Publicación y seguimiento
-
Una aplicación gratuita: Puede descargarse fácilmente y ser utilizar sin ninguna restricción. En este caso, suele tratarse de aplicaciones de soporte a negocios mayores fuera del entorno móvil, como bancos, publicidad bajo demanda, etc.
-
Una aplicación gratuita con publicidad: Estas aplicaciones suelen ser muy populares, y lo que consiguen es que la aplicación sea totalmente gratuita. A cambio, el usuario debe ver ciertos anuncios, por ejemplo mediante AdMob.
-
Una aplicación de pago: Son aplicaciones que requieren que el usuario pague por ellas. Por lo general, al usuario final se le da la posibilidad de probar la aplicación durante un corto periodo de tiempo, con la opción de devolverla y retirar el pago.
-
Una aplicación en versión lite: Este tipo de aplicaciones son versiones de aplicaciones de pago que tienen unas funcionalidades reducidas o eliminadas. El objetivo es atraer al usuario final y que este compre la versión de pago.
-
Pagos por bienes virtuales: Se utiliza para pedir pagos en la propia aplicación, que son gestionados por ella. Android tiene actualmente una API para ello, llamada In-app billing. Podéis ver el esquema de pagos en siguiente imagen.
-
Mediante los listados de aplicaciones más recientes: Estas están organizadas por tipo de aplicación (juegos o aplicaciones) y categoría. En este listado de aplicaciones entran todas las nuevas aplicaciones, por lo que el tiempo de permanencia es limitado. Por ello, es importante elegir bien la categoría, sopesando el número de aplicaciones nuevas que van a llegar.
-
Mediante las búsquedas por keywords: Un usuario puede realizar una búsqueda en cualquier momento, por lo que debéis elegir bien las palabras e, incluso, incluir palabras internacionalizadas.
-
Mediante las aplicaciones top: Este listado depende de las descargas y de las valoraciones de los usuarios. Este listado es el más difícil de mantener y, a la vez, el que puede dar mayores beneficios. Para conseguir que se mantenga, es importante que escuchéis a vuestros usuarios y realicéis las mejoras que sugieran. También es bueno que realicéis actualizaciones habitualmente.
Resumen
Actividades
Glosario
- API f
- Sigla de application programming interface
- bytecode m
- Código formado por instrucciones ejecutables independientes del hardware final de la máquina.
- dalvik f
- Maquina virtual Java donde se ejecutan las aplicaciones Android.
- debug m
- Proceso que identifica y corrige errores de programación.
- driver m
- Componente de software responsable de ofrecer acceso a un componente hardware.
- evento m
- Acción que se inicia generalmente fuera del ámbito de aplicación de un programa y que se maneja por un fragmento de código dentro del programa.
- GPS m
- Sigla de global positioning system. El sistema de posicionamiento global determina la posición de un objeto, persona
o vehículo en todo el mundo, pudiendo llegar a precisiones de centímetros, aunque
normalmente hablamos de metros. Fue desarrollado e instalado por el Departamento de
Defensa de Estados Unidos. Para poder dar este servicio se utilizan decenas de satélites
que giran alrededor de la Tierra en una órbita superior a los 20.000 km.
Alternativas al GPS: GLONASS, de la Federación rusa y Galileo, de la Unión Europea. - jUnit m
- Conjunto de bibliotecas utilizadas en programación para hacer pruebas unitarias de aplicaciones Java.
- keywords f
- Palabras clave que pueden servir para identificar un objeto a través de otros conceptos, especialmente útil para búsquedas.
- layout m
- Distribución visual de los objetos gráficos en la aplicación.
- LBS m
- Sigla de location based service. Servicio basado en la posición geográfica del usuario.
- listener m
- Parte del patrón de diseño Observer, que es notificado cuando sucede un evento para el cual ha registrado interés.
- middleware m
- Capa de software encargada de independizar el desarrollo de los detalles que están por debajo.
- modularizar v tr
- Dividir una aplicación en módulos.
- multithreading m
- Aplicado a la industria móvil, quiere decir poder mantener varias aplicaciones ejecutándose a la vez.
- Open GL f
- Especificación estándar que define una API multilenguaje y multiplataforma para escribir aplicaciones que produzcan gráficos 2D y 3D.
- Open Handset Alliance f
- Consorcio de empresas: Broadcom Corporation, Google, HTC, Intel, LG,Marvell Technology Group, Motorola, Nvidia, Qualcomm, Samsung Electronics, Sprint Nextel, T-Mobile y Texas Instruments.
- renderización f
- Proceso de generación de una imagen desde un modelo.
- retrollamada f
- Llamada a un método o función donde uno de los parámetros será una referencia al método o función.
- SQL Lite m
- Motor de base de datos relacionales.
- UI f
- Sigla de user interface. Interfaz gráfica o interfaz de comunicación con el usuario.
- URI m
- Sigla de universal resource identified. Identificador único dentro de la aplicación. Las URL son un tipo de URI.
- WebKit m
- Plataforma para aplicaciones que funciona como base para los navegadores Safari, Google Chrome, Epiphany o Midori, entre otros. Está basada originalmente en el motor de renderizado KHTML del navegador web del proyecto KDE, Konqueror.
- XML m
- Sigla de extensible markup language (lenguaje de marcas extensible). Metalenguaje extensible de etiquetas desarrollado por el World Wide Web Consortium (W3C). Es una simplificación y adaptación del SGML y permite definir la gramática de lenguajes específicos (de la misma manera que HTML, es a su vez un lenguaje definido por SGML). Por lo tanto, XML no es realmente un lenguaje en particular, sino una manera de definir lenguajes para diferentes necesidades.