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.

Avatar for Andrés Santibáñez

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