mobilecongalicia introducción a android
DESCRIPTION
Introducción a Android y mis 25 consejos para los que empiezan en AndroidTRANSCRIPT
![Page 1: MobileCONGalicia Introducción a Android](https://reader033.vdocuments.site/reader033/viewer/2022042521/54812a78b4af9f324f8b4832/html5/thumbnails/1.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022042521/54812a78b4af9f324f8b4832/html5/thumbnails/2.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022042521/54812a78b4af9f324f8b4832/html5/thumbnails/3.jpg)
Estado de las plataformas móviles (USA)
![Page 4: MobileCONGalicia Introducción a Android](https://reader033.vdocuments.site/reader033/viewer/2022042521/54812a78b4af9f324f8b4832/html5/thumbnails/4.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022042521/54812a78b4af9f324f8b4832/html5/thumbnails/5.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022042521/54812a78b4af9f324f8b4832/html5/thumbnails/6.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022042521/54812a78b4af9f324f8b4832/html5/thumbnails/7.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022042521/54812a78b4af9f324f8b4832/html5/thumbnails/8.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022042521/54812a78b4af9f324f8b4832/html5/thumbnails/9.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022042521/54812a78b4af9f324f8b4832/html5/thumbnails/10.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022042521/54812a78b4af9f324f8b4832/html5/thumbnails/11.jpg)
Tamaños de pantalla
![Page 12: MobileCONGalicia Introducción a Android](https://reader033.vdocuments.site/reader033/viewer/2022042521/54812a78b4af9f324f8b4832/html5/thumbnails/12.jpg)
Densidades de pantalla
HDPI MDPI LDPI
http://developer.android.com/guide/practices/screens_support.html
![Page 13: MobileCONGalicia Introducción a Android](https://reader033.vdocuments.site/reader033/viewer/2022042521/54812a78b4af9f324f8b4832/html5/thumbnails/13.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022042521/54812a78b4af9f324f8b4832/html5/thumbnails/14.jpg)
Mis 25 consejos
Lo que me habría gustado saber hace dos años...
![Page 15: MobileCONGalicia Introducción a Android](https://reader033.vdocuments.site/reader033/viewer/2022042521/54812a78b4af9f324f8b4832/html5/thumbnails/15.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022042521/54812a78b4af9f324f8b4832/html5/thumbnails/16.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022042521/54812a78b4af9f324f8b4832/html5/thumbnails/17.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022042521/54812a78b4af9f324f8b4832/html5/thumbnails/18.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022042521/54812a78b4af9f324f8b4832/html5/thumbnails/19.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022042521/54812a78b4af9f324f8b4832/html5/thumbnails/20.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022042521/54812a78b4af9f324f8b4832/html5/thumbnails/21.jpg)
Si bloqueamos el thread principal...
![Page 22: MobileCONGalicia Introducción a Android](https://reader033.vdocuments.site/reader033/viewer/2022042521/54812a78b4af9f324f8b4832/html5/thumbnails/22.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022042521/54812a78b4af9f324f8b4832/html5/thumbnails/23.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022042521/54812a78b4af9f324f8b4832/html5/thumbnails/24.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022042521/54812a78b4af9f324f8b4832/html5/thumbnails/25.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022042521/54812a78b4af9f324f8b4832/html5/thumbnails/26.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022042521/54812a78b4af9f324f8b4832/html5/thumbnails/27.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022042521/54812a78b4af9f324f8b4832/html5/thumbnails/28.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022042521/54812a78b4af9f324f8b4832/html5/thumbnails/29.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022042521/54812a78b4af9f324f8b4832/html5/thumbnails/30.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022042521/54812a78b4af9f324f8b4832/html5/thumbnails/31.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022042521/54812a78b4af9f324f8b4832/html5/thumbnails/32.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022042521/54812a78b4af9f324f8b4832/html5/thumbnails/33.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022042521/54812a78b4af9f324f8b4832/html5/thumbnails/34.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022042521/54812a78b4af9f324f8b4832/html5/thumbnails/35.jpg)
Un ejemplo de Min3D: Slot Racing
![Page 36: MobileCONGalicia Introducción a Android](https://reader033.vdocuments.site/reader033/viewer/2022042521/54812a78b4af9f324f8b4832/html5/thumbnails/36.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022042521/54812a78b4af9f324f8b4832/html5/thumbnails/37.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022042521/54812a78b4af9f324f8b4832/html5/thumbnails/38.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022042521/54812a78b4af9f324f8b4832/html5/thumbnails/39.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022042521/54812a78b4af9f324f8b4832/html5/thumbnails/40.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022042521/54812a78b4af9f324f8b4832/html5/thumbnails/41.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022042521/54812a78b4af9f324f8b4832/html5/thumbnails/42.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022042521/54812a78b4af9f324f8b4832/html5/thumbnails/43.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022042521/54812a78b4af9f324f8b4832/html5/thumbnails/44.jpg)
Dudas, preguntas...
Gracias por vuestra atención!
Alberto Alonso [email protected]
http://www.mobialia.comT: @mobialia @albertoruibal