IMPORTANT: Per accedir als fitxer de subversion: http://acacha.org/svn (sense password). Poc a poc s'aniran migrant els enllaços. Encara però funciona el subversion de la farga però no se sap fins quan... (usuari: prova i la paraula de pas 123456)

Prerequisits

Instal·lar java

Android SDK

Instal·lació

Podem descarregar-lo desde la pàgina http://developer.android.com/sdk/index.html.

Un cop descarregat l'arxiu d'instal·lació android-sdk_r20.0.3-linux.tgz l'hem de descomprimir.

$ tar xvzf android-sdk_r20.0.3-linux.tgz

Exploració

Carpeta Tools

A la carpeta tools podem fer un head de l'arxiu android per veure que conté.

$ head android
#!/bin/sh
# Copyright 2005-2007, The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software

Si l'executem desde nautilus o executant-lo desde un terminal ens obrirà una finestra per instal·lar tots els paquets per a desarrollar aplicacions per a Android.

Hugolucas sdk manager.jpeg

Un cop tenim instal·lada alguna API podrem obrir el AVD mitjançant la opció menú Tool del programa i configurar el Android Virtual Device.

Hugolucas avd manager.jpeg

Intent

Un intent és una descripció abastracte d'una operació a realitzar. És pot utilitzar amb:

  • startActivity: per iniciar una nova activitat.
  • broadcastintent: per tal d'enviar el intent a un possible BroadcastReceiver component.
  • startService o bindService: per tal de comunicar-se amb un servei en segon terme.

Un intent té la següent estructura, resumida en dos parts:

  • action: Acostuma a ser una constant que indica el tipus d'acció a realiutzar (veure, modificar, editar, etc.) Exemples: ACTION_VIEW, ACTION_EDIT, ACTION_MAIN, etc.
  • data: una URI que indica de forma unequivoca el recurs o dades seobre les que s'aplicar+a l'acció.

Aquestes són les principals però també hi ha 4 parts secundaries:

  • category: ens dona informació adicional de l'acció que volem executar.
  • type: Especifica un tipus explicit (tipus MIME) de dades del intent.
  • component: Especifica un nom explícit d'una classe de component a utilitzar pel intent.
  • extras: És un paquet d'informació adicional. Aquest es pot utilitzar per a proporcionar informació adicional per al component. Per exemple, si tenim una acció per a enviar un missatge de correu electrònic, també podriem incloure peçes adicionals de dades per a subministrar un subjecte, el cos, etc.

Recursos de les aplicacions Android (Android App Resources)

http://developer.android.com/guide/topics/resources/index.html

Una bona aplicació Android és més que només codi. Els recursos d'una aplicació Android (Android App Resources) són els fitxers addicionals que representen el contingut estàtic que el codi utilitzar (bitmaps, definicions de layouts, strings de la interfície, etc.)

Hi ha dos tipus de recursos: per defecte i alternatius.

  • Suportar diferents configuracions. Per exemple, diferents idiomes o mides de pantalla.
  • Tot això sense haver de fer modificacions del codi per tal d'adaptar l'aplicació a nous possibles dispositius o configuracions fet molt important per que contínuament surten nous dispositius amb noves característiques.
Hugolucas rsc1.jpeg
Hugolucas rsc2.jpeg
Recurs Descripció
animator/ fitxers XML que defineixen propietats de lees animacions
anim/ fitxers XML que defineixen tween animations
color/ XML files that define a state list of colors. See Color State List Resource
drawable/ Bitmap files (.png, .9.png, .jpg, .gif) or XML files that are compiled into the following drawable resource subtypes:
- Nine-Patches (re-sizable bitmaps)
- State lists
- Shapes
- Animation drawables
- Other drawables
- Drawable Resources
layout/ Fitxers XML que defineixen layouts de la interfície gràfica. Vegeu Layout Resources
menu/ Fitxers XML que defineixen menús d'aplicaciones, com els menús Options Menu, Context Menu, o Sub Menu. Vegeu Menu Resource.
raw/ Aquest és un directori tipus calix de sastre, que permet guardar qualsevol tipus de recurs en cru (raw). Es poden obrir aquests recursos amb com a
InputStream, utilitzant Resources.openRawResource() i passant com a paràmetre el resource ID, que és R.raw.filename.
values/ Conté fitxers XML que contenen valors simples, com strings, enters o colors. A diferencia de les altres carpetes on cada fitxers descriu un recurs,
aquí s'utilitza un sol fitxers per a tots els recursos del mateix tipus. Es poden posar els noms que es vulguin però es recomana:
- arrays.xml per definir vectors de recursos (aka typed arrays).
- colors.xml per valors de colors
- dimens.xml per valors de dimensions
- strings.xml per a valors de text.
- styles.xml per a definir Android styles.
xml/ Permet guardar fixers XML de qualsevol tipus. En temps d'execución aquests fitxers estan disponibles amb Resources.getXML(). Serveix per exemple per

guardar fitxers de configuració XML.

Els recursos poden ser compilats o no compilats.

  • Recursos compilats: la majoria de recursos XML de la carpeta res/ es compilen. Per exemple els layouts, els recursos simples de tipus text o el fitxer Manifest són compilats. Al compilar-los en temps d'execució es té un major rendiment al utilitzar-los.
  • Recursos no compilats: En canvi per exemple els fitxers de la carpeta res/raw no es compilen, i cal utilitzar l'API s'Streams per a llegir aquests fitxers.

Utilitzant els recursos

Hem de cridar a la classe "resources".

Tot recurs tindrà un identificador, "ID", que serà un enter, encara que treballem amb ell com si fos un nom de recurs.

Un exemple de com obtenir una recurs de tipus imatge:

ImageView imageView = (ImageView) findViewById(R.id.myimageview);
imageView.setImageResource(R.drawable.myimage);

El pàrametre és de tipus resource ID, tal i com podeu veure a la documentació API:

developer.android.com/reference/android/widget/ImageView.html
void 	setImageResource(int resId)
Sets a drawable as the content of this ImageView.

Un altre exemple molt comú és el següent codi:

@Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_main);
   }

Com utilitzar els recursos XML

La sintaxi és la següent:

@[<package_name>:]<resource_type>/<resource_name>

On:

  • <package_name>: és un valor opcional que indica el nom del paquet a on es troba el recurs. No cal posar-ho quan s'utilitzant recursos del mateix paquet.
  • <resource_type>: és la subclase de la classe R, o el que coneixem com a tipus de recurs.
  • <resource_name>: és o el nom del fitxer sense la extensió del fitxer que conté el recurs, o en le cas de recursos del tipus valor simple el valor de l'atribut android:name.

Exemples:

Declaració del recurs:

<?xml version="1.0" encoding="utf-8"?>
<resources>
   <color name="opaque_red">#f00</color>
   <string name="hello">Hello!</string>
</resources>

Ús del recurs.

<?xml version="1.0" encoding="utf-8"?>
<EditText xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:textColor="@color/opaque_red"
    android:text="@string/hello" />

En aquest fixeu-vos que no no cal indicar el paquet per que correspon a un recurs propi.

En altres casos utilitzarem recursos de sistema. Un exemple:

<?xml version="1.0" encoding="utf-8"?>
<EditText xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="fill_parent"
   android:layout_height="fill_parent"
   android:textColor="@android:color/secondary_text_dark"
   android:text="@string/hello" />

Fixeu-vos en l'ús de:

@android:

Inclús es poden crear recursos en fitxers XML per tal de crear aliases. Per exemple es pot crear un recurs de tipus drwable que sigui un alias d'un altre recurs de tipus drawable:

<?xml version="1.0" encoding="utf-8"?>
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
   android:src="@drawable/other_drawable" />

Building & Running

La següent gràfica mostra el procediment resumit de construcció i execució de les aplicacions Android i els components que intervenen:

Hugolucas build1.jpeg

Quan obrim el fitxer apk que esta creat a la carpeta del projecte podem localitzar facilment tots els arxius de l'esquema.

Hugolucas build3.jpeg

Dintre la carpeta res també trobem els recursos, com imatges, etc.

Hugolucas build4.jpeg

El següent gràfic mostra el procés detallat:

Hugolucas build2.jpeg

Localització

IMPORTANT: Recordeu que la localització és molt més que la traducció a diferents llengues d'una aplicació. Consulteu l10n i i18n per a més informació

En un mon internacionalitzat com el nostre hem de tenir en compte que les aplicacions Android es poden executar en múltiples tipus de dispositius en múltiples regions del món. Per tal de que l'aplicació pugui arribar a la majoria d'usuaris és important que l'aplicació tingui en compte les especificitats de cada regió.

La localització en Android se suporta en el conegut com a Android resource framework, ja que permet en gran manera separar la localització del codi Java.


Densitat de pantalla

Segurament la millor forma d'entendre el concepte de densitat de pantalla és comparar-ho amb la resol·lució s'indica com el nombre de pixels totals que hi ha a una pantalla (per exemple 1024x800). En canvi la densitat és quan pixels apareixen per a una unitat constant d'espai.

Si s'incrementa la resol·lució i la densitat al mateix temps la mida es manté. Aquesta és la raó per la que un G1 amb una pantalla de 320x480 i una pantalla de 480x800 d'un Droid tenen la mateixa mida.

Conceptes

  • Screen size: la mida real de la pantalla, normalment es mesura segons la diagonal de la pantalla. A Android s'agrupen les mides de pantalla en els següents conjunts: small, normal, large i extra large
  • Screen density: Mesura la qualitat dels píxels per una unitat concreta de mesura. Normalment s'utilitza el terme dpi (dots per inch). Per exemple, una pantalla de baixa densitat té menys píxels donada un àrea concreta. Per simplicitat hi ha els següents grups: low, medium, high i extra high.
  • Orientació: l'orientació de la pantalla, des del punt de vista de l'usuari, pot ser landscape o portrait.
  • Resolution: és el número total de píxels físics a una pantalla. Quan s'afegeix suport per múltiples pantalles, les aplicacions no treballen directament amb la resol·lució, és a dir només s'han de preocupar de la mida de la pantalla i de la densitat.
  • Density-independent pixel (dp): Una unitat de píxel virtual que s'ha d'utilitzar al definir el layout de la UI per tal d'utilitzar-la a les mides de dimensions o posicions d'una forma independent a la densitat utilitzada. El dp és equivalent a un píxel en la mida base: 160 dpi screen. Tota la resta són relatives a aquesta base. En temps d'execució automàticament i de forma transparent es fa la conversió de dp virtual a píxel físic:
px = dp * (dpi / 160). 

Per exemple en una pantalla de 240 dpi, 1dp equival a 1.5 pixels físics.

IMPORTANT: Sempre s'han d'utilitzar unitats dp al definir la interfície gràfica, per tal d'assegurar-se que l'aplicació es veure correctament en pantalles de diferents densitat

Els grups generals s'obtenen a partir de la següent gràfica:

Hugolucas screens-ranges.jpeg

El que si que hi ha és unes característiques mínimes per pertanyer a un grup o a un altre:

  • xlarge screens are at least 960dp x 720dp
  • large screens are at least 640dp x 480dp
  • normal screens are at least 470dp x 320dp
  • small screens are at least 426dp x 320dp

la següent imatge mostra les relacions entre bitmaps depenen de la densitat:

Hugolucas dpi.jpeg

La següent és una llista de les millors pràctiques a seguir:

  • Utilitzeu wrap_content, fill_parent, o unitat ens dps quan s'especifiquen les dimensions en un layout XML.
  • No utilitzar mai valors hardcoded de pixels en el codi.
  • No utilitzar mai AbsoluteLayout (deprecated)
  • Per cada imatge cal proporcionar bitmap drawables per a cada densitat de pantalla.

Vegeu també

Java

http://developer.android.com/index.html

http://developer.android.com/sdk/index.html