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

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.
- Artículo: MVP on Android: http://antonioleiva.com/mvp-android/
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.

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.
- Charla: From legacy to hexagonal: https://speakerdeck.com/akelael/from-legacy-to-hexagonal-codemotion-madrid-2014
- Libro: Working effectively with legacy code: http://www.amazon.com/Working-Effectively-Legacy-Michael-Feathers/dp/0131177052
3. Documentación de calidad mantenida por la comunidad
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.
- En Github: Android Guides: https://github.com/codepath/android_guides/wiki
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).
- En Github: Butterknife: http://jakewharton.github.io/butterknife/
- En Github: Dagger: http://square.github.io/dagger/
5. Bases de datos y almacenamiento
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.
- Artículo: Espresso: http://www.genbetadev.com/desarrollo-aplicaciones-moviles/espresso-framework-android-para-hacer-tests-de-la-interfaz-de-usuario
- Charla: Jorge Barroso sobre «Todo lo que siempre quisiste saber de testing»: http://es.droidcon.com/2014/2014/07/algunas-cosas-que-siempre-quiso-saber-sobre-testing-y-nunca-se-atrevio-preguntar-jorge-barroso/
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.
- Artículo: Introducción a Reactive Programming: https://gist.github.com/staltz/868e7e9bc2a7b8c1f754
- Documentación: Introduction to ReactiveX: http://reactivex.io/intro.html
- Github: RXJava: https://github.com/ReactiveX/RxJava
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#.
- Post: Groovy on Android: http://melix.github.io/blog/2014/06/grooid.html
- Post: Clojure on Android: https://github.com/krisc/events/blob/master/tutorial.md
- Xamarin Android: http://developer.xamarin.com/guides/android/getting_started/
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