MobileCONGalicia Introducción a Android

44
Introducción a Android Y mis 25 consejos para los que empiezan en Android MobileCONGalicia, Diciembre 2011 Alberto Alonso Ruibal [email protected] T: @mobialia @albertoruibal

description

Introducción a Android y mis 25 consejos para los que empiezan en Android

Transcript of MobileCONGalicia Introducción a Android

Page 1: MobileCONGalicia Introducción a Android

Introducción a Android

Y mis 25 consejos para losque empiezan en Android

MobileCONGalicia, Diciembre 2011

Alberto Alonso [email protected]: @mobialia @albertoruibal

Page 2: MobileCONGalicia Introducción a Android

Quién soy

Ingeniero de Telecomunicación

System Manager

J2EE Developer

Desarrollador Android @ Mobialia

Mobialia Chess / Internet Chess Club App

Gasolineras España / Connect-4 / Trivial / Slot Racing

MartinVars's RadioMe / Track my Followers

Mi blog: http://www.alonsoruibal.com

Mi empresa: http://www.mobialia.com

Page 3: MobileCONGalicia Introducción a Android

Estado de las plataformas móviles (USA)

Page 4: MobileCONGalicia Introducción a Android

Y por qué Android

● Código abierto● 550.000 activaciones diarias● Diversidad de dispositivos, fabricantes...● Porque tiene detrás a Google

Page 5: MobileCONGalicia Introducción a Android

Qué necesito para desarrollar

● Un ordenador con Windows, MacOSX o Linux● Java SDK, y conocimientos de Java● Android SDK

http://developer.android.com/sdk/index.html● Eclipse + plugin ADT (es posible utilizar otros

IDEs). Recomiendo el “Eclipse IDE for Java Developers”

http://www.eclipse.org/downloads/

Page 6: MobileCONGalicia Introducción a Android

Estructura del proyecto

src/

gen/

assets/

res/

drawable/

layout/

raw/

values/

AnroidManifest.xml

Código fuente

Archivos generados a partir de los recursos

Ficheros a los que va a acceder la aplicación

Carpeta de recursos

Imágenes

Disposición de elementos en pantalla

Archivos de datos (sonidos por ejemplo)

Definición de textos, colores, estilos, etc

Page 7: MobileCONGalicia Introducción a Android

Componentes de una aplicación

● Actividades: Cada pantalla que se muestra es una “Actividad”, lo que muestra la actividad es un “Layout”

● Servicios: Para aplicaciones que necesitan estar ejecutándose en segundo plano

● Intents: Sistema de comunicación entre aplicaciones / actividades

Page 8: MobileCONGalicia Introducción a Android

Las actividades y su ciclo de vida

Cada Actividad es una clase Java con métodos estándar que son llamados en los distintos cambios de estado

Hay que definir cada actividad en el AndroidManifest.xml

Page 9: MobileCONGalicia Introducción a Android

Diseñando pantallas: layouts

● Se pueden crear desde código Java o bien definirlos en un XML (lo recomendado)

● Todos los componentes de las pantallas pueden ser:● Viewgroups (cuando pueden tener “hijos”)● Views

● El editor WYSIWYG incluido

en el ADT ahora funciona

y es usable

Page 10: MobileCONGalicia Introducción a Android

Los selectores de recursos

● Se le añaden a las carpetas de recursos:● Por densidad de píxeles: -ldpi -mdpi -hdpi -xhdpi● Por tamaño de pantalla: -small -normal -large -xlarge● Por idioma: -es -pt -fr -it ...● Por orientación: -port -land

● Se pueden combinar varios:

res/drawable-mdpi-es

● El sistema escoge el recurso adecuado en cada momento, y hace auto-escalado de las imágenes

Page 11: MobileCONGalicia Introducción a Android

Tamaños de pantalla

Page 12: MobileCONGalicia Introducción a Android

Densidades de pantalla

HDPI MDPI LDPI

http://developer.android.com/guide/practices/screens_support.html

Page 13: MobileCONGalicia Introducción a Android

Empaquetado y distribución

● La aplicación se empaqueta en un APK que se firma con un certificado

● En el Android Market nuestra aplicación queda identificada con este paquete y este certificado

● Ojo con perder el certificado o olvidar la contraseña... no podríamos actualizar la aplicación

Page 14: MobileCONGalicia Introducción a Android

Mis 25 consejos

Lo que me habría gustado saber hace dos años...

Page 15: MobileCONGalicia Introducción a Android

1# Para qué versión de Android desarrollar

● Yo recomiendo que las aplicaciones para móviles sean compatibles con Android 1.6

● Salvo APIs muy específicas (cámara, bluetooth..) suele llegar

● Y desarrollar usando el SDK de la versión 4, ICS (por ejemplo la última versión de AdMob requiere >= 3.2)

● Antes de publicar probar siempre

en un emulador 1.6

Page 16: MobileCONGalicia Introducción a Android

2# Diseñar pensando en múltiples tamaños de pantalla

Y dar siempre soporte a pantallas horizontales

Page 17: MobileCONGalicia Introducción a Android

3# Usar estilos en los layouts

● Sistema similar a CSS en web

● Permite reducir drásticamente el tamaño de los XMLs

● Se define el estilo en styles.xml  <style name="WhiteText">

    <item name="android:layout_width">wrap_content</item>

    <item name="android:layout_height">wrap_content</item>

    <item name="android:textStyle">bold</item>

    <item name="android:textColor">@color/white</item>

  </style>

● Y se usa con “style=”:<TextView style="@style/WhiteText" android:text="@string/text1"/>

http://www.alonsoruibal.com/using-styles-on-android-layouts/

Page 18: MobileCONGalicia Introducción a Android

4# Usar includes

● Permiten crear componentes que podemos reutilizar

● Ejemplo, en un layout ponemos:<include layout="@layout/component"

android:layout_width="wrap_content"

android:layout_height="wrap_content"/>

● Y definimos en component.xml el layout del componente incluído

● Herramientas útiles del editor WYSIWYG del ADT “Extract includes” y “Extract styles”

Page 19: MobileCONGalicia Introducción a Android

5# Definir colores y dimensiones

● Definimos los colores en colors.xml<resources>

<color name="text">#000000</color>

</resources>

● Y las dimensiones en dimens.xml<resources>

<dimen name="text_size_small">14sp</dimen>

</resources>

● Los usamos desde los layouts con @color/ y @dimen/<TextView android:layout_width="wrap_content" android:layout_height="wrap_content"

android:textColor="@color/text" android:textSize="@dimen/text_size_small"

android:text="Text" />

Page 20: MobileCONGalicia Introducción a Android

6# No bloquear el thread principal

onCreate() onResume() Handler.handleMessage()

Tarea pesada

t = new Thread(this)t.start();

handler.sendEmptyMessage(code);

● Realizar cualquier operación pesada en un thread separado● Sólo podemos modificar el interfaz desde el thread principal

Dentro de una misma actividad:

Page 21: MobileCONGalicia Introducción a Android

Si bloqueamos el thread principal...

Page 22: MobileCONGalicia Introducción a Android

7# Usar las preferencias

● Forma fácil de almacenar propiedades sencillas● Pantallas estándard de preferencias, se pueden

definir en XMLhttp://code.google.com/p/mobialia-wikiplaces/source/browse/trunk/res/layout/preferences.xml

● Para obtener preferencias:SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this);

boolean booleanValue = sharedPref.getBoolean("booleanValue", true);

int intValue = sharedPref.getInt("intValue", true);

● Truco: usar serialización JSON y luego guardar en las preferencias

Page 23: MobileCONGalicia Introducción a Android

8# Almacenando más datos

● Android integra SQLite DB● Aunque es sencilla soporta grandes cantidades

de datos (en una aplicación mía hasta 500.000 datos por tabla)

● Si queréis algo parecido a Hibernate, tenéis el Android Data Framework creado por @javielinux

http://code.google.com/p/androiddataframework/

Page 24: MobileCONGalicia Introducción a Android

9# Usar listviews y adapters● Forma óptima de mostrar pantallas con muchos datos

● El ListView le pide al Adapter la View a mostrar en el momento que es necesaria (ahorra memoria)

● Reutilizar views en el Adapter: mejora velocidad de la listapublic View getView(int position, View convertView,

ViewGroup parent) {

LinearLayout ll;

if (convertView != null) {

ll = (LinearLayout) convertView; // Reciclamos!

else {

ll = (LinearLayout) LayoutInflater.from(mContext)

.inflate(R.layout.wikiplaces_adapter,

parent, false);

}

Page 25: MobileCONGalicia Introducción a Android

10# Internacionalización con strings.xml

● Nunca meter cadenas en el código, ponerlas en res/values con el selector de idioma (values-es, values-pt...)

● Aplicación web para la traducción: PASTT

http://code.google.com/p/android-php-translator/● Poner en un único XML las cadenas y los arrays a

traducir● Crear un XML separado con las cadenas que no

necesitan traducción

● Sitio web con servicio de traducción gratuito (thx @ilnuska) http://www.getlocalization.com/

Page 26: MobileCONGalicia Introducción a Android

11# Pasar datos en el Intent

● Forma de enviar datos de una actividad a otra (bien de nuestra aplicación o entre aplicaciones)

● En la actividad llamante:Intent intent = new Intent(this, DemoActivity.class);

Bundle bundle = new Bundle();

bundle.putInt("intValue", 33);

bundle.putBoolean("booleanValue", true);

intent.putExtras(bundle);

startActivity(intent);

● Y en la que recibe los datos (en el onCreate()):Bundle extras = getIntent().getExtras();

int intValue = extras.getInt("intValue");

boolean booleanValue = extras.getBoolean("booleanValue");

Page 27: MobileCONGalicia Introducción a Android

12# Intents útiles ACTION_VIEW

● Abrir el navegador web del sistema:String uri = "http://www.mobialia.com";

Intent myIntent =

new Intent(android.content.Intent.ACTION_VIEW,

Uri.parse(uri));

startActivity(myIntent);

● Abrir Google Maps Navigation:String uri = "google.navigation:q=" + lat + "," + lon;

Intent myIntent =

new Intent(android.content.Intent.ACTION_VIEW,

Uri.parse(uri));

startActivity(myIntent);

Page 28: MobileCONGalicia Introducción a Android

13# Intents útiles ACTION_SEND

● Share Intent (ACTION_SEND)String shareText = "texto a compartir";

Intent intent = new Intent(android.content.Intent.ACTION_SEND);

intent.setType("text/plain");

intent.putExtra(android.content.Intent.EXTRA_TEXT,

shareText);

startActivity(Intent.createChooser(intent,

getString(R.string.share_choose)));

● Email Intent...

Page 29: MobileCONGalicia Introducción a Android

14# Interceptar URLs

● Podemos configurar actividades para que intercepten determinadas URLs

● Añadimos un intent filter en el AndroidManifest.xml:

<activity android:name =".MobialiaActivity">

<intent-filter>

<action android:name="android.intent.action.VIEW"></action>

<category android:name="android.intent.category.DEFAULT"/>

<category android:name="android.intent.category.BROWSABLE"/>

<data android:scheme="http" android:host="mobialia.com"/>

</intent-filter>

</activity>

Page 30: MobileCONGalicia Introducción a Android

15# Usar el parser JSON integrado

● Recomiendo usar JSON cuando haya que obtener datos de un servicio externo

● Android tiene JSONObject y JSONArray para parsear datos JSON

● Ejemplo de uso en WikiPlacesData.java:http://code.google.com/p/mobialia-wikiplaces/source/browse/trunk/src/com/mobialia/wikiplaces/WikiplacesData.java

● Y en general antes de implementar algo, buscar si hay una API o librería que lo hace

Page 31: MobileCONGalicia Introducción a Android

17# Vigilar la memoria que consume la aplicación

● Usar el Allocation Tracker del ADT para detectar dónde ocupamos memoria

● Cada vez que entra el Garbage Collector supone una pausa de la aplicación que puede llegar hasta 100 ó 200 ms

● Esto mata el framerate de cualquier juegohttp://developer.android.com/resources/articles/track-mem.html

Page 32: MobileCONGalicia Introducción a Android

16# Cuidado al rotar la pantalla

● Cada vez que se rota la pantalla de destruye la actividad y se vuelve a crear

● El sistema tiene una memoria limitada para bitmaps, si se agota aparece el error:

Bitmap size exceeds VM budget● Y suele aparecer en el rotado de pantalla● Añadir al AndroidManifest.xml

android:configChanges="orientation" y sobreescribir el método onConfigurationChanged() (thx @luiskap)

http://www.alonsoruibal.com/bitmap-size-exceeds-vm-budget/

Page 33: MobileCONGalicia Introducción a Android

18# Reproducir audio

● Establecer el stream que controlamos con las teclas de volumen

setVolumeControlStream(AudioManager.STREAM_MUSIC);

● SoundPool: creamos un “pool” de sonidosprivate SoundPool soundPool;

private HashMap<Integer, Integer> soundPoolMap;

private void initSounds() {

soundPool = new SoundPool(4, AudioManager.STREAM_MUSIC, 100);

soundPoolMap = new HashMap<Integer, Integer>();

soundPoolMap.put(66, soundPool.load(this, R.raw.click, 1));

}

● Y los vamos reproduciendo bajo demandasoundPool.play(soundPoolMap.get(66), volume, volume, 1, 0, 1f);

● Para cosas más avanzadas: AudioTrack

Page 34: MobileCONGalicia Introducción a Android

19# Crear aplicaciones 3D

● Se utiliza la API de OpenGL ES● Librerías que facilitan su uso:

● JPCT-AE (Código cerrado)

http://www.jpct.net/jpct-ae/● Min3D (Muy simple y de código abierto), mi favorita

http://code.google.com/p/min3d/● Con ambas podemos cargar modelos .3ds, .obj● Frameworks más complejos y multiplataforma: Unity

Page 35: MobileCONGalicia Introducción a Android

Un ejemplo de Min3D: Slot Racing

Page 36: MobileCONGalicia Introducción a Android

20# Integrar anuncios de AdMob

● Forma fácil de obtener ingresos desde el primer momento

● Pagan un mes a posteriori a través de Paypal (a primeros de Diciembre se cobra la publicidad de Octubre)

● CPMs entre 0,20 - 0,40 USD● No funciona con apps locales● Cómo integrarlo:

http://code.google.com/intl/es/mobile/ads/docs/android/

● Tiene House Ads para promoción cruzada

Page 37: MobileCONGalicia Introducción a Android

21# Usar Google Analytics

● Las estadísticas de uso son imprescindibles● Con AdMob ya tenemos estadísticas de uso de la

aplicación● Obtener el Analytics SDK de:

http://code.google.com/intl/es/mobile/analytics/download.html● Se registra la aplicación Android como un dominio más● Ejemplo de uso:tracker = GoogleAnalyticsTracker.getInstance();

tracker.start("UA-2360573-11", this);

tracker.trackPageView("/main");

tracker.dispatch();

tracker.stop();

Page 38: MobileCONGalicia Introducción a Android

22# Publicar en el Android Market

● Sólo por 25 USD (un sólo pago)● Cuidado con el certificado● Aplicar IVA a las ventas en Europa, para

más temas fiscales:http://www.alonsoruibal.com/vender-en-android-market-desde-espana/

● Los markets alternativos...

¡no funcionan!

Page 39: MobileCONGalicia Introducción a Android

23# Implementar compras dentro de la aplicación

● Las aplicaciones que obtienen más ingresos usan compras dentro de la aplicación

http://developer.android.com/guide/market/billing/billing_overview.html

● Es complicado de implementar pero hay una librería desarrollada por Robot Media (@hpique) que lo simplifica:

https://github.com/robotmedia/AndroidBillingLibrary

Page 40: MobileCONGalicia Introducción a Android

24# Usar el servicio de licencias del Android Market

● Permite proteger nuestra aplicación contra la piratería

● Sólo funciona en dispositivos con Android Market

● Al integrarlo sólo podemos vender la app en en Android Market, para markets alternativos hay que adaptarla

● A veces falla...http://developer.android.com/guide/publishing/licensing.html

Page 41: MobileCONGalicia Introducción a Android

25# Dar soporte a los usuarios

● Ocupa el 25% de mi tiempo de trabajo● Parte esencial del ciclo de vida de la aplicación:

● Detección de errores● Consejos para mejoras● Mejora visibilidad, ratings de los usuarios, etc

● En general la actualización frecuente de la aplicación mejora el posicionamiento en el Market

Page 42: MobileCONGalicia Introducción a Android

Dónde aprender más (I)

● http://developer.android.com/index.html● http://android-developers.blogspot.com/● http://www.guidetotheappgalaxy.com/● http://stackoverflow.com● http://androcode.com (@JMPergar @breogangf @kix2902)

Page 43: MobileCONGalicia Introducción a Android

Dónde aprender más (II)

Desarrollé la aplicación WikiPlaces como ejemplo para LabAndroid Málaga. Esta aplicación contiene varios ejemplos de cómo hacer muchas cosas comunes en Android

● Pantalla inicial con un Dashboard

● Crear pantallas de preferencias y obtener preferencias

● Usar la API de Google Maps API (incluyendo overlays) y la Location API para obtener la ubicación

● Usar servicios JSON externos

● Listas y adapters

● Lanzar aplicaciones externas con Intents

● Integración con AdMob para mostrar anuncios

http://www.mobialia.com/labandroid

Page 44: MobileCONGalicia Introducción a Android

Dudas, preguntas...

Gracias por vuestra atención!

Alberto Alonso [email protected]

http://www.mobialia.comT: @mobialia @albertoruibal