Android. Y amigos. Pablo Orgaz, 2014, UPM

Documentos relacionados
INICIACIÓN A LA PROGRAMACIÓN PARA ANDROID

Servicios de la plataforma Android

Patricio Olivares. 25 de abril de 2017

Manejadores en Android LSUB, GYSC, URJC

Archivos y Carpetas de un proyecto Android

Ejercicio 4. Manejo de Layouts en Android. Android Con Java. Ejercicio 4. Manejo de Layouts en Android. Curso de Android con Java

Android TAG y el principio DRY

MASTER DESARROLLO DE APLICACIONES ANDROID

Activities/Intents en Android LSUB, GSYC, URJC

Concurrencia en Android LSUB, GYSC, URJC

Practica. Material Design. lunes 10 de octubre de 16

Programación en Android LSUB, GSYC, URJC

Servicios Basados en Localización (LBS) Tema 6 Desarrollo de aplicaciones en Android

Crear listas personalizadas en Android

Que es un Android Intent?

Java y CDI sobre JEE 6 (JSR 330)

Capacitación Tecnológica Científica para Bolivia. Programación Orientada a Objetos en Java

Sesión 4. Interfaz de Usuario en Android. Ing. Edwin Andrés Cubillos Vega Msc. Company LOGO

INTRODUCCIÓN.

PROGRAMACIÓN EN JAVA. { una línea para definir, crear o ejecutar ; }

Introducción a Android. [Tema 2]

Introducción a la programación de aplicaciones con Android. Fernando Pérez Costoya

Tareas en segundo plano AsyncTask Thread

MANIPULACIÓN DE VISTAS (VIEW)

Juan Galán García Rubén García Navamuel Javier Rodríguez Camarma Álvaro Rodríguez Moya

INTRODUCCIÓN A LA PROGRAMACIÓN ANDROID. Duración en horas: 60 OBJETIVOS DEL CURSO

Unidad Didáctica 3. Tipos genéricos. Fundamentos de Programación Departamento de Lenguajes y Sistemas Informáticos

Concurso: Cuánto sabes de JAVA?

Tutorial 1: Desarrollo de un plugin

Estructuras de control selectivas

POO: Clases y objetos

Desarrollo de apps para móviles Android. Conceptos básicos de las aplicaciones Android

Ejercicio 16. Mejora de Notificaciones en Android. Android Con Java. Ejercicio 16. Mejora de Notificaciones en Android. Curso de Android con Java

Introducción a Java. Fernando Cerezal López. 24 Noviembre 2005

Layouts en Android LSUB, GSYC, URJC

Ejercicios de fragmentos y compatibilidad

Android 7 Principios del desarrollo de aplicaciones Java

PROGRAMACIÓN ORIENTADA A OBJETOS 1/7/2009. Examen de Java. Nombre: DNI: Titulación:

Programación multimedia y dispositivos móviles. Android y JSON

ESPECIALISTA EN TECNOLOGIAS JAVA

Desarrollo Para Dispositivos Móviles.

Examen Teórico Convocatoria de Junio de 2012

* Introducción al mundo móvil. Qué es Android. Instalación y primeros pasos con Android.

Sistema móvil para la seguridad personal en caso de accidentes presentados en la ciudad de Bogotá. Manual de Programador

Clases abstractas e interfaces en Java

Java Interfaces y el concepto de simplicidad

Especialización Android

Patrones de Diseño. Ing. Miguel Angel Cedeño Garcidueñas

Taller Desarrollo. Tecnólogo Informática - 6to Semestre Montevideo

CODIGO PROYECTO: AppPixelproServicioWeb Proyecto Android - Servicio Web

SERVLETS. Aplicaciones Distribuidas

Examen Teórico. Convocatoria de Febrero de 2016

Patrones de Diseño. Patrón estructural Composite. Técnicas de Programación - Curso 2007/08

BEGINNERS CURSO TALLER: años. INICIO: 15 DE SETIEMBRE Viernes de 19:00 a 22:00h y sábados 09:00 a 12:00h

Ejercicio 3 Proyecto Intérprete Curso de Spring Framework

Java en 2 horas. Rodrigo Santamaría

Desarrollo de Apps para Android

Android Manejo de Eventos. Rogelio Ferreira Escutia

Interfaz de usuario Layout Vistas Adaptadores Eventos de interacción Estilos y temas

Ejercicio 18. Configuración de Widgets en Android. Android Con Java. Ejercicio 18. Configuración de Widgets en Android. Curso de Android con Java

Android Professional

Desarrollo de aplicaciones para dispositivos móviles (5)

APLICACIONES INTUITIVAS CON ANDROID STUDIO

Herencia y Polimorfismo

ANDROID INTERMEDIO - E-LEARNING - EN LÍNEA

Programación en Android

INTRODUCCIÓN A LA PROGRAMACIÓN ANDROID

! Fundamentos de la POO. ! Comportamiento y estado. ! Clases y objetos en Java

Tema 6 Patrones de Diseño. Programación Orientada a Objetos Curso 2010/2011

Clases y herencia. FJP Unidad 8. Diseño de clases

Qué ofrece Autentia Real Business Solutions S.L?

Patrones de diseño. Patrón básico Handler. Técnicas de Programación - Curso 2007/08

BASES DE DATOS AVANZADAS. Facultad de Estadística e Informática

Programa de Crecimiento y Actualización PROGRAMA. DESARROLLO DE Apps Móviles. con ANDROID

MASTER PROFESIONAL C# 5 Y ASP.NET MVC 5

02 Vistas y Layouts Practica 2 e investigación 2

Android y Recursos. Android R.java (fichero)

Con este tutorial podrás aprender a cómo empezar a crear apps en Android, empezaremos con algo muy simple para que poco a poco vayas conociendo.

Unidad Didáctica 1. Introducción a la Programación Orientada a Objetos (POO) Conceptos de clase, objeto e interfaz. Atributos y métodos

Curso Android. ADT Bundle. Android Developer Tools. Entorno de trabajo Toolbar principal SDK Manager. Emulador de Android. Crear proyecto Android

Prácticas POO Curso 10/11

Ejercicio 3. Manejo de la Vista y Eventos en Android Ejercicio 3 Curso de Android con Java Derechos Res Dere e c rvados hos Res Gl e obal rva

Unidad 2. Elementos Intermedios del Lenguaje

Programación multimedia y dispositivos móviles. Servicios Web

ALMACENAMIENTOS DE DATOS EN ANDROID CON SQLITE

años INSTITUTO PARA EL DESARROLLO EMPRESARIAL Y ADMINISTRATIVO CURSO TALLER: DEVELOPERS INICIO: 04 DE SETIEMBRE Lunes y Miércoles de 19:00 a 22:00h

CAPÍTULO I Investigación Preliminar

Java 9 Modules y el concepto de modularidad

El concepto de Java Package Encapsulation

Unidad Didáctica 10. Concepto de Tipo y Subtipo Diseño e Implementación. Versión 1.0.0

Android avanzado. Sesión 5: Notificaciones. Experto en Desarrollo de Aplicaciones para Dispositivos Móviles

Ejecución de hebras. En realidad, todas las aplicaciones escritas en Java son aplicaciones multihebra (recuerde el recolector de basura).

3.1 Introducción a TDA y OO. Capítulo III. Tipos de Datos Abstractos, Orientación a Objetos y Lenguaje Java

Construcciones del Lenguaje Java

b) Basta con definir una variable de tipo Alumno (a) y otra de tipo CursoExtraescolar (curso) antes de hacer la llamada al método mediante el

Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles. Plataforma Android. Sesión 1: introducción a Android

Examen Teórico. Convocatoria de Febrero de 2015

Introducción a la programación de aplicaciones con Android. Fernando Pérez Costoya

Unidad Didáctica 2. Elementos básicos del lenguaje Java Tipos, declaraciones, expresiones y asignaciones

Transcripción:

Android Y amigos Pablo Orgaz, 2014, UPM

Contenidos Activity & Fragment Sistemas de Construcción Conectividad Java puro y Java Android Eh, esto funciona - The App

Activities Activity & Fragment Cuándo usar cual Beneficios Problemas comunes Patrones generales Comunicación Activities + Fragments

Why bother Una activity es componente con UI, generalmente única. Son los contextos más comunes Es normal que partes de la UI se reciclen: Banners de publicidad, cabeceras, etc Podemos reutilizar partes de una vista separando en distintos ficheros usando @include Qué ocurre con la lógica?

Sólo vista <LinearLayout xmlns:android=... android:layout_width="match_parent" android:layout_height="match_parent" android:orientation= vertical"> <include layout= @layout/my_shared_layout /> </LinearLayout>

Vista + Lógica Opción 1: Utilizando subclases de vistas Podemos definir nuevos atributos Controlar el método de dibujado Mucho control sobre el layout class VistaCustom extends LinearLayout {... //código para un banner publicitario... } http://developer.android.com/training/custom- views/index.html

Vista + Lógica <LinearLayout xmlns:android=... android:layout_width="match_parent" android:layout_height="match_parent" android:orientation= vertical > <com.presentacion.vistacustom x:attr1=... /> </LinearLayout>

Vista + Lógica, problemas? Alto acoplamiento entre el controlador y la vista Las vistas deberían tener poco/ningún estado, free bugs Ciclo de vida propio de una vista (no hay segundo plano) En general no tiene mucho sentido si no vamos a personalizar el método ondraw().

Fragments Un fragmento es un componente lógico, vista opcional Las actividades se componen de varios fragmentos Un fragmento siempre vive en una actividad Los fragmentos se pueden componer de fragmentos A efectos prácticos son una máquina de estados Controlarlos correctamente es (@#$%) complicado

Vista + Lógica Opción 2: Utilizando fragmentos class FragmentCustom extends Fragment { oncreateview(){ inflar layouts, inicializar vistas, etc. }... //código para un banner publicitario... } http://developer.android.com/guide/components/fragments.html

Fragments MyActivity extends Activity { public void oncreate(bundle){ Fragment fragment = FragmentCustom.newInstance(3); getfragmentmanager().begintransaction().add(r.id.base_fragment_container, fragment).commit(); } }

Fragments Fragment fragment = FragmentCustom.newInstance(3); Los fragmentos NO pueden tener constructores constructor + giro de pantalla = crash Todos los parámetros de los fragmentos deben estar en un Bundle. El patrón MyFragment.newInstance(args) imita un constructor

Fragments public static UserFragment newinstance(int id) { UserFragment user = new UserFragment(); //no params Bundle args = new Bundle(); args.putint(user_id, id % 100); user.setarguments(args); return user; }

Fragments getfragmentmanager().begintransaction().add(r.id.base_fragment_container, fragment).commit(); Normalmente las actividades se componen en ejecución También es posible usar la forma declarativa (xml) Después de realizar el commit comienza el ciclo de vida del fragmento COMIENZA EL CICLO DE VIDA

Fragments El ciclo de vida es muy complejo, la documentación oficial es incompleta Android hace muchas suposiciones sobre como vas a usar un fragmento Los fragmentos tienen stack (igual que las actividades) El ciclo de vida completo se puede consultar en: https://github.com/xxv/android-lifecycle

Comunicación Los fragmentos necesitan información de la actividad (key events) - fácil Los fragmentos necesitan compartir y mutar información - tedioso Cuál es la mejor forma de solucionarlo?

Fácil Medio Complicado Activity Fragment 1 Fragment 2

Comunicación Opción 1 - bad: Casting public class UserFragment extends Fragment { public void onattach(activity activity) { super.onattach(activity); MainActivity ac = (MainActivity) activity; ac.somemethod(); } }

Comunicación Opción 1 - bad: Casting El fragmento ya no es reusable Alto acoplamiento Leaks de contextos = crash

Comunicación Opción 2 - meh: Interfaces public class MainActivity extends Activity implements Actions { public interface Actions { void dosomething(); } }

Comunicación Opción 2 - meh: Interfaces public class UserFragment extends Fragment { public void onattach(activity activity) { super.onattach(activity); Actions ac = (Actions) activity; ac.dosomething(); } }

Comunicación Opción 2 - meh: Interfaces El fragmento se puede reutilizar, siempre que la actividad implemente la interfaz Bajo acoplamiento Verbose, interfaz que no aporta mucho Leaks de contextos = crash (Sigue siendo una referencia a la actividad)

Comunicación Opción 3 - best: Bus de eventos No es posible sin librerías externas (Otto) La actividad se registra a eventos producidos por los fragmentos y viceversa Los fragmentos se registran a eventos de otros fragmentos No son necesarias referencias fuertes ni código extra

Activity Bus eventos Fragment 1 Fragment 2 Fragment n

xq Preguntas? xq

Gradle & Android Studio Sistemas de construcción Ant Maven Gradle Android Studio Proyectos con Android Studio

Why bother Los sistemas de construcción son imprescindibles Gestión de dependencias Variantes de construcción Paso automático de pruebas Todo lo que se te ocurra (scripts)

Conceptos básicos Android no tenía un sistema de construcción propio Originalmente basado en Ant (eclipse) Es posible usar Maven La mejor opción es Android Gradle Plugin

Ant Basado en tareas Definido en XML Muy libre No tiene gestión de dependencias por defecto Es difícil hacer tareas portables

Maven Similar a Ant respecto a las tareas (goals) Mucho más restringido, configuración de plugins Portable Gestión de dependencias Archivos Pom que llenan pantallas

Gradle Un paso intermedio entre Ant y Maven Basado en Tareas Muy flexible, utiliza groovy como lenguaje Muy conciso Gestión de dependencias Integración con el IDE - Android Studio

build.gradle Android Plugin apply plugin: 'com.android.application' android { compilesdkversion 20 buildtoolsversion "20" defaultconfig { minsdkversion 18 targetsdkversion 20 versioncode 1 versionname "1.0" } } dependencies { }

xq Preguntas? xq

RED Async Tasks Loaders Servicios Retrofit Volley Imágenes Patrones básicos

Why bother Hace falta conectividad en el 95% de las apps Todos los elementos básicos ya existen Integrar UI con callbacks es un infierno En Android es peor ( gracias contextos) Controlar hilos manualmente es incluso peor

HTTP vs Otros SOAP, CORBA, o cualquier otro popular en su tiempo. Demasiado grandes En ocasiones dependientes de un framework java (no android) REST (http en general) es muy fácil

Async Tasks For quick and dirty tasks Mejores para tareas de duración conocida, generalmente corta Lo único que aportan es un modelo de ejecución en segundo plano básico. Leaks de contextos (clases internas)

Async Tasks private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> { protected Long doinbackground(url... urls) { HttpPost request = new HttpPost( ); // blah blah return client.execute(request); } protected void onprogressupdate(integer... progress) { setprogresspercent(progress[0]); } protected void onpostexecute(long result) { haceralgoenlaui(result); } } http://developer.android.com/reference/android/os/asynctask.html

Loaders API creada por Satán Alternativa a las Async Tasks Lo mismo, pero ahora con un 300% más de código Sobreviven a cambios de contexto Su utilidad real es con bases de datos (cursores)

Servicios La forma Android de controlar el segundo plano Gestión automática del segundo plano (IntentService) La operación es fácil, obtener los resultados no tanto Las notificaciones permanentes de Android 4.2+

Suficientes soluciones Android

Retrofit La forma declarativa public interface GitHubService { @GET("/users/{user}/repos") List<Repo> listrepos(@path("user") String user); } RestAdapter restadapter = new RestAdapter.Builder().setEndpoint("https://api.github.com").build(); GitHubService service = restadapter.create(githubservice.class); http://square.github.io/retrofit/

Retrofit List<Repo> repos = service.listrepos("octocat"); Parsing automático (json, xml) Expresión declarativa Muy fácil de extender en compilación Personalización restringida (en algunos puntos)

Volley La forma constructiva StringRequest strreq = new StringRequest(Method.GET, www.google.com, new Response.Listener<String>() { @Override public void onresponse(string response) { Log.d(TAG, response.tostring()); pdialog.hide(); } }, new Response.ErrorListener() { }); @Override public void onerrorresponse(volleyerror error) { VolleyLog.d(TAG, "Error: " + error.getmessage()); pdialog.hide(); } strreq.propiedes( ); https://android.googlesource.com/platform/frameworks/volley/

Volley AppController.getInstance().addToRequestQueue(strReq, tag_string_req); Parsing automático (json, xml) Construcción en ejecución Caché automática Control absoluto (convención > configuración)

Imágenes Forma nativa - 0 beneficios, todos los problemas Picasso / Volley: http://square.github.io/picasso/ Caché Descarga en segundo plano Fallback Desarrolladas para Android Universal Image Loader: https://github.com/nostra13/android- Universal-Image-Loader

Controlando errores Hay que asumir que todas las peticiones van a fallar (conectividad móvil) Hay que evitar dejar la UI en un estado poco consistente Debería haber algo de feedback hacia el usuario Casi todos los errores tienen como solución reintentar

401 - Unauthorized Si no hay datos de login (token) Login Home Activity Activity

401 - Unauthorized Login Home Activity 401 en Activity Borrar datos de login + Intent a Home + CLEAR_TOP

xq Preguntas? xq

Java Puro y Java Android Inyección de dependencias Dagger Butterknife Otto Icepick Ormlite

Why bother El SDK de Android es de muy bajo nivel Algunos patrones de Java no aconsejables (singletons) Mucho control explícito -> Código duplicado Las AbstractFactoryFactory se crean por un motivo Pero inyectar dependencias está desaconsejado por Android, sobrecarga el runtime

Inyección de dependencias Es un patrón (no una librería) Nuestros componentes (activity, fragment) satisfacen sus dependencias sin un solo new Hay muchas formas de abstraer las dependencias Métodos factoría, Factories, Prototipos

Inyección de dependencias Es un patrón (no una librería) Nuestros componentes (activity, fragment) satisfacen sus dependencias sin un solo new Hay muchas formas de abstraer las dependencias Métodos factoría, Factories, Prototipos

Dagger en Android Multiples servicios, actividades, etc. necesitan compartir estado Algunas librerías necesitan singletons o objetos con vidas largas Android es muy difícil de probar Dagger + Flavors = Happiness

Dagger ObjectGraph: Gestor e injector de dependencias central @Module + @Provides: Mecanismo para proveer dependencias @Inject: Mecanismo para requerir dependencias Algunas cosas más, magia y convenciones goo.gl/sjs0w0

Módulos Los módulos son clases que proveen dependencias

Inyección de atributos La inyección ocurre cuando el objeto está vivo Los objetos se inyectan a sí mismos (no hay magia) También se pueden inyectar constructores

ObjectGraph

ButterKnife Genera código repetitivo (boilerplate) mediante anotaciones (p. ej: @InjectView) Sustituye el método findviewbyid por @InjectView => menos código y mejor estructurado Evita clases anónimas para manejar acciones como el click de un botón (@OnClick), click en un elemento de una lista (@OnItemClick), etc...

ButterKnife Para hacer efectivas las anotaciones, es necesario utilizar el método ButterKnife.inject En una activity:... setcontentview(r.layout.activity_main) ButterKnife.inject(this);... En un fragment: View oncreateview(layoutinflater inflater, ViewGroup container, Bundle state) { View view = inflater.inflate(r.layout.fancy_fragment, container, false); ButterKnife.inject(this, view); return view; }

ButterKnife "Inyectar" vistas: // Sin ButterKnife private ListView listview;... listview = (ListView) findviewbyid(r.id.mylistview); // Con ButterKnife @InjectView(R.id.myListView) ListView listview;

ButterKnife Manejar on click de un botón: // Sin ButterKnife findviewbyid(r.id.mybutton).setonclicklistener( new View.OnClickListener() { public void onclick(view view) { foo(); } }); // Repetir el proceso para el botón R.id.mySecondButton // Con ButterKnife @OnClick({R.id.myFirstButton, R.id.mySecondButton}) public void onbuttonclicked(button button) { foo(); }

Otto Bus bus = new Bus(); //Singleton Java es la mejor opción bus.register(this); //Un fragment, una activity bus.post(new MiEvento(42)); @Subscribe public void mievento(mievento event) { foo(); } http://square.github.io/otto/

Otto Los métodos @subscribe se ejecutan en la UI Todos los subscriptores ejecutan sus acciones antes de que bus.post( ) retorne Se pueden producir eventos de subscripción al bus y hacer bootstrapping (fragmentos dinámicos)

Más Icepick: https://github.com/frankiesardo/icepick Ormlite: http://ormlite.com/ GreenDAO: http://greendao-orm.com/ Todo lo demás: http://android-arsenal.com/free

xq Preguntas? xq

GRACIAS pabloogc@gmail.com