Desarrollo con Android Sergio Aguado González sergio.aguado@cuatroochenta.com http://www.cuatroochenta.com
Índice ¿Qué es Android? Requisitos para programar Estructura de una aplicación Activities, intents y ciclo de vida
¿Qué es Android? Un sistema operativo basado en Linux para dispositivos móviles Una máquina virtual Java (Dalvik) Un SDK y un framework de aplicación con diversas librerías: 2D y 3D SQLite Media, Bluetooth, Cámara, GPS, brújula, acelerómetro,…
¿Qué se puede hacer con Android? Programar aplicaciones utilizando su framework de desarrollo Personalizar el sistema operativo o realizar aplicaciones nativas… (CyanogenMod)
¿Qué se necesita para programar en Android? Eclipse Plugin ADT (Android Developer Tools) Android SDK Lenguaje de programación Java http://developer.android.com/sdk/installing.html o C y C++!!!
Arquitectura de Android
Arquitectura de Android Aplicaciones Todas las aplicaciones tienen los mismos permisos y las mismas restricciones Framework de aplicación Infraestructura que ofrece Android para no reinventar la rueda: Componentes visuales Gestión del ciclo de vida de la aplicación
Arquitectura de Android Librerías Escritas en C y C++. Se acceden a través del framework de aplicación Kernel
Hello Android!!! http://developer.android.com/guide/practices/screens_support.html
Hello Android!!! http://developer.android.com/guide/practices/screens_support.html
Hello Android!!! http://developer.android.com/guide/practices/screens_support.html
Estructura básica de una aplicación Activities Recursos Layout Imágenes Strings Otros: animaciones, colores, menus, estilo, raw AndroidManifest.xml
Activity Cada una de las pantallas de una aplicación Para mostrar componentes visuales se utilizan los layouts public class HelloActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); }
Layout Una jerarquía de vistas Componentes visuales (View) Contentedores (ViewGroup)
Layout Componentes visuales Label Button Image Date y Time Picker Map WebView
Layout Contenedores: LinearLayout TableLayout RelativeLayout TabLayout AbsoluteLayout (NO!!)
Flujo de navegación El flujo de una aplicación se define como una sucesión de Activities De la misma aplicación o entre diferentes aplicaciones (colaborar!!!!!!) Las actividades comunican lo que quieren a través de Intents
Flujo de navegación. Intent Descripción de una acción a realizar Dos tipos de Intents: Explícitos: Se indica la actividad concreta Implícitos: Se indica lo que se quiere (mostrar un navegador, enviar un correo,…) Se compone de: Acción: Qué se quiere hacer Uri: El dato principal (teléfono, id de un contacto) Categoría: Información adicional de la acción Extras (Bundle): un hash donde incluir más datos
Flujo de navegación. Intent Ejemplos de acciones: ACTION_MAIN ACTION_VIEW ACTION_PICK ACTION_SEND ACTION_CALL String uri = "tel:964964964"; Intent intent = new Intent(Intent.ACTION_CALL); intent.setData(Uri.parse(uri)); startActivity(intent); String asunto = "Asunto"; String texto = "Algo de texto"; Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND); emailIntent.setType("plain/text"); emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, new String[]{"contacto@decharlas.com"}); emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, asunto); emailIntent.putExtra(android.content.Intent.EXTRA_TEXT, texto); startActivity(Intent.createChooser(emailIntent, "Send your email in:")); //startActivity(emailIntent);
Flujo de navegación. Intent Una aplicación puede registrarse mediante filtros a cualquier Intent. No hay aplicación más importante que otra
Flujo de navegación. Intent La activity inicial también se inicia con un Intent <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="es.uji.decharlas.android" android:versionCode="1" android:versionName="1.0"> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".HelloActivity” android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".MailActivity” android:label="@string/mail_title"> <!– Otras actividades . . . . . . . . . -- > </application> </manifest>
AndroidManifest.xml El paquete de la aplicación (nombre único) Componentes de la aplicación (actividades, servicios, …) Qué Intents pueden pueden gestionar Permisos que necesita la aplicación para funcionar: acceder a la posicion, utilizar la cámara, recibir smss,… Librerías necesarias (p.e. Google Maps)
Ciclo de vida de una actividad Idea principal: minimizar consumo de recursos Se divide el flujo de navegación mediante Activities Las activities: se inician se paran se destruyen si ya no se necesitan
Ciclo de vida de una actividad Básicamente hay tres estados: Activo: Se está ejecutando y está visible en pantalla Pausada: Está todavía visible en pantalla pero no tiene el foco Parada: No está visible en pantalla y ya no se está ejecutando
Ciclo de vida de una actividad Vida completa
Ciclo de vida de una actividad Vida visible
Ciclo de vida de una actividad Vida con foco
Ciclo de vida de una actividad onCreate: Crear vistas, popular listas. Recuperar estado previo si lo hay onRestart: onStart: onResume: si hay algo parado volverlo a ejecutar. Recuparar onPause: pausar todo aquello que requiera de mucha CPU. Por ejemplo animaciones. Guardar información necesaria pues pueden matar el proceso sin previo aviso onStop: onDestroy:
Diferentes tamaños de pantalla Android cuenta con dispositivos con distint@s: Tamaños de pantalla Resoluciones de pantalla Relaciones de aspecto Densidad de píxels (píxels por pulgada) Ejemplo: Una imagen de 200x200 pixels no se ve igual de grande en todos los dispositivos http://www.google.com/phone/
Diferentes tamaños de pantalla
Diferentes tamaños de pantalla Density Independent Pixel: Unidad de píxel “virtual” para poder definir una interfaz de usuario de forma independiente 1dip = 1 pixel en una pantalla de 160 dpi (punto por pulgada) pixels = dips * (density / 160) http://en.wikipedia.org/wiki/List_of_displays_by_pixel_density
Diferentes tamaños de pantalla No trabajar con Absolute Layout Tener recursos para distintas densidades (low, medium, high) Usar dips y nunca pixels