Desarrollando The Time Box, mi primera aplicación para Android

El ecosistema Android ha ido madurando de manera muy acelerada en los últimos años, y lo que comenzó como un proyecto piloto se ha convertido en el segundo jugador (o primero según el mercado) móvil a nivel mundial, y aprender a desarrollar para él de manera nativa puede ser una opción interesante, sobre todo si ya hemos trabajado en plataformas como Windows Phone o iOS.

Esto me llevó a hacer el año pasado un curso de Coursera sobre Desarrollo de aplicaciones para Android, y, con lo aprendido, hacer mi primera aplicación. En este artículo cuento mi experiencia desarrollando la misma, así como las herramientas y los recursos utilizados en este primer viaje por el ecosistema Android.

Descarga The Time Box desde Google Play

La aplicación

The Time Box es una mezcla entre lista de tareas y cronómetro, con opción de poder agregar manualmente las horas y minutos transcurridos de la actividad deseadas. Este es el aspecto que ha tenido desde la primera vez que tuve algo «depurable» hasta la versión actualmente disponible en la tienda:

Presentation1

Tras la primera versión, Sergio Moya, compañero de aventuras, me sugirió utilizar material design, y gracias a las guías disponibles y a las opciones de compatibilidad con terminales antiguos, pude adaptar la mayor parte del diseño sin demasiados problemas.

Lenguaje

Para programar en android podemos utilizar Java, o desde algunas versiones C++ para trabajo intensivo de procesador, como juegos. También podemos utilizar otros lenguajes que compilen a la VM como es el caso de Clojure, Scala o Kotlin de Jetbrains, siendo este último una alternativa interesante, ya que se trata de un lenguaje de más alto nivel, orientado a objetos y dinámico. Tras probarlo durante un par de iteraciones volví a Java, aunque no descarto utilizarlo en un futuro.

Arquitectura

architecture_app

La aplicación cuenta con tres vistas (actividades como se denominan en Android), un controlador de tabs, dos fragmentos personalizados y varias clases auxiliares para el manejo de los datos.

Componentes externos

La aplicación emplea dos componentes adicionales:

  • Joda-time: Aporta una mejor gestión de fechas y horas a las clases existentes de Java
  • SugarORM: Un mapper relacional muy sencillo que permite tener una pequeña base de datos sqlite donde almacenar los datos, que además cuenta con soporte para migraciones.

Testing

Actualmente el proyecto cuenta con algunos tests unitarios, y la idea es que los tests vayan aumentando a medida que se necesite más funcionalidad para evitar pruebas manuales, que al final son las que más tiempo consumen.

Herramientas

Las herramientas para el desarrollo Android también han mejorado mucho últimamente, podemos utilizar Eclipse con el plugin ADT, o también podemos emplear Android Studio, basado en InteliJ IDEA y soportado oficialmente por Google.

Para poder depurar nuestra aplicación, lo mejor y más rápido es contar con un dispositivo físico, o varios, ya que hemos de probar con diferentes versiones. Podemos además recurrir a emuladores como Genymotion, que al estar basado en VirtualBox, nos proporciona una máquina virtual muy rápida y fluida, lejos del pobre rendimiento que proporciona el emulador oficial.

Publicación y subida

Para poder publicar en Google Play (de momento no he considerado otros marketplaces como el de Amazon, aunque están en mi lista) necesitamos pagar la cuota de inscripción, que son $25 y que nos dan acceso permanente, sin necesidad de renovar. Como la aplicación es gratuita y (de momento) no usa publicidad, el proceso de registro es bastante simple. Una vez que tenemos la aplicación lista, basta con generar el APK desde nuestro editor, subirlo a la plataforma y llenar la información relativa al título, descripción, así como algunas imágenes.

Una de las cosas más interesantes que ofrece la plataforma son las opciones de Alpha y Beta, ya que podemos tener hasta tres versiones subidas de la aplicación al mismo tiempo para tres grupos distintos de usuarios sin tener que recurrir a servicios externos.

Conclusiones

Esta pequeña utilidad que espero seguir mejorando con el tiempo me ha permitido tener un primer contacto con la plataforma y reencontrarme con Java después de varios años. Es una experiencia muy interesante y aporta una visión adicional si trabajas con varias plataformas.

Descarga The Time Box desde Google Play

Recursos

Material Design

8 cosas aprendidas de Android en el Codemotion 2014

En el pasado Codemotion 2014 pude asistir a varias charlas relacionadas con el desarrollo de aplicaciones para Android, en las que pude aprender y recordar algunos conceptos y herramientas que resumo en este pequeño artículo:

1. Model-View-Presenter

Fuente: Wikipedia DE
Fuente: Wikipedia DE

El patrón Model View Presenter es muy similar a Model View ViewModel en la base, ya que tanto el ViewModel como el Presenter notifican a la vista de los cambios, y reciben los comandos de la misma.

En el caso de Android, se propone el uso de Interfaces entre Presenter y la Vista, de manera que trabajamos, con clases abstractas, consiguiendo cierta independencia con las implementaciones.

2. Arquitecturas hexagonales

El uso de las clases abstractas con los MVP es lo que deriva en una arquitectura hexagonal, en la que mediante puertos (que es como se denominan estas interfaces) nuestra lógica de negocio se comunica con las diferentes abstracciones de la vista y diferentes servicios como comunicaciones o almacenamiento.

Fuente: VICTOR SAVKIN
Fuente: VICTOR SAVKIN

En el caso concreto de Android, la lógica de negocio puede estar completamente aislada en un módulo Java puro, lo que da una mayor independencia de la plataforma.

3. Documentación de calidad mantenida por la comunidad

android-guides

Los manuales de android guides, creados por los chicos de codepath, contienen (a fecha de hoy) más de 100 artículos con guías prácticas de desarrollo, cubriendo temas como fragments, persistencia, o guías completas como cómo empezar con gradle. Resultan verdaderamente interesantes y desde luego es un lugar a añadir a mi lista de favoritos.

4. Motores de Inyección de dependencias

De la misma manera que tenemos ninject en .NET o bien podemos crear nuestro propio motor, para Android tenemos Dagger (para inyección de dependencias en general) y Butterknife (para inyectar vistas), que nos permiten gestionar las dependencias de nuestros objetos (para implementar una arquitectura hexagonal como la que hemos definido anteriormente, por ejemplo).

5. Bases de datos y almacenamiento

url

En función de las necesidades que tengamos, hay dos proyectos que deberíamos tener en cuenta:

  • SugarORM, permite tener una base de datos local de manera extremadamente simple y manejable.
  • ORMLite compatible con cualquier proyecto de Java y permite una mayor personalización y estructuras un poco más complejas, además de estar más extendido en la comunidad.

Además, podemos o bien utilizar la clase ContentProvider para almacenar datos, o bien usar los adaptadores propios del sistema operativo, aunque se recomiendan las dos opciones anteriores.

Web: SugarORM (no confundir con SugarCRM): http://satyan.github.io/sugar/
Web: ORMLite: http://ormlite.com/

6. Testing

Para desarrollo Android tenemos muchas herramientas para hacer testing, desde JUnit que nos permite además de código Java estándar probar código específico para la plataforma, pasando por Mockito para crear artefactos para nuestros tests, y acabando con Espresso, para probar la UI de nuestra aplicación.

7. Programación reactiva

La programación reactiva o Reactive Programming es un paradigma que se basa en el flujo de datos, actualizando la visualización de los mismos a través del envío y recepción de mensajes. Es un tema verdaderamente interesante, ya que mezcla conceptos de programación funcional con patrones de lenguajes orientados a objetos como observer.

8. Otros lenguajes

Uno de los puntos fuertes de la JVM es la capacidad para ejecutar otros lenguajes más allá de Java, de esta manera podemos usar lenguajes como Kotlin (creado por Jetbrains), Groovy o incluso Clojure para hacer aplicaciones Android. El soporte para otros lenguajes es algo que está en proceso, pero que podemos tener en cuenta (Android Studio se lleva bastante bien con Kotlin, por ejemplo). Si nos vamos fuera de la JVM tenemos opciones como Xamarin que nos permite desarrollar apps para Android usando C#.

Conclusiones

Esta lista es solamente un resumen de varias charlas y conversaciones tenidas durante el evento. El ecosistema Android es muy interesante, no solo por todas las herramientas y técnicas disponibles, que una vez aplicadas se pueden llevar a otras plataformas, sino además por la comunidad que tiene, no solamente Android sino el lenguaje Java y los lenguajes basados en la JVM.

Nos vemos en la siguiente, aquí te dejo un recopilación de todas las charlas del Codemotion: https://docs.google.com/spreadsheets/d/14ZjJQ_VeT8mKmO8MANA1Os5zwRA3Pu_rpFdfyFtBZ4A/edit#gid=0