Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Conociendo Android

Conociendo Android

Tips y trucos aprendidos a lo largo de mi experiencia desarrollando apps para la plataforma.

Andrés Santibáñez

April 17, 2019
Tweet

More Decks by Andrés Santibáñez

Other Decks in Programming

Transcript

  1. Conociendo Android • Tips y trucos aprendidos durante mi experiencia

    con la plataforma. • Threading • Cambios de Configuración • Lifecycle • Arquitecturas • DataBinding • Permisos • Librerías
  2. Android • Sistema Operativo para Móviles. • Android Inc. •

    Linux. • 2003: Inicialmente para cámaras. • 2005: Adquisición por parte de Google. • 2008: G1. Primer teléfono Android.
  3. Versiones de Android • 2009: 1.5 Cupcake (primer fuente público)

    • 2009: 1.6 Donut (soporte CDMA) • 2009: 2.0-2.1 Eclair • 2010: 2.2 Froyo • 2010: 2.3 Gingerbread • 2011: 3.0 Honeycomb (solo para tablets ) • 2011: 4.0 Ice Cream Sandwich • 2012 - 2018: Jelly Bean, KitKat, Lollipop, Marshmallow, Nougat, Oreo, Pie • 2019: Q (¿?)
  4. Versiones de Android • Cada nueva versión trae consigo un

    nuevo “API level” • Kitkat 4.4 (19) • SMSProvider. Solo la app default de SMS puede escribir mensajes. • Lollipop 5.0 (21) • Soporte para Material Design. • Marshmallow 6.0 (23) • Solicitud de Permisos en Runtime. • Doze Mode • Nougat 7.0 (24) • Multi-Window developer.android.com
  5. Desarrollo en Android • Lenguajes • Java • Kotlin (2017)

    • C++ • IDE • Android Studio - IntelliJ
  6. Apps en Android • Cada app corre en un VM.

    • Sandbox. • No se puede comunicar con otras aplicaciones directamente. • Se “comunican” a través de Intents. • Cada app corre en un proceso Linux. • El SO es el encargado de iniciar y terminar el proceso.
  7. Apps en Android • Código Compilado • Código + Recursos

    • Resultado: .apk • APK debe ser “firmado” para poder ser instalado en dispositivos. • Google Play.
  8. Componentes • Esenciales • Activity • Service • Broadcast Receiver

    • ContentProvider • Se declaran en AndroidManifest.xml
  9. Activity • “Punto de entrada para interactuar con el usuario”

    • Pantalla + Interfaz • Una App puede permitir que otras aplicaciones ejecuten sus Actividades. Ejemplo: Redactar un correo, Enviar un Tweet.
  10. Activity • XML + Código • También puede ser todo

    código " • Puede ser host de Fragmentos • Fragmento: interfaz + comportamiento. • Disponibles desde Honeycomb
  11. Activity - Fragment • Los Fragmentos permiten descomponer una Actividad

    grande en varios componentes más pequeños. • Ejemplo: Gmail.
  12. Service • Punto de entrada para cualquier tarea que tenga

    que ejecutarse por largo tiempo. • No debe confundirse con threads/hilos. • Corre en el MainThread de Android • Usos: música en segundo plano, descargas, sincronización de datos, etc. • Ejemplo: Spotify
  13. Broadcast Receiver • Enviar anuncios/mensajes a través de la Aplicación

    • Internos • Systemwide • Parecido a un Bus de Datos. Clientes se suscriben a qué notificaciones desean recibir: • Nuevo SMS • Batería Baja • GPS Activado • Pueden “Despertar” apps que no estén corriendo. • Ejemplo: Dropbox
  14. Content Provider • Permite compartir contenido a lo largo de

    la aplicación • Incluso con otras aplicaciones. Ejemplo: Agenda de Contactos, Calendario. • “Abstrae” el lugar físico en donde se encuentra la información a través de URIs • Agenda: • App Contactos: Almacenados en SQLite • Otra App: “contacts://all/”
  15. Conociendo Android • Tips y trucos aprendidos durante mi experiencia

    con la plataforma. • Threading • Cambios de Configuración • Lifecycle • DataBinding • Arquitecturas • Permisos • Librerías
  16. Control de Versiones • Enviar TODO. • Ignorar todos los

    archivos generados por Android Studio en la fase de compilación. • *.iml • .idea/ • Recientemente el .gitignore default del proyecto viene con esta configuración.
  17. Utilizar Kotlin • 100% interoperable con Java. • Desde código

    Java podemos llamar código Kotlin y viceversa. • Conciso y Extendible • Código Seguro • Programación Funcional • Adoptado por Google gracias al empuje de la comunidad.
  18. Threading • Inicio de App en Main Thread • UI

    Thread • No debemos bloquear este hilo • Application Not Responding (ANR) • 5 segundos sin respuesta a inputs (touch events) • Crear nuestros propios hilos en background y refrescar el UI
  19. Threading • Crear nuestros propios hilos en background y refrescar

    el UI en el MainThread • Podemos crear hilos de cualquier manera siempre y cuando respetemos el MainThread. • Threads + Runnables, AsyncTask, Courutines (Kotlin), RxJava2, etc • No Silver Bullet • Actualmente RxJava2
  20. Cambios de Configuración • Cambios del entorno en el cuál

    está corriendo nuestra aplicación: • Orientación de Pantalla: De Portrait a Landscape • Disponibilidad de Teclado • Ejecución de Multi-Window • Densidad de Pantalla • etc • Nuestras apps deben comportarse correctamente ante estos cambios.
  21. Cambios de Configuración • Google • “android prevent screen rotation”

    • https://stackoverflow.com/questions/2730855/prevent- screen-rotation-on-android • android:screenOrientation="portrait"
  22. Cambios de Configuración • ¿Por qué sucede “este reinicio”? •

    El SO provee de nuevos recursos a la App según el cambio de configuración experimentado. • El SO necesita liberar memoria RAM para poder ejecutar otras aplicaciones. • Apps con las que el usuario desea interactuar. • El SO no solo elimina de la memoria Actividades, sino todo el Proceso en el que se ejecuta la App. • Cada App debe saber como restaurar su estado al punto en que el usuario dejó de interactuar con ella.
  23. Cambios de Configuración • ¿Cómo? • Android provee un esquema

    para guardar el estado de la app. • onSaveInstanceState + ids en Views • El SO es el encargado de gestionar los cambios/datos que se desean mantener. • 50KB o menos recomienda Google • Debe ser combinado con otros mecanismos de persistencia de datos: • Base de Datos, SharedPreferences, Archivos
  24. Cambios de Configuración • ¿Qué pasa si tengo una pantalla

    con 20 campos que proviene de una api? ¿Debo guardar cada uno en un key + value en onSaveInstanceState()? • Se puede hacer, pero depende de nuestra app: • ¿Tenemos base de datos? • ¿Tenemos cache de nuestra api? • ¿El valor es una preferencia? • ¿Se trata de un dato que puede ser recuperado nuevamente?
  25. Cambios de Configuración • ¿Qué pasa si tengo una pantalla

    con 20 campos que proviene de una api? ¿Debo guardar cada uno en un key + value en onSaveInstanceState()? • Podemos guardar • Todo el objeto en cache/base de datos y solo grabar el id del registro en onSaveInstanceState() • Todo el objeto como Parcelable • Podemos mantenerlo en memoria • Podemos hacer el request nuevamente • No Silver Bullet
  26. ¿Qué pasa si tengo un hilo en ejecución? ¿Cómo preservo

    su estado en caso de un cambio de configuración?
  27. Lifecycle en Android • Ciclo de Vida de la Aplicación

    • Activity • Service • Fragment • Dependiendo de nuestra app, se utilizarán ciertos “hooks” provistos por la plataforma
  28. Lifecycle en Android • Activity • onCreate: init. UI +

    Startup • onStart: pantalla visible pero no interactiva. • onResume: pantalla visible e interactiva. • onPause: pantalla visible pero no interactiva. • onStop: pantalla no visible • onDestroy: pantalla fuera de memoria.
  29. Lifecycle en Android • Fragmento • onAttach • onCreate •

    onCreateView • onActivityCreated • onStart • onResume • onPause • onStop • onDestroyView • onDestroy • onDetach
  30. Lifecycle en Android • Activity • onCreate: init. UI +

    Startup • onStart: pantalla visible pero no interactiva. • onResume: pantalla visible e interactiva. • onPause: pantalla visible pero no interactiva. • onStop: pantalla no visible • onDestroy: pantalla fuera de memoria. • Fragmento • onAttach • onCreate • onCreateView • onActivityCreated • onStart • onResume • onPause • onStop • onDestroyView • onDestroy • onDetach
  31. Lifecycle en Android onCreate onDestroy Conexión a BD Liberar recurso

    de Conexión a BD Recuperación de Estado de UI Preparación de UI
  32. Lifecycle en Android onStart onStop Suscribirse a “updates” de datos

    - Broadcast Receiver - Localización Cancelar Suscripción
  33. Lifecycle en Android onStart onStop Suscribirse a “updates” de datos

    - Broadcast Receiver - Localización Cancelar Suscripción Google Maps: Ubicación en Pantalla
  34. Arquitecturas de Código • Permite organizar nuestro código en módulos

    y por responsabilidades. • Api, Base de Datos, Lógica de Negocio, UI, etc. • Todos empezamos escribiendo código de manera desordenada. • No está mal. Así vamos aprendiendo. • Error: No darnos cuenta de la necesidad de la separación de responsabilidades.
  35. Arquitecturas de Código • Debemos tener una Arquitectura. • Facilita

    el desarrollo, lectura de código, inclusión de nuevos features, testing.
  36. Arquitecturas de Código • Algunas propuestas por la comunidad: •

    MVC: Model View Controller • MVP: Model View Presenter • MVVM: Model View ViewModel • MVI: Model View Intent
  37. Arquitecturas de Código • Actualmente MVI • Establece el Concepto

    de Estado de la UI • Similar a React, Vue en Web • Manejo de Estado en Android
  38. ¿Qué pasa si tengo un hilo en ejecución? ¿Cómo preservo

    su estado en caso de un cambio de configuración?
  39. Cambio de Configuraciones • Opciones • Worker o Headless Fragment

    • ViewModel de Android Architecture Components • Servicio con Broadcast Receiver • Singleton a nivel de Aplicación • etc
  40. Cambio de Configuraciones • Dependerá de nuestro feature • Transacción

    Bancaria • Ver Post de Instagram • Enviar un Correo
  41. DataBinding • Permite declarar fuentes de datos en nuestros layouts

    xml y utilizarlos para renderizar contenido. • Similar a React, Vue, Angular • Declarativo contrario a programático
  42. DataBinding • Genera classes Java/Kotlin que se utilizan para hacer

    el acoplamiento (“binding”). • A través del “binding” se actualizan las variables u objetos declarados en el layout.xml y la vista se actualiza automáticamente.
  43. DataBinding • Si no les gusta tener declaraciones en la

    vista, al menos declaren el layout para tener un objeto responsable de todos los componentes de la vista.
  44. DataBinding • Avanzado: permite crear nuevos atributos xml para realizar

    otras tareas. Ejemplo: • Esconder una vista • Cargar una imagen via url • Asignar una tipografía
  45. Permisos • Presentes desde la primera versión de Android. •

    Antes se declaraban únicamente. • Marshmallow 6.0: se declaran y se solicitan en ejecución. • Siempre verificar que se tiene el Permiso, a pesar de que previamente nos lo hayan otorgado.
  46. Testing • ¡Obligatorio! • Calidad del Software que construimos. •

    Es difícil de implementar, pero no imposible. • No existe un patrón / estándar definido. Varía de arquitectura en arquitectura. • JUnit y Espresso • Barista
  47. Librerías • Reutilizar componentes creados por otros o nosotros mismos.

    • Herramientas • Controles UI • android-arsenal.com
  48. Recursos de Aprendizaje • Udacity Android Nanodegree / Associate Android

    Developer • Charlas Google IO / Android Dev Submit • Twitter: @donnfelker, @jakewharton, @FMuntenescu , @dankim , @hitherejoe • Newsletters • Android Weekly • Android Dev Digest • Podcasts • Fragmented • TheContext