sábado, 31 de diciembre de 2011

Componentes de una aplicación Android: Introducción

En el ultimo post vimos como se estructura un proyecto Android, sus archivos y directorios principales. En las siguientes entradas veremos los componentes esenciales software que podemos utilizar en cualquier aplicación.

  • Activities
  • Servicies
  • Content providers
  • Broadcast receivers

Estos elementos básicos pueden instanciarse, concreción en un objeto-clase determinado, de forma independiente por el sistema en cualquier momento, cada uno existe como una entidad propia y desempeñan un papel específico definiendo el comportamiento de la aplicación.

Para la activación de los componentes, tres de los cuatro tipos de componentes (Activities, Servicies i Broadcast receivers) los activamos a través de mensajes asíncronos conocidos como Intents. Los Intents realizan la comunicación entre componentes en tiempo de ejecución, los componentes pueden ser de nuestra aplicación o cualquier otra. Para los componentes Content providers son activados por petición del ContentResolver, es un objeto que utilizamos para acceder a la información de los contenedores.

En el siguiente post, tratare con más detalles el componente Activity.

jueves, 22 de diciembre de 2011

Estructura de un proyecto Android

Antes de ponerse a "picar" código se tienen que tener algunos conceptos claros. En este post voy a tratar de aclarar cómo se estructura un proyecto Android con sus archivos y directorios principales, para empezar a comprender cómo se se construye una aplicación Android.
En mi caso trabajo con el IDE Eclipse, siempre haré referencia al crear un nuevo proyecto Android en Eclipse.
Al crear un nuevo proyecto Android en Eclipse se genera automáticamente la estructura en un árbol de directorios, será necesaria para poder generar posteriormente la aplicación. Esta estructura será la misma para cualquier aplicación, independientemente de su tamaño y complejidad.
Podemos ver en la pestaña "Package Explorer" la lista de archivos y directorios que ha generado Eclipse:



Carpeta /src/
Es el directorio donde se encuentra todo el código fuente, las clases, de nuestra aplicación. Inicialmente Eclipse crea el código básico de de la pantalla principal de la aplicación, bajo la estructura del paquete java definido. 


Carpeta /res/
Este directorio principal de los recursos, contiene todos los ficheros multimedia para el proyecto como: imágenes, vídeos, cadenas de texto, etc. Todos los ficheros colocados en este directorio son fácilmente accesibles desde la clase R. 
Los diferentes tipos de recursos se deben distribuir entre las siguientes carpetas:
  • /res/drawable/. Contienen las imagenes de la aplicacion. Esta dividida en /drawable-lpdi, /drawable-mdpi y /drawable-hdpi para poder utilizar los recursos adecuados dependiendo de la resolución del dispositivo.
  • /res/layout/. Contienen los ficheros donde se definen las diferentes pantallas de interfaz gráfica. Se oyede dividir /layout y /layout-land para definir distintos layouts dependiendo de la orientación del dispositivo.
  • /res/anim/. Contiene la definición de las animaciones utilizadas por la aplicación.
  • /res/menu/. Contiene la definición de los menús de la aplicación.
  • /res/values/. Contiene otros recursos de la aplicación como cadenas de texto strings.xml, estilos styles.xml, colores colors.xml, etc.
  • /res/xml/. Contiene los ficheros XML utilizados por la aplicación.
  • /res/raw/. Contienen recursos adicionales, normalmente en formato distinto a XML, que no se incluyan en el resto de carpetas de recursos.



Carpeta /Android 4.0.3/
Es la librería de desarrollo de Android (SDK). Podemos ir desplegando el árbol para ver los paquetes y clases que incluye el SDK. Cuando añadamos nuevas librerías o paquetes a nuestro proyecto, aparecerán de la misma forma.


Carpeta /gen/
Contiene los archivos que genera Eclipse de forma automatica al compilar el proyecto, estos ficheros fuente en java estan dirigidos al control de los recursos de la aplicación. 

En la imagen se puede apreciar el fichero R.java que contiene la clase R, es el mas importante en la carpeta. Esta clase R conendrá en todo momento una seria de constantes con los ID de todos los recursos de la aplicación incluidos en la carpeta /res/, para acceder fácilmente a estos recursos desde nuestro código.

Carpeta /assets/
Contiene los demás recursos auxiliares que utiliza la aplicación. Para acceder a los recursos de este directorio se necesita usar la clase AssetManager para leer los datos como un stream de bytes, por lo que es preferible utilizar el directorio /res ya que el acceso a los ficheros es mucho mas sencillo.

Fichero AndroidManifest.xml
Contiene la definicion en XML de los aspectos principales de la aplicación, como su identificación(nombre, versión, icono, etc), sus componentes(pantallas, mensajes, etc), o los permisos especiales necesarios para su ejecución. Es el archivo que de configuración de la aplicación. 

Fichero project.properties
Fichero que genera automáticamente Eclipse y del que de momento no nos preocuparemos.


Una vez tenemos el proyecto compilado, en el directorio /bin/ aparecen diferentes ficheros y carpetas:
  • /bin/classes/. Aquí están las clases compiladas
  • /bin/claseses.dev Es el ejecutable obtenido a partir de las clases compiladas
  • /bin/myProject.apk Es la aplicación Android.

lunes, 19 de diciembre de 2011

Android 4.0: Lo más destacado para desarrolladores

En este post resumire las nuevas características para desarrolladores introducidas por la última versión 4.0.

Framework de la interfaz de usuario unificado:
Permite a los desarrolladores crear aplicaciones para todos los dispositivos que funcionen con Android 4.0, teléfonos, tablets, etc. Esto implica realizar diseños coherentes, simplificación de código y desarrollo racionalizado entre toda la gama de dispositivos con Android.

Comunicación y intercambio:
En esta versión amplia las características sociales y las de intercambio en cualquier aplicación del dispositivo.  En las aplicaciones se pueden integrar contactos, datos de un perfil, elementos en stream,  eventos de calendario… a partir de cualquier actividad del usuario o desde las redes sociales.
  • API Social: permite a los desarrolladores añadir a las aplicaciones interacciones con varias redes sociales y fuentes de contactos.
  • API del calendario: facilita agregar servicios de calendario a las aplicaciones.
  • API para mensajes de voz: permite construir aplicaciones con acceso a mensajes de voz.
  • Android Beam:  esta basado en Near Field Communication y permite a los usuarios compartir instantáneamente información sobre las aplicaciones. Para los desarrolladores es una nueva forma de desencadenar cualquier tipo de interacción entre dispositivos basada en la proximidad.
  • Widget de distribución modular: el framework UI incluye un nuevo widget, ShareActionProvider, que permite integrar la funcionalidad de compartir la UI en la barra de acción de las aplicaciones.

Nuevas capacidades de comunicación/difusión:
  • Streaming multimeda de bajo nivel: Android 4.0 ofrece una ruta directa y eficiente de bajo nivel para streaming multimeda. La plataforma contiene una nueva API nativa sobre la base de Khronos OpenMax AL1.0.1.
  • Nuevas capacidades de la cámara:  Los desarrolladores pueden usar una variedad de características de la nueva cámara de Android 4.0. Exposicion ZSL, enfoque continuo y zoom permite a las aplicaciones de captura de imágenes o video obtener mejores resultados. También se podrán tomar instantáneas mientras se está capturando video.Y incluye un detector que identifica rostros y puede devolver la posición del rostro en la pantalla.
  • Transformación de imagen y vídeo: Un conjunto de filtros para transformaciones de alto rendimiento permiten a los desarrolladores aplicar efectos a  una imagen pasándola como una textura de OpenGL ES 2.0. Los desarrolladores pueden ajustar niveles de color y brillo, cambiar fondos, mejorar, recortar, rotar, añadir distorsión de lentes y aplicar otros efectos.
  •  Control remoto de Audio: añade una nueva API de control remoto de audio que permite r a las aplicaciones multimedia integrarse con los controles de reproducción que se muestran en una vista remota.
  • Nuevos codecs i containers: se añade soporte para tipos de media adicionales y contenedores para dar acceso a todos los formatos que necesitan los desarrolladores.

Nuevos tipos de conectividad:
  • Wi-Fi Direct: Los desarrolladores pueden utilizar este framework API para descubrir y conectarse directamente a dispositivos cercanos.  Sin necesidad de conexión a Internet o un hotspot.
  • Bluetooth Health Device Profile (HDP): Ahora los desarrolladores pueden crear interesantes aplicaciones médicas que utilicen Bluetooth para comunicarse con los dispositivos inalámbricos y sensores en los hospitales, gimnasios, casas y otros lugares. Usando el framework API podemos desarrollar aplicaciones para descubrir dispositivos cercanos, establecer canales de datos fiables o streaming y gestionar la trasmisión de datos.  Para dispositivos certificados como monitores de ritmo cardíaco, medidores de sangre, termómetros, etc.
Nuevos componentes i capacidades de la UI:
  • Mejoras de diseño: Un nuevo diseño, GridLayout, mejora el rendimiento de las aplicaciones mediante el uso de jerarquías más horizontales para vistas más rápidas de diseños y representaciones.
  • OpenGL ES texture views: Un nuevo objeto TextureView permite a los desarrolladores integrar directamente texturas OpenGL.
  • Acelaración hardware para representación 2D: Todos los dispositivos con Android 4.0 requieren soportar aceleración por hardware para representación 2D. Los desarrolladores pueden usar este punto para añadir efectos en la UI manteniendo un rendimiento óptimo en pantallas de alta resolución.

Nuevos tipos de entradas y servicios de texto:
  • Punteros, botones de apoyo y eventos hover: Incluye soporte completo para los eventos de entrada de un puntero, incluyendo los ejes de inclinación y distancia, la presión y propiedades relacionadas con un evento de movimiento. Los desarrolladores pueden aprovechar estas características para dotar de sus aplicaciones, precisión  de dibujo y gestos, la escritura y el reconocimiento de formas, etc.
  •  API para la integración de correctores ortográficos: Android 4.0 permite a las aplicaciones consultar servicios de texto disponibles como diccionarios y correctores ortográficos.

API para mejorar la accesibilidad:
Se añaden nuevas características de accesibilidad y una API mejorada para permitir a los desarrolladores mejorar la experiencia del usuario en sus aplicaciones, especialmente en dispositivos que no disponen de botones físicos.
  • API de accesibilidad: Para que las aplicaciones gestionen las interrelaciones con mayor eficiencia cuando las características de accesibilidad estén habilitadas, la plataforma agrega eventos de accesibilidad para el modo de explorar por tacto(explore-by-touch mode), desplazamiento y selección de texto.
  • Text-to-Speech API: este nuevo Framework API permite a los desarrolladores escribir motor de Text-to-SPeech y ponerlo a disposición de cualquier aplicación que solicite capacidades TTS.

Uso eficiente de la red:
En esta última versión de Android, los usuarios pueden ver el tráfico de datos que se están utilizando de sus aplicaciones en ejecución. También se pueden establecer limites sobre el trafico de datos según el tipo de red y desactivar el uso de datos para aplicaciones epsecificas.  La plataforma permite consultar el tipo de conexión y disponibilidad para las aplicaciones, los desarrolladores pueden utilizar esta información para gestionar de forma dinámica las solicitudes de red.
Seguridad para las aplicaciones y contenido:
  • Administración segura de credenciales:  Android 4.0 hace que sea fácil para las aplicaciones gestionar autentificaciones i sesiones seguras. Una nueva API llavero(Keychain API) y almacenamiento cifrado subyacente para que las aplicaciones puedan almacenar y recuperar las claves privadas y sus certificados corresponientes.
  • Espacio de direcciones Layout Randomization: ofrece un espacio de direcciones aleatorias del diseño (ASLR) para ayudar a proteger las aplicaciones del sistema y de terceros .
Mejoras para la empresa:
  • API de Cliente VPN:  Con el permiso del usuario, las aplicaciones pueden configurar las direcciones y las reglas de enrutamiento, el proceso de paquetes entrantes y salientes y establecer rutas seguras a un servidor remoto.
  • Dispositivo de gestión de políticas para la cámara: La plataforma añade una nueva política de control para los administradores que gestionan los dispositivos mediante el Administrador de dispositivos. Ahora se pueden deshabilitar remotamente las cámaras en un dispositivo para usuarios que trabajen en ambientes sensibles. 

El framework  todavía ofrece elementos de la UI y las APIs de la versión 3.x, incluyendo cargadores de contenido, las notificaciones y los widgets de tamaño variable para la pantalla de inicio.

sábado, 17 de diciembre de 2011

Arquitectura Android

Para el desarrollo de aplicaciones para Android es básico conocer la arquitectura del sistema es decir, como está estructurado el sistema operativo.

 La arquitectura de Android está formada por varias capas que facilitan el desarrollo de aplicaciones. Esta distribución permite acceder a las capas más bajas utilizando librerías para que el desarrollador no tenga que programar a bajo nivel las funcionalidades para hacer uso de los componentes hardware de los teléfonos.
Este tipo de arquitectura permite a cada capa utilizar elementos de la capa inferior para realizar sus funciones, el siguiente diagrama muestra la arquitectura Android:


Ahora explicare cada una de las capas, desde la más baja hasta la más alta:
  • Kernel Linux: El núcleo del SO Android está basado en el kernel de Linux v2.6 para los servicios del núcleo del sistema como la seguridad, la gestión de memoria, gestión de procesos, la pila de red y el modelo de controlador. Parecido a cualquier distribución de Linux pero adaptada a las características hardware de los dispositivos móviles  en las se ejecuta Android.  Actúa como una capa de abstracción entre el hardware y el resto de las capas de la arquitectura. Esto quiere decir que el desarrollador no accede directamente a esta capa, debemos utilizar las librerías disponibles de las capas superiores. 
  • Librerías: Esta capa se sitúa justo sobre el kernel y esta compuesta por las bibliotecas nativas de Android. Android incluye un conjunto de librerías utilizadas por diversos componentes del sistema, estas funcionalidades están accesibles para los desarrolladores  a través del framework de aplicaciones Android. A continuación resumo algunas de las bibliotecas del núcleo:
    1.  System C library: una implementación BSD e la libreria del sistema C estándar (libc) ajustada para dispositivos basados en Linux.
    2. Media Libraries: basadas en PacketVideo's OpenCORE: la libreria soporta reproducción y grabación de los formatos más populares, como archivos de imágenes estáticas, incluyendo MPEG4, H.264, MP3, AAC, AMR, JPG y PNG.
    3. Surface Manager: administra los accesos al subsistema de la pantalla.
    4. LibWebCore:  un motor de navegador web.
    5. SGL: motor para gráficos 2D.
    6. 3D libraries: una implementación basada en la APIs OpenGL ES1.0.
    7. FreeType: representación de bitmaps y vectores fuente.
    8. SQLite: un motor de base de datos relacional potente y ligero disponible para todas las aplicaciones.
  • Entorno de ejecución: En el diagrama no se considera como una capa en sí mismo, ya que también está formado por librerías. Está compuesta por las librerías con las funcionalidades habituales de Java en conjunto con otras específicas de Android.  La máquina virtual Dalvik es el componente principal del entorno de ejecución Android, las aplicaciones se codifican en Java y son compiladas con un formato especifico para esta máquina virtual los ejecute.  Dalvik es una variación de la máquina virtual de Java, por lo que no es compatible con el bytcode de Java. Java es usado únicamente como el lenguaje de programación y los ejecutables se generan con el SDK de Android y tienen su propia extensión específica para Dalvik.
  • Framework de aplicaciones: Esta capa esta formada por todas las clases y servicios que utilizan directamente las aplicaciones para realizar sus funciones.  La gran mayoría de los componentes de esta capa son librerías Java que acceden a los recursos de las capas inferiores a través de la máquina virtual Dalvik. El framework de aplicaciones está compuesto por: 
    1. Activity Manager: Se encarga de administrar la pila de actividades de nuestra aplicación así como su ciclo de vida.
    2. Windows Manager: Se encarga de organizar lo que se mostrará en pantalla. Básicamente crea las superficies en la pantalla que posteriormente pasarán a ser ocupadas por las actividades.
    3. Content Provider: Esta librería es muy interesante porque crea una capa que encapsula los datos que se compartirán entre aplicaciones para tener control sobre cómo se accede a la información.
    4. Views: En Android, las vistas los elementos que nos ayudarán a construir las interfaces de usuario: botones, cuadros de texto, listas y hasta elementos más avanzados como un navegador web o un visor de Google Maps.
    5. Notification Manager: Engloba los servicios para notificar al usuario cuando algo requiera su atención mostrando alertas en la barra de estado. Un dato importante es que esta biblioteca también permite jugar con sonidos, activar el vibrador o utilizar los LEDs del teléfono en caso de tenerlos.
    6. Package Manager: Esta biblioteca permite obtener información sobre los paquetes instalados en el dispositivo Android, además de gestionar la instalación de nuevos paquetes. Con paquete nos referimos a la forma en que se distribuyen las aplicaciones Android, estos contienen el archivo .apk, que a su vez incluyen los archivos .dex con todos los recursos y archivos adicionales que necesite la aplicación, para facilitar su descarga e instalación.
    7. Telephony Manager: Con esta librería podremos realizar llamadas o enviar y recibir SMS/MMS, aunque no permite reemplazar o eliminar la actividad que se muestra cuando una llamada está en curso.
    8. Resource Manager: Con esta librería podremos gestionar todos los elementos que forman parte de la aplicación y que están fuera del código, es decir, cadenas de texto traducidas a diferentes idiomas, imágenes, sonidos o layouts. En un post relacionado a la estructura de un proyecto Android veremos esto más a fondo.
    9. Location Manager: Permite determinar la posición geográfica del dispositivo Android mediante GPS o redes disponibles y trabajar con mapas.
    10. Sensor Manager: Nos permite manipular los elementos de hardware del teléfono como el acelerómetro, giroscopio, sensor de luminosidad, sensor de campo magnético, brújula, sensor de presión, sensor de proximidad, sensor de temperatura, etc.
    11. Cámara: Con esta librería podemos hacer uso de la(s)  cámara(s) del dispositivo para tomar fotografías o para grabar vídeo.
    12. Multimedia: Permiten reproducir y visualizar audio, vídeo e imágenes en el dispositivo.
  • Aplicaciones. En la última capa, la más alta se incluyen todas las aplicaciones del dispositivo, tanto las que tienen interfaz de usuario como las que no, las nativas (programadas en C o C++) y las administradas (programadas en Java), las que vienen preinstaladas en el dispositivo y aquellas que el usuario ha instalado. En esta capa encontramos también la aplicación principal del sistema: Home o launcher, porque es la que permite ejecutar otras aplicaciones mediante una lista y mostrando diferentes escritorios donde se pueden colocar accesos directos a aplicaciones o incluso widgets, que son también aplicaciones de esta capa. 
Con todo esto podemos llegar a la conclusión de que Android nos proporciona un entorno sumamente poderoso para que podamos desarrollar aplicaciones para realizar cualquier funcionalidad. Nada dentro de Android es inaccesible y podemos “trastear” siempre con las aplicaciones de nuestro móvil para optimizar cualquier tarea.

El potencial de Android está basado en el control total que se la da al usuario para que haga con su móvil un dispositivo a su medida.

Empezando!

Hola a todos!

Este blog esta dedicado a la publicación de artículos para el desarrollo de aplicaciones Android. Mi idea principal para este blog, es que a lo largo de cada post iré resolviendo una funcionalidad de una aplicación nativa para Android orientada a la ultima versión de la plataforma Android 4.0.x y compatible con las anteriores.

Eso no quiere decir que no trate otros temas, también publicare soluciones a problemas que me he ido encontrado a lo largo de mi corta experiencia en este mundo. Empezare publicando la recopilación de información que hice para empezar a desarrollar proyectos Android desde cero.

Espero que toda la información, código, etc de este blog sea útil y animo sinceramente a que participen enviando comentarios acerca sus experiencias.

Cualquier sugerencia, critica o idea será bienvenida.