+ All Categories
Home > Documents > Android Programming

Android Programming

Date post: 29-Oct-2015
Category:
Upload: danix89
View: 191 times
Download: 6 times
Share this document with a friend
Description:
The manual of android programming

of 104

Transcript
  • Approfondimenti tematici

    Il corso completo per imparare a programmare con il S.O. Google

    dedicato agli smartphone

    Android PROGRAMMING

  • Questo approfondimento tematico pensato per chi vuol imparare a programmare e creare software per gli smartphone con sistema operativo Google Android. La prima parte del testo guida il lettore alla conoscenza degli strumenti necessari per sviluppare sulla piattaforma mobile di Mountain View (installa-zione SDK, librerie e tool di supporto allo sviluppo).Le sezioni successive sono pensate per un apprendi-mento pratico basato su esempi di progetto: dialogo e interazione con lambiente operativo del telefo-nino, interazione con gli utenti, componenti di un widget, interfacce in XML, gestione del touch, proget-tazione dei menu e via dicendo.Una serie di esempi pratici da seguire passo passo che spingono il lettore a sperimentare sul campo il proprio livello di apprendimento e lo invitano a imparare divertendosi.

    Android programming

  • PROGRAMMARE GOOGLE ANDROID . . . . . . . . . . . . . . 4 Primo appuntamento alla scoperta di android. installeremo gli strumenti di sviluppo necessari e faremo la conoscenza dei principi di base che regolano il funzionamento del sistema mobile realizzato da google

    LE RISORSE ESTERNE IN GOOGLE ANDROID . . . . . . . 12In questo secondo articolo impareremo a manipolare le risorse esterne. Scopriremo che android rende facile lutilizzo di tutto quello che, pur non essendo codice, indispensabile al corretto funzionamento di unapplicazione

    COME IL SISTEMA GESTISCE LE ATTIVIT . . . . . . . . . 16Terzo appuntamento. Le attivit sono il componente software pi utilizzato dai programmatori android. in questo articolo impareremo cos unattivit, come viene gestita dal sistema e come possiamo realizzarne di nostre

    INTERFACCE: LAYOUT E COMPONENTI . . . . . . . . . . . . 21Quarto appuntamento. inizia la trattazione dei concetti e degli strumenti di android per la costruzione e la gestione delle interfacce utente. si comincia con i widget ed i layout di base, indispensabili in ogni applicazione

    INTERFACCE IN XML PER ANDROID . . . . . . . . . . . . . . 26Quinto appuntamento. vi sembrato che il design java di uninterfaccia utente, in android, sia lungo e noioso? nessun problema! oggi impareremo a servirci dellxml per velocizzare e semplificare loperazione

    GESTIRE IL TOUCH SU ANDROID . . . . . . . . . . . . . . . . 31Sesto appuntamento. in questa puntata del corso impareremo le varie tecniche per intercettare le azioni di tocco e digitazione eseguite dallutente sui widget presenti nel display, in modo da reagire di conseguenza

    ANDROID: TUTTO SUI MENU . . . . . . . . . . . . . . . . . . . 36Settimo appuntamento. argomento del mese sono i menu. le applicazioni android ne supportano diversi tipi, che lutente pu sfruttare per azionare comandi e impostare le opzioni. conosciamoli e impariamo a programmarli

    NOTIFICHE E FINESTRE DI DIALOGO . . . . . . . . . . . . . . 41Ottavo appuntamento. questo mese incrementeremo linterattivit delle nostre applicazioni, dotandole della possibilit di emettere degli avvisi e di interrogare lutente attraverso le finestre di dialogo

    INFO E FOTO: COS LE PRESENTI MEGLIO! . . . . . . . . . 47Nono appuntamento. ci occuperemo dei widget in grado di leggere le informazioni da organizzare e mostrare allutente. scopriremo i componenti utilizzati per realizzare liste, tabelle e gallerie di immagini

    UNAPPLICAZIONE CON STILE . . . . . . . . . . . . . . . . . . . 52Il design uno dei fattori pi importanti in ambito mobile. non sufficiente che unapplicazione funzioni: deve anche essere elegante

    e gradevole alla vista. Per questo oggi scopriremo come gestire il look delle applicazioni

    LO STORAGING SECONDO ANDROID . . . . . . . . . . . . . 57Leggere e scrivere file dal disco di uno smartphone android unoperazione possibile ma soggetta a restrizioni di sicurezza e a norme di buon uso. Oggi impareremo come utilizzare correttamente il file system di android

    DATABASEDA TASCHINO . . . . . . . . . . . . . . . . . . . . . . . 61Una delle caratteristiche pi interessanti di android il dbms integrato nel sistema, che dota le applicazioni della capacit di archiviare e ricercare velocemente i dati. in questo articolo impareremo come approfittarne

    GESTIONE DEI CONTENT PROVIDER . . . . . . . . . . . . . . 67I content provider costituiscono la maniera di android per condividere dati fra le applicazioni. in questo articolo impareremo a consultare i provider predefiniti e vedremo anche come costruire un fornitore di contenuti custom

    LE APPLICAZIONI GIRANO IN PARALLELO . . . . . . . . . 71I servizi sono quella funzionalit di android che permette di eseguire operazioni in sottofondo, anche quando lapplicazione che le ha avviate non pi attiva. Insomma: multitasking allo stato puro, anche in mobilit!

    TU SEI QUI! TE LO DICE ANDROID . . . . . . . . . . . . . . . 75I servizi location-based sono una delle caratteristiche pi attraenti di android. impariamo a realizzare applicazioni in grado di localizzare lutente via gps e di disegnare la sua posizione in una mappa

    APP ANDROID FACILI CON APP INVENTOR . . . . . . . . 81App Inventor il nuovo sistema di google per creare applicazioni android senza scrivere una sola riga di codice. scopriamo in cosa consiste e utilizziamolo per realizzare facilmente le nostre idee

    PORTA TWITTER SU GOOGLE ANDROID . . . . . . . . . . . 88In questo articolo vedremo come sviluppare unapplicazione per android, capace di dialogare con il servizio di Social Networking Twitter. A tal scopo mostreremo come utilizzare la libreria Twitter4j

    UN CLIENT TWITTER SU ANDROID . . . . . . . . . . . . . . . 93Continuiamo e completiamo il nostro progetto per implementare un client Twitter sulla piattaforma Android. Loccasione ci permetter di approfondire molti aspetti sul funzionamento del sistema operativo creato da Google

    ANDROID DIALOGA CON OUTLOOK . . . . . . . . . . . . . 98Il paradigma del data on the cloud risulta comodo quando si vogliono gestire le stesse informazioni da diversi client, eterogenei tra loro. In questo articolo lo adopereremo per tenere sincronizzate delle note tra android e outlook

  • Android programming 4

    Android programming Gli strumenti necessari per imparare a programmare Android

    PROGRAMMAREGOOGLE ANDROIDPRIMO APPUNTAMENTO ALLA SCOPERTA DI ANDROID. INSTALLEREMO GLI STRUMENTI DI SVILUPPO NECESSARI E FAREMO LA CONOSCENZA DEI PRINCIPI DI BASE CHE REGOLANOIL FUNZIONAMENTO DEL SISTEMA MOBILE REALIZZATO DA GOOGLE

    Meno di due anni fa Google ha rilasciatouna versione preliminare del kit di svi-luppo di Android, il suo nuovo SOdedicato agli smartphone. Futurologi e sempliciappassionati si divisero immediatamente traentusiasti e scettici. I detrattori, in particolarmodo, hanno sempre visto in Android un esperi-mento, e non qualcosa di reale al quale i produt-tori di dispositivi avrebbero creduto. A loro favo-re ha deposto il fatto che, per un periodo piutto-sto lungo, nessuno smartphone equipaggiatocon Android ha fatto capolino sul mercato, ben-ch il sistema e i suoi strumenti di sviluppo fos-sero ormai disponibili da parecchio tempo. Latecnica di Google, in realt, era ed ancora quel-la di sempre: far venire lacquolina in bocca (e farparlare di s) con versioni preliminari dei suoisoftware e dei suoi servizi.Nel caso di Android, molti sviluppatori sonostati fidelizzati e fatti appassionare a un siste-ma che, allora, non era ancora sul mercato. Nel frattempo le cose sono cambiate: Android stato consolidato, e molti produttori didispositivi mobili hanno aderito o stanno ade-rendo allalleanza capeggiata da Google. Grazie alle strategie di Google, esiste gi unacomunit molto ampia di sviluppatori, estre-mamente produttiva, che altri sistemi mobilinon possono vantare. Migliaia di applicazionisono state gi sviluppate, e molte altre losaranno nei prossimi tempi. Il sistema appare inoltre stabile ed offrepotenzialit molto ampie. Per questo motivo,a partire dal numero che state leggendo,ioProgrammo dedicher ad Android un corsodi programmazione a puntate. Si comincia, naturalmente, con lo studio del-larchitettura del sistema, linstallazione elutilizzo degli strumenti di sviluppo, unprimo compendio sui principi di base dellaprogrammazione Android e lo sviluppo di unaprima semplice applicazione del tipo CiaoMondo.

    COME FATTOANDROIDAndroid, essendo un sistema operativo dimoderna fattura, abbastanza complesso.Anche se il suo target sono i dispositivi mobi-li, larchitettura di Android ha poco da invi-diare a quelle dei comuni sistemi per desktopo laptop. Tale architettura presentata sche-maticamente in Fig.1.Come si evince dalla figura, Google ha attintoa piene mani dal mondo Open Source. Il cuore di ogni sistema Android, tanto percominciare, un kernel Linux, versione 2.6.Direttamente nel kernel sono inseriti i driverper il controllo dellhardware del dispositivo:driver per la tastiera, lo schermo, il touchpad,il Wi-Fi, il Bluetooth, il controllo dellaudio ecos via. Sopra il kernel poggiano le libreriefondamentali, anche queste tutte mutuate dalmondo Open Source. Da citare sono senzal-tro OpenGL, per la grafica, SQLite, per lagestione dei dati, e WebKit, per la visualizza-zione delle pagine Web. Insomma, nei prossi-mi mesi avremo di che discutere!Larchitettura prevede poi una macchina vir-tuale e una libreria fondamentale che, insie-

    COVER STORY Gli strumenti necessari per imparare a programmare Android

    ht tp ://www. ioprogrammo. i t

    G 14 /Ottobre 2009

    CD WEBcorsoandroid1.zip

    cdrom.ioprogrammo.it

    Conoscenze richiesteBasi di Java

    SoftwareJava SDK (JDK) 5+,Eclipse 3.3

    Impegno

    Tempo di realizzazione

    REQUISITI

    Fig. 1: Larchitettura di Google Android

    014-021:088-093-corsi-xsl 31-08-2009 18:01 Pagina 14

  • 5 Android programming

    Android programmingGli strumenti necessari per imparare a programmare Android

    ht tp ://www. ioprogrammo. i t Ottobre 2009/ 15 G

    Gli strumenti necessari per imparare a programmare Android COVER STORY

    me, costituiscono la piattaforma di sviluppoper le applicazioni Android. Questa macchinavirtuale si chiama Dalvik, e sostanzialmente una Java Virtual Machine. Come verifichere-mo pi tardi, alcune delle caratteristiche diDalvik e della sua libreria non permettono diidentificare immediatamente la piattaformaJava disponibile in Android con una di quelledi riferimento (Java SE, Java ME).Nel penultimo strato dellarchitettura possi-bile rintracciare i gestori e le applicazioni dibase del sistema. Ci sono gestori per le risor-se, per le applicazioni installate, per le telefo-nate, il file system e altro ancora: tutti compo-nenti di cui difficilmente si pu fare a meno.Infine, sullo strato pi alto dellarchitettura,poggiano gli applicativi destinati allutentefinale. Molti, naturalmente, sono gi inclusicon linstallazione di base: il browser ed ilplayer multimediale sono dei facili esempi. A questo livello si inseriranno anche le appli-cazioni che, insieme, impareremo a sviluppa-re nellarco di questo corso a puntate.

    ANDROID SDKPer sviluppare applicazioni in grado di giraresu sistemi Android, necessario installare sulproprio PC un apposito kit di sviluppo (SDK),che sia completo di emulatore, librerie edocumentazione. Se avete gi sviluppato perpiattaforme quali Java ME o Windows Mobile,capite bene cosa intendiamo (ma se nonlavete mai fatto, non vi preoccupate: qui sispiega tutto). La prima buona notizia chelAndroid SDK disponibile gratuitamente esenza discriminazioni per sistemi Windows,Linux e MacOS X. Come inizio, non c male. possibile scaricarlo collegandosi allindiriz-zo: http://developer.android.com/sdk/Vi verr proposto di scaricare la pi recenteversione disponibile. Procedete pure al down-load del pacchetto adatto al vostro sistema. Al momento della stesura di questo articolo,la versione scaricabile dalla pagina la 1.5_r3(che sta per 1.5 Release 3), ma se ne trovate dipi recenti fate pure: non dovrebbero differiretroppo da quella presa qui a riferimento.Linstallazione del kit veramente semplice.Lunica cosa di cui bisogna accertarsi, primadi procedere, di soddisfare i requisiti di base.In particolare, richiesto che il sistemadisponga gi di un Java SDK (JDK) versione 5o successiva. strettamente indispensabilesoddisfare questo requisito, poich Android siprogramma in Java, e senza un JDK non pos-sibile compilare il codice. Dopo aver verifica-

    to i requisiti, possibile procedere. Prendetelarchivio ZIP scaricato da Internet e scompat-tatelo dove meglio preferite. tutto: lAndroidSDK gi pronto alluso! Al massimo si puperfezionare linstallazione aggiungendo allavariabile dambiente PATH del sistema opera-tivo il percorso della cartella tools che allin-terno dellAndroid SDK. Cos facendo sar pisemplice invocare gli eseguibili del kit da rigadi comando. Loperazione, ad ogni modo, non indispensabile per un corretto funziona-mento del kit. In questo corso, inoltre, cerche-remo di servirci il meno possibile della riga dicomando, anche se in alcune occasioni tor-ner utile se non indispensabile.

    ADT PER ECLIPSEBench Android SDK disponga di script che au-tomatizzano linstallazione delle applicazioni,il lancio dellemulatore e il debug del codice,lavorare in un ambiente integrato, con ogni op-zione a portata di clic, sicuramente pi facile.Specie quando lambiente integrato si chiama Ecli-pse. Nel sito di Android contattato in prece-denza disponibile anche un plug-in per la ce-lebre piattaforma di sviluppo Open Source. Que-sto add-on si chiama Android Development Toolsfor Eclipse, che abbreviato diventa ADT. Il modulo, al momento della stesura di questo ar-ticolo, funziona con le pi recenti versioni di

    Fig. 2: Configurando la nuova fonte in Eclipse, possibile scaricare ed installareautomaticamente il plug-in per lo sviluppo del software Android (Eclipse 3.5)

    014-021:088-093-corsi-xsl 31-08-2009 18:01 Pagina 15

  • Android programming 6

    Android programming Gli strumenti necessari per imparare a programmare AndroidCOVER STORY Gli strumenti necessari per imparare a programmare Android

    ht tp ://www. ioprogrammo. i tG 16 /Ottobre 2009

    Eclipse, che sono la 3.3, la 3.4 e anche la nuova3.5. Pu essere installato direttamente dallin-terno della piattaforma di sviluppo.Avviate Eclipse ed eseguite il wizard perlinstallazione di nuovi componenti. In Eclipse3.5 lo si fa con la voce di menu Help InstallNew Software. Nella 3.4 la voce di menu Help Software Updates, e poi si deve selezionare lascheda Available software. In Eclipse 3.3, infine,la voce di menu da richiamare Help Softwa-re Updates Find and install, scegliendo poiSearch for new features to install. Giunti a de-stinazione, scegliete lopzione per aggiungereun nuovo sito remoto alla lista delle fonti pre-sentate dal wizard (pulsante Add). Lindirizzoda specificare :https://dl-ssl.google.com/android/eclipse/r

    A questo punto selezionate la voce corrispondentealla nuova fonte e procedete attraverso i singo-li passi del wizard. Il plug-in per lo sviluppo delsoftware Android sar automaticamente scari-cato e installato. Dopo il riavvio di Eclipse, recateviimmediatamente nella schermata delle preferenzedellambiente (voce di menu Window Prefe-rences). Qui troverete disponibile la nuova ca-tegoria Android, nellelenco sulla sinistra. Selezionatela e impostate il percorso del vostroAndroid SDK: necessario affinch Eclipse pos-sa agganciare il kit di sviluppo. Durante questafase dovreste anche ricevere un pop-up perlaccettadella licenza del plug-in.

    Per ora possibile tralasciare le altre possibiliimpostazioni collegate al plug-in: imparere-mo ad usarle pi avanti, quando avremopreso pi confidenza con lambiente.

    GESTIONE DEGLI AVDIl kit di sviluppo comprende un emulatore checi consentir di provare le nostre creazioni sulPC, prima di installarle su un reale dispositivo

    equipaggiato con Android. Per sviluppare leapplicazioni, quindi, dobbiamo imparare ainteragire con questo emulatore. Il primoconcetto che si deve assimilare quello cheha nome Android Virtual Device (AVD), ciodispositivo virtuale Android. Nel nostro PCpossiamo creare e configurare quanti disposi-tivi virtuali vogliamo. come avere tanti diffe-renti smartphone da utilizzare per i propritest, solo che invece di dispositivi di plastica esilicio si tratta di macchine virtuali, fatte ciodi puro software, da eseguire attraversolemulatore. In questo modo anche possibi-le avviare contemporaneamente sullo stessoPC due o pi dispositivi virtuali, ad esempioper testare unapplicazione che fa interagirepi smartphone, come una chat o un giocomultiplayer. Impariamo allora a gestirelelenco dei dispositivi virtuali configurati nelnostro Android SDK. possibile gestirli dariga di comando, usando il comando androidche nella cartella tools del kit di sviluppo, maluso dellinterfaccia di gestione resa disponi-bile da ADT in Eclipse ci render loperazionesenzaltro pi agevole. Attivate la voce dimenu Window Android AVD Manager.

    La finestra presenta la lista dei dispositivi vir-tuali configurati (inizialmente vuota) e lamaschera per la creazione di una nuova istan-za. Sfruttiamo questa possibilit e creiamo ilnostro primo AVD. Le voci da compilare sono:

    Name: il nome che si vuole attribuire al dispositivo virtuale, ad esempio Android1.

    Target: la tipologia del dispositivo. Scegliamo Android 1.5. Creeremo cos un dispositivo virtuale compatibile con la versione 1.5delle specifiche di Android.

    SD Card: qui possibile dotare il dispositivo virtuale di una scheda di memoria vir-tuale. possibile specificare sia il percorsodi un file di immagine di una scheda di memoria, se si vuole riutilizzare una memoria

    Fig. 3: Affinch il plug-in funzioni correttamente necessario fornire il percorso dellAndroid SDK

    Fig. 4: La maschera di gestione dei dispositivi virtualiAndroid

    014-021:088-093-corsi-xsl 31-08-2009 18:01 Pagina 16

  • 7 Android programming

    Android programmingGli strumenti necessari per imparare a programmare Android

    ht tp ://www. ioprogrammo. i t Ottobre 2009/ 17 G

    Gli strumenti necessari per imparare a programmare Android COVER STORY

    virtuale esi stente, sia una dimensione di spazio, per creare una nuova memoria virtuale. Percorriamo questultima strada especifi chiamo il valore 64M. Verr cos creata una scheda di memoria virtuale di 64MB.

    Skin: dallelenco possibile scegliere la risoluzione del dispositivo. Le scelte possibili sono HVGA-P (equivalente a 480x320),HVGA-L (320x480), QVGA-P (320x240) e QVGA-L (240x320). C poi una scelta di default chiamata semplicemente HVGA, che corrisponde comunque a HVGA-P. Lascia mola selezionata.

    Dopo aver impostato questi valori, confer-miamo loperazione con il tasto Create AVD.Il nuovo dispositivo virtuale entrer a farparte dellelenco gestito dal manager, e da orapotr essere utilizzato per eseguire il debug eil test delle applicazioni.

    PROVIAMO LEMULATORESe non siete pratici nellutilizzo di Android,prima di iniziare a programmare meglio checi prendiate confidenza. Esplorando le appli-cazioni di base potrete cos entrare nellotticadel sistema, per imparare i principi di funzio-namento e di design delle sue applicazioni.Potete avviare un dispositivo virtuale dalle-sterno di Eclipse, al solo scopo di fare un girodi ricognizione. Con il prompt dei comandiposizionatevi nella directory tools del kit disviluppo. Lanciate ora un comando del tipo:emulator @NomeAVDA NomeAVD dovete sostituire il nome che,nel corso del paragrafo precedente, aveteassegnato al dispositivo virtuale creato. Ad esempio: emulator @Android1Qualche istante di pazienza (al primo lancioanche qualcosa in pi) e lemulatore cari-cher e render disponibile il dispositivo vir-tuale Android, in tutto il suo splendore. Con ilmouse possibile simulare il touchpad deldispositivo, cliccando sullo schermo. Fateviun giro e prendete pure confidenza conlambiente. Come prima cosa divertitevi conle applicazioni di base, come il browser o larubrica: vi aiuteranno molto nel comprenderei principi di utilizzo del sistema. Poi passate adel materiale pi tecnico: il menu principalecontiene la voce Dev Tools, che raccoglieuna serie di strumenti dedicati a chi Androidvuole programmarlo, e non solo farci un girodi prova. Tra questi spicca lemulatore di ter-minale, che permette di avere una shell di

    sistema per uninterazione di pi basso livellocon il dispositivo.

    CIAO, MONDO ANDROIDE! venuto il momento di utilizzare ADT elemulatore per programmare la nostra primaapplicazione Android. Naturalmente sar una variante del classicoCiao, Mondo!.Avviate Eclipse. Grazie ad ADT disponete oradi una nuova categoria di progetto, chiamataAndroid Project. Create un progetto di que-sto tipo.Nel wizard di creazione del progettoutilizzate la configurazione che viene riporta-ta di seguito: Project name: CiaoMondoAndroide Build target: selezioniamo Android 1.5. Application name: Ciao Mondo Package name: it.ioprogrammo.helloandroid CreateActivity: CiaoMondoAndroideActivity

    Fig. 5: Configurazione dellemulatore di Android

    Fig. 6: Il nuovo tipo di progetto Android Project ora disponibile in Eclipse

    014-021:088-093-corsi-xsl 31-08-2009 18:01 Pagina 17

  • Android programming 8

    Android programming Gli strumenti necessari per imparare a programmare Android

    Il progetto, a questo punto, pu essere creato, azio-nando il tasto Finish.

    Eclipse popoler automaticamente il progetto, in-serendo le librerie di Android e la struttura di basedei progetti per questa piattaforma. In uno slan-cio di generosit, Eclipse provveder anche allacreazione della prima classe della soluzione, chia-mata CiaoMondoAndroideActivity (come specifi-cato alla voce Create Activity) e inserita nel pac-chetto it.ioprogrammo.hello android (come allavoce Package name). Aprite il codice della classee modificatelo alla seguente maniera:

    package it.ioprogrammo.helloandroid;

    import android.app.Activity;

    import android.os.Bundle;

    import android.widget.TextView;

    public class CiaoMondoAndroideActivity extends Activity

    {

    @Override public void onCreate(Bundle save

    dInstanceState) {super.onCreate(savedInstanceState);

    TextView tv = new TextView(this);

    tv.setText("Ciao, Mondo Androide!");

    setContentView(tv);

    }

    }

    Ora selezionate la radice del progettoCiaoMondoAndroide, attivate il menu con-testuale da tasto destro e lanciate la voce RunAs Android Application.Lemulatore verr caricato. Eclipse provveder

    automaticamente a installare al suo internolapplicazione CiaoMondoAndroide, per poiavviarla non appena loperazione sar com-pletata. fatta: il vostro primo software perAndroid sta girando davanti ai vostri occhi.Successivamente, accedendo alle configurazionidi esecuzione (voce di menu Run Run Configurations in Eclipse 3.5 e 3.4, Run Open RunDialog in Eclipse 3.3), sar possibile alterare iparametri di avvio dellemulatore e dellapplica-zione. Tra questi, anche il dispositivo virtuale sulquale sar installato e avviato il software.

    Vi consigliamo di fare qualche esperimento.Provate, ad esempio, a creare differenti AVD, col-laudando cos il software con schermi di diffe-renti dimensioni e proporzioni. Un altro esperi-mento interessante, che vi consiglio di compiereprima di procedere oltre, lutilizzo del debuggerdi Eclipse con lapplicazione Android. Ponete unbreakpoint sulla classe realizzata e avviate dinuovo emulatore ed applicazione, questa volta inmodalit debug.

    DALVIK E LE LIBRERIE ANDROIDSuperata la prova del primo progetto Android,torniamo ad occuparci dei concetti fondamen-tali per la programmazione in questo ambien-te. Come abbiamo appreso e dimostrato, la piat-taforma di sviluppo di natura Java. Tuttavia sitratta di una piattaforma particolare e perso-nalizzata, che vale la pena approfondire. La macchina virtuale, chiamata Dalvik, sembra

    COVER STORY Gli strumenti necessari per imparare a programmare Android

    ht tp ://www. ioprogrammo. i t

    G 18 /Ottobre 2009

    Fig. 8: Eclipse mette a disposizione lopzione di avvio Android Application

    Fig. 7: Wizard di creazione di un nuovo Android Project di Eclipse

    Fig. 9: Lapplicazione Ciao Mondo, eseguita dallemulatore

    NOTA

    OPEN HANDSETALLIANCE

    Per essere precisi, dietroAndroid non c soltanto

    Google. Il colosso diMountain View ha fatto laprima mossa e di sicuro lattore di maggior peso,tuttavia levoluzione diAndroid curata da unconsorzio denominato

    Open Handset Alliance. Delgruppo, oltre a Google,

    fanno parte numerosi altrinomi interessanti, tra cuiHTC (la prima a produrre

    dispositivi equipaggiati conAndroid), Intel, Motorola,

    Samsung, LG e molti altri.C anche Telecom Italia.

    Per approfondire:http://www.openhan

    dsetalliance.com/

    014-021:088-093-corsi-xsl 31-08-2009 18:01 Pagina 18

  • 9 Android programming

    Android programmingGli strumenti necessari per imparare a programmare Android

    ht tp ://www. ioprogrammo. i t

    essere una Java Virtual Machine, ma in realtnon lo del tutto. Ci spieghiamo meglio: unaJava Virtual Machine esegue del codice byteco-de, giusto? Ecco, la Dalvik Virtual Machine nonesegue bytecode standard, ma un altro lin-guaggio, chiamato DEX (Dalvik EXecutable),studiato appositamente per una migliore resain uno smartphone. Con lAndroid SDK ed Ecli-pse, ad ogni modo, ci sembrer di utilizzare unaregolare Java Virtual Machine. Lambiente disviluppo, infatti, provvede automaticamentealla generazione del codice DEX, ri-compilan-do il bytecode che a sua volta frutto di una pri-ma comune compilazione Java. Per noi sar tut-to trasparente. Questa peculiarit di Dalvik,quindi, non influenzer il nostro modo di pro-grammare. La stessa considerazione, invece,non pu essere fatta riguardo la libreria di baseche affianca Dalvik. Aprite il documento al per-corso docs/reference/packages.html, nel vostroAndroid SDK. lindice dei package Java com-presi nella libreria di base. Scorretela velocemente e traete pure le primeconclusioni. C parecchio della Standard Edi-tion di Java, ma non c tutto. Ad esempio non ci sono AWT e Swing.I pacchetti fondamentali, per, ci sono tutti, edappaiono in larga misura identici a come li vuo-le Sun. Davvero poco viene dalla Micro Edition,praticamente nulla. La piattaforma Java ME stata snobbata da An-droid, che le ha preferito una libreria pi simi-le a quella di un sistema desktop. Non passanopoi inosservati i tanti package con prefisso an-droid che, naturalmente, sono esclusivi di que-sta speciale piattaforma. Servono per linterazionediretta con le funzionalit del sistema sotto-stante. Ad esempio: il package android.widget con-tiene i componenti custom di Android per lacostruzione delle interfacce grafiche (in Ciao-MondoAndroide abbiamo usato TextView); nelpacchetto android.graphics ci sono le funzioniprimitive per la grafica di pi basso livello; inandroid.location ci sono gli strumenti per inte-ragire con un eventuale ricevitore GPS com-preso nel dispositivo. Ciascuno dei pacchetti Android, naturalmen-te, meriterebbe una trattazione estesa e com-pleta, tanti sono i possibili campi di applica-zione. Ne emerge il profilo di una piattaforma disviluppo complessa, perch molto ricca, masemplice, perch ordinata e perch condivideparecchio con ledizione tradizionale di Java.Il consiglio, naturalmente, quello di teneresempre a portata di mano la documentazione del-le API di Android. Fatevi poi guidare dalla cu-riosit: date pure una prima occhiata alle clas-si che pi stuzzicano la vostra fantasia.

    PRINCIPI DI PROGRAMMAZIONEChi programma con Java ME sa che le MIDletsono il mattone fondamentale delle applicazioniMIDP; chi crea applicazioni Web con Java EE nonpu ignorare cosa sia una Servlet; persino i pro-grammatori meno esperti sanno che le applica-zioni Java, per girare in un browser, devono esse-re inglobate in una Applet. Tutto questo per dire che ciascun ambiente, Javae non, dispone dei suoi mattoni fondamentali,che lo sviluppatore pu estendere e implementa-re per trovare un punto di aggancio con la piat-taforma. Android non sfugge alla regola, anzi la amplifica.A seconda di quel che si intende fare disponibi-le un diverso modello. Android fornisce quattromattoni di base:

    AttivitLe attivit sono quei blocchi di unapplica-zione che interagiscono con lutente utiliz-zando lo schermo e i dispositivi di inputmessi a disposizione dallo smartphone. Comunemente fanno uso di componenti UIgi pronti, come quelli presenti nel pac-chetto android.widget, ma questa non ne-cessariamente la regola. La classe dimo-strativa CiaoMondoAndroideActivity unat-tivit. Le attivit sono probabilmente il mo-dello pi diffuso in Android, e si realizzanoestendendo la classe base android.app.Activity.

    ServizioUn servizio gira in sottofondo e non intera-gisce direttamente con lutente. Ad esempio pu riprodurre un brano MP3,mentre lutente utilizza delle attivit per fa-re altro. Un servizio si realizza estendendo laclasse android.app.Service.

    Broadcast ReceiverUn Broadcast Receiver viene utilizzato quan-do si intende intercettare un particolareevento, attraverso tutto il sistema. Ad esem-pio lo si pu utilizzare se si desidera com-piere unazione quando si scatta una foto oquando parte la segnalazione di batteria sca-rica. La classe da estendere android. con-tent.BroadcastReceiver.

    Content ProviderI Content Provider sono utilizzati per espor-re dati e informazioni. Costituiscono un ca-nale di comunicazione tra le differenti ap-plicazioni installate nel sistema. Si pu crea-re un Content Provider estendendo la clas-se astratta android.content.ContentProvider.

    Ottobre 2009/ 19 G

    Gli strumenti necessari per imparare a programmare Android COVER STORY

    NOTA

    SITO DI RIFERIMENTOIl principale sito Web diriferimento per tutti glisviluppatori Android delmondo , naturalmente,quello ufficiale,raggiungibile allindirizzo:http://developer.android.com/

    NOTA

    DOCUMENTAZIONETantissimadocumentazione (soltantoin inglese, per) messa adisposizione nella cartelladocs dellAndroid SDK.

    014-021:088-093-corsi-xsl 31-08-2009 18:01 Pagina 19

  • Android programming 10

    Android programming Gli strumenti necessari per imparare a programmare Android

    NOTA

    IL TOOL ADBOltre allemulatore, la

    cartella tools dellAndroidSDK contiene un altro

    strumento moltointeressante, chiamato

    adb. Si utilizza da riga dicomando. Lanciatelo senza

    parametri, e avrete unveloce aiuto in linea sulle

    funzionalit messe adisposizione. In particolare,

    mentre lemulatore inesecuzione, i comandi adb

    install e adb uninstallpossono essere utilizzati

    per installare e rimuovereapplicazioni dal dispositivo,

    mentre lo specialecomando adb shell

    permette di aprire una shellsul sistema Android

    emulato.

    COVER STORY Gli strumenti necessari per imparare a programmare Android

    ht tp ://www. ioprogrammo. i tG 20 /Ottobre 2009

    Unapplicazione Android costituita da uno opi di questi elementi. Molto frequentemente,contiene almeno unattivit, ma non dettoche debba sempre essere cos.

    I PACCHETTI APKLe applicazioni Android sono distribuite sottoforma di file APK (Android Package). Al loro in-terno vengono raccolti gli eseguibili in formatoDEX, le eventuali risorse associate e una seriedi descrittori che delineano il contenuto delpacchetto. In particolare, nel cosiddetto mani-festo, vengono dichiarate le attivit, i servizi, iprovider e i receiver compresi nel pacchetto, inmodo che il sistema possa agganciarli e azio-narli correttamente.Torniamo, in Eclipse, sul progetto CiaoMon-doAndroide. Al suo interno troverete un file chia-mato AndroidManifest.xml, fatto come segue:

    il manifesto descrittore citato poco fa. Al suointerno potete e dovete dichiarare i componentidel vostro software. Eclipse, allatto di creazio-ne del progetto, ha gi eseguito su di esso alcu-ne configurazioni iniziali. Ad esempio ha registrato lattivit CiaoMon-doAndroideActivity, ha specificato le proprietgenerali dellapplicazione e ha anche generatoe impostato unicona per il nostro programma(res/drawable /icon.png). Ovviamente questescelte possono essere alterate, e nuovi compo-nenti possono essere aggiunti al progetto. Con lo speciale editor visuale messo a disposi-zione da Eclipse, vi risulter tutto molto sem-plice: sufficiente fare un po di pratica e ap-profondire di volta in volta laspetto dinteresse.Una volta che il lavoro stato completato, possibile esportare il file APK da distribuire aifortunati possessori di un sistema Android. Prima di distribuire in giro il pacchetto pernecessario apporre su di esso una firma digi-tale. In caso contrario, Android non potrinstallarne i contenuti. Questo lunico vincolo imposto dal sistema.Il fatto che un pacchetto debba essere firmatonon deve preoccupare lo sviluppatore: non necessario che una certification authorityriconosca la chiave utilizzata per la firma. Di conseguenza possibile firmare un pac-chetto APK anche servendosi di un certificatofatto in casa. In parole semplici: non bisognapagare nessuno perch i nostri software sianoautorizzati, possiamo fare tutto da noi. In Eclipse, ancora una volta, questione di unclic: aprite il menu contestuale sulla radicedel progetto (tasto destro del mouse, inWindows) e selezionate la voce Android Tools Export Signed Application Package.Al secondo step del wizard di generazione delpacchetto, vi verr chiesto da dove prelevarela firma digitale. Solitamente gli oggetti di questo tipo vengonoraccolti e conservati allinterno di un keysto-re. In un keystore, cio, ci sono pi firme digi-tali. Se non avete mai formato un keystore inprecedenza, o se semplicemente ne volete ini-ziare uno nuovo, selezionate lopzione Createnew keystore.Il keystore verr conservato allinterno di unfile, il cui percorso va obbligatoriamente spe-

    Fig. 10: Lo speciale editor messo a disposizione da Eclipse per il fileAndroidManifest.xml

    014-021:088-093-corsi-xsl 31-08-2009 18:01 Pagina 20

  • 11 Android programming

    Android programmingGli strumenti necessari per imparare a programmare Android

    LAUTORE

    Carlo Pelliccia lavorapresso 4IT (www.4it.it),dove si occupa di analisi esviluppo software perpiattaforme Java. Nella suacarriera di technical writerha pubblicato cinquemanuali ed oltrecentocinquanta articoli,molti dei quali proprio tra lepagine di ioProgrammo. Ilsuo sito, che ospita anchediversi progetti Java OpenSource, disponibileallindirizzowww.sauronsoftware.it

    Gli strumenti necessari per imparare a programmare Android COVER STORY

    ht tp ://www. ioprogrammo. i t Ottobre 2009/ 21 G

    cificato. Scegliete dove riporre il keystore (nelcaso in Fig.13, la directory C:\keystores) edate un nome a vostro piacimento a file(android_keystore, nel caso in immagine).Non c bisogno di usare unestensione parti-colare per il nome del file. invece buona pra-tica proteggere i propri keystore con una pas-sword, in modo che le nostre firme digitali

    non possano essere utilizzate nel caso in cuiqualcuno ci rubi il file. Pertanto abbiate curadi impostare una password sufficientementesicura.Visto che il keystore appena creato vuoto, ilpasso successivo del wizard ci fa creare unachiave, cio una firma digitale. Dobbiamoinserire il nome della chiave (detto alias), lapassword per lutilizzo della chiave, una vali-dit in anni (di solito si usa il valore 25) e i datianagrafici di base del firmatario (nome ecognome).Superata la fase di creazione o selezione delkeystore e della chiave, il wizard fa sceglieredove salvare il pacchetto APK che sar genera-to. Scegliete la destinazione e concludeteloperazione. fatta: il pacchetto stato generato e firmato.Potete ora installarlo su un dispositivoAndroid reale, in plastica, metallo e silicio.

    COSA TRATTEREMO NEI PROSSIMI ARTICOLI DEL CORSONel prossimo numero della rivista andremo unpo pi al di dentro della faccenda, approfon-dendo i principi di programmazione di GoogleAndroid, conoscendo pi intimamente la strut-tura delle sue applicazioni e iniziando la rasse-gna delle API messe a disposizione dal sistemaoperativo. Per tutto larco di questo corso si cer-cher sempre di rimanere con i piedi per terra,affrontando i differenti argomenti in manierasistematica e concludendo sempre le lezionicon un esempio pratico e funzionale, in mododa fornire ai lettori unimmediata implemen-tazione dei concetti appresi.

    Carlo Pelliccia

    Fig. 14: La selezione del file su cui sar salvato il pacchetto APK

    Fig. 11: La prima schermata di generazione di un pacchetto APK firmato a partire dal progettoCiaoMondoAndroide

    Fig. 12: La creazione di un nuovo keystore

    Fig. 13: La maschera per la creazione di un nuova firmadigitale

    014-021:088-093-corsi-xsl 31-08-2009 18:01 Pagina 21

  • Android programming 12

    Android programming La gestione delle risorse nei programmi Android

    LE RISORSE ESTERNEIN GOOGLE ANDROID IN QUESTO SECONDO ARTICOLO IMPAREREMO A MANIPOLARE LE RISORSE ESTERNE.SCOPRIREMO CHE ANDROID RENDE FACILE LUTILIZZO DI TUTTO QUELLO CHE, PUR NONESSENDO CODICE, INDISPENSABILE AL CORRETTO FUNZIONAMENTO DI UNAPPLICAZIONE

    Se c un aspetto di Android dal quale sievince la modernit di questo sistema, lasua maniera di gestire le risorse e i dati.Nelle piattaforme di sviluppo meno moderne,spesso e volentieri, le risorse esterne come i datidi configurazione, i messaggi di interfaccia, leimmagini o altro materiale simile, sono trattatesenza alcun riguardo speciale. Android, invece,richiede che i progetti siano organizzati in unacerta maniera. La corretta gestione delle risorsein questa piattaforma, importante tanto quan-to la stesura del codice. In un certo senso, conAndroid non si pu imparare a programmare seprima non si apprende come organizzare erichiamare le risorse. Perci, dedichiamo allar-gomento questo secondo articolo del corso.

    LA STRUTTURA DEI PROGETTI ANDROIDAvviamo Eclipse e torniamo sul progetto CiaoMondoAndroide, realizzato il mese scorso perdimostrare le funzionalit di base del kit di svilup-po per Android. Quando abbiamo creato il proget-to, Eclipse ha predisposto per noi un albero di car-telle, allinterno del quale sono stati generati auto-maticamente diversi file. Guardate la Fig.1, chemostra la situazione del file system allatto di crea-zione del progetto.Tra i file generati automaticamente c Android -Manifest.xml, cio il descrittore dellapplicazione,che gi abbiamo iniziato a conoscere. Torneremoad approfondirlo mano a mano che gli argomentitrattati ce ne daranno occasione. Oltre al descritto-re c il file default.properties, poco rilevante pernoi, poich serve esclusivamente al sistema dibuild automatico. Ci sono poi delle directory: src,assets, res e gen. La prima, src, quella dove dob-biamo andare a realizzare i package e le classi dellanostra applicazione. Le cartelle res e assets servonoper ospitare le risorse esterne necessarie allappli-cazione, come le immagini, i file audio e altro anco-ra. La cartella res, in particolar modo, gode di una

    speciale struttura predefinita, formata dalle tresotto-directory drawable, layout e values. La prima,drawable, serve per le immagini utilizzate dalsoftware, mentre layout e values ospitano dei spe-ciali file XML utili per definire in maniera dichiara-tiva laspetto dellapplicazione e i valori utilizzati alsuo interno. Oltre a src, assets e res c infine la car-tella gen, che contiene la speciale classe chiamataR, probabile abbreviazione di Resources. Invocandoquesta classe, infatti, possibile richiamare viacodice le risorse memorizzate sotto la directory res.Impareremo oggi stesso come farlo. Sappiatecomunque che la classe R viene generata automa-ticamente dal sistema e non deve mai essere modi-ficata a mano.

    GESTIONE DEI VALORIIl primo tipo di risorse che impareremo a mani-polare sono i valori. Si tratta di coppie chiave-

    MOBILE La gestione delle risorse nei programmi Android

    ht tp ://www. ioprogrammo. i t

    G 58 / Novembre 2009

    CD WEBAndroid144.zip

    cdrom.ioprogrammo.it

    Fig. 1: La struttura, in Eclipse, di un progetto Androidappena creato

    Conoscenze richiesteJava

    SoftwareJava SDK (JDK) 5+,Eclipse 3.3+

    Impegno

    Tempo di realizzazione

    REQUISITI

    058-061:088-093-corsi-xsl 30-09-2009 12:58 Pagina 58

  • 13 Android programming

    Android programmingLa gestione delle risorse nei programmi Android

    ht tp ://www. ioprogrammo. i t Novembre 2009 / 59 G

    La gestione delle risorse nei programmi Android MOBILE

    valore dichiarate allinterno dei file XML chesono al percorso di progetto res/values. Eclipse,per default, crea a questo percorso il filestrings.xml, pensato per raccogliere le stringheusate dallapplicazione che sar sviluppata. Ad ogni modo potete rinominare il file o aggiun-gerne quanti altri ne volete, al fine di categoriz-zare al meglio i valori necessari alla vostra appli-cazione. Limportante che tutti i file presentinella cartella values seguano il seguente modello:

    Allinterno del tag possibile dichiarare differenti tipi di valori.Supponiamo di voler dichiarare un valore di tipostringa chiamato nome e con contenuto Carlo:

    Carlo

    Ci sono numerosi tipi di dati supportati. Ecco unelenco completo:

    Stringhe, con il tag . Colori, con il tag e con valori espressiin forma esadecimale secondo i modelli#RRGGBB o #AARRGGBB (AA sta per il canalealpha, che regola la trasparenza del colore). Adesempio: #FF0000

    Misure e dimensioni, con il tag e convalori numerici decimali accompagnati da unu-nit di misura che pu essere px (pixel), in (pol-lici), mm (millimetri), pt (punti a risoluzione72dpi), dp (pixel indipendenti dalla densit) e sp(pixel indipendenti dalla scala). Ad esempio:180px

    Rettangoli di colore, con il tag . I valori possibili sono colori esadecimali comenel caso del tag . Ad esempio:#00FF00

    Array di interi, con il tag . Gli elementi dellarray vanno espressi con pioccorrenze del tag annidato . Ad esempio:

    2357

    Array di stringhe, con il tag .Anche in questo caso si usa il tag . Ad esempio:

    CarloClaudiaNami

    Stili e temi, con il tag . Servono percreare degli stili di disegno ed impaginazione,un po come fanno i fogli di stile CSS nel caso diHTML. Dentro il tag vanno inseriti deitag con le singole voci che compongo-no lo stile. Gli stili possono essere applicati alleinterfacce grafiche. Di certo ne riparleremo piavanti. Eccovi comunque un esempio:

    18sp

    #000088

    Usando Eclipse, comunque, non c bisogno diimparare lelenco a memoria: qualsiasi file XMLposto sotto la directory res/values viene automati-camente lavorato con un apposito editor.

    RICHIAMARE LE RISORSE DA XMLCome scritto in apertura, la modernit diAndroid pu essere evinta proprio dalla suamaniera di gestire le risorse. Le piattaforme diuna volta non concedevano sistemi agevolati,finendo cos per favorire laccoppiamento fracodice e dati. Tuttora non raro vedere dei sor-genti in Java, in C o in qualsiasi altro linguaggio,con valori e messaggi digitati direttamente den-tro il codice. Questa pratica non corretta ed sconsigliata da ogni manuale: sempre meglioseparare i dati dal codice, perch in questamaniera il software pi facile sia da realizzaresia da mantenere. Android intende favorire lapratica del disaccoppiamento fra dati e codice, elo fa attraverso gli strumenti che stiamo pren-dendo in considerazione oggi. I valori dichiaratinei file XML sotto values, cos come tutte le altrerisorse della cartella res e delle sue annidate, sonotrattati dal sistema in maniera speciale. Il kit di sviluppo, infatti, fornisce delle agevola-

    NOTA

    DIFFERENZA TRARES E ASSETSLa differenza tra le cartelleres e assets pocoevidente, eppure c. La directory res pensataper gestire le risorse inmaniera struttura, ed infatti suddivisa in sottocartelle.Tutte le risorse posizionatein res vengono prese inesame dal sistema di builde riferite nella specialeclasse R. Quelle dentro res,dunque, sono delle risorsegestite. Sotto assets,invece, possibiledepositare qualsiasi file sidesideri senza che ilsistema di build eseguaunanalisi preventiva e creiil riferimento in R. Le risorse esterneconservate nella directoryassets possono esserecaricate servendosi dellaclasse android.content.res.AssetManager. Nellamaggior parte dei casi,comunque, non c bisognodi ricorrere alla cartellaassets, poich res offre unamaniera semplificata ecompleta per laccesso allerisorse.

    Fig. 2: Leditor di Eclipse gestisce i file XML

    058-061:088-093-corsi-xsl 30-09-2009 12:58 Pagina 59

  • Android programming 14

    Android programming La gestione delle risorse nei programmi AndroidMOBILE La gestione delle risorse nei programmi Android

    ht tp ://www. ioprogrammo. i tG 60 / Novembre 2009

    zioni per richiamare le risorse dalle varie partidel software. Sostanzialmente unapplicazioneAndroid costituita da file dichiarativi XML e daclassi Java. Sia in un caso sia nellaltro, ci sonoscorciatoie per richiamare le risorse incluse inres. Cominciamo dal caso XML e prendiamo ariferimento il pi importante dei file di questotipo: AndroidManifest.xml. Quando, al suo inter-no, si dichiarano i dettagli dellapplicazione, possibile scrivere qualcosa come:

    ...

    Il nome dellapplicazione, cio LaMiaAp -plicazione, stato in questo caso digitato diretta-mente dentro il codice XML. Con Android questo corretto, tuttavia si pu fare di meglio. Si puincludere il titolo dellapplicazione nel fileres/values/strings.xml, alla seguente maniera:

    LaMiaApplicazione

    A questo punto il descrittore dellapplicazionepu essere riscritto come segue:

    Anzich scrivere LaMiaApplicazione, si usatoil riferimento @string/app_name. Questa scorcia-toia, come intuibile, viene sostituita dalla risorsadi tipo stringa con nome app_name, che nel filestrings.xml abbiamo dichiarato essere proprioLaMiaApplicazione.La regola generale per richiamare una risorsa inun file XML, quindi, basata sul modello:@tipo/nome. I tipi validi sono: @array, per gli array.

    @color, per i colori. @dimen, per le dimensioni. @drawable, per i valori drawable, ma ancheper le immagini messe in res/drawable.

    @layout, per richiamare i layout presenti nellacartella res/layout.

    @raw, per i file nella cartella res/raw (cfr. boxlaterale).

    @string, per le stringhe. @style, per gli stili.

    Con @drawable, in particolar modo, possibileriferire sia i valori dichiarati con i tag in res/values, sia le immagini conservate nella car-tella res/drawable. Ad esempio, se in res/drawableviene messa unicona chiamata icon.png, sarpossibile richiamarla con la formula @draw-able/icon. Ad esempio lo si pu fare in AndroidManifest.xml, per associare licona allapplicazio-ne:

    ...

    RICHIAMARE LE RISORSE DA JAVAValori e risorse possono essere richiamati dacodice Java servendosi della classe android.con-tent.res.Resources. Stando allinterno di una atti-vit, cio di una classe che estende android.app.Activity, sufficiente richiamare il metodogetResources() per ottenere il punto daccesso allerisorse dellapplicazione: Resources res =getResources(); Una volta ottenuto loggetto, possibile invocare su di esso la seguente serie dimetodi:

    public int getColor(int id)Restituisce il colore avente lidentificativo dirisorsa specificato.

    public float getDimension(int id)Restituisce la dimensione avente lidentificati-vo di risorsa specificato.

    public Drawable getDrawable(int id)Restituisce loggetto disegnabile avente liden-tificativo di risorsa specificato.

    ANIM, RAWE XML

    Oltre a drawable, layout evalues, che Eclipse

    introduce automaticamentein ogni nuovo progetto, lacartella res pu ospitareanche le sotto-directory

    anim, raw e xml. In anim siinseriscono le animazioni,

    che possono essereprogrammate in maniera

    dichiarativa con unospeciale formato XML; sotto

    raw possibile inserirequalsiasi tipo file, adesempio un audio dariprodurre allinterno

    dellapplicazione; in xml unqualsiasi file XML, che

    Android provvederautomaticamente a

    decodificare. Ne riparleremonei prossimi mesi.

    NOTA

    DISTINGUERE I FILECON I VALORI

    Bench, teoricamente, siapossibile mettere in

    res/values un solo file XMLcon ogni tipo di valore

    possibile, le linee guidadello sviluppo Android

    consigliano di distinguere ifile per topic, cio per

    argomento. Solitamente siconsiglia di raccogliere le

    stringhe in un filestrings.xml, i colori (e i

    drawable) in colors.xml, ledimensioni in dimens.xml e

    gli stili in styles.xml.

    NOTA

    058-061:088-093-corsi-xsl 30-09-2009 12:58 Pagina 60

  • 15 Android programming

    Android programmingLa gestione delle risorse nei programmi Android

    ht tp ://www. ioprogrammo. i t Novembre 2009 / 61G

    La gestione delle risorse nei programmi Android MOBILE

    public int[] getIntArray(int id)Restituisce larray di interi avente lidentificati-vo di risorsa specificato.

    public String getString(int id)Restituisce la stringa avente lidentificativo dirisorsa specificato.

    public String[] getStringArray(int id)Restituisce larray di stringhe avente lidentifi-cativo di risorsa specificato.

    Tutti questi metodi agganciano la risorsa desidera-ta attraverso un identificativo numerico (int id). Macome fare a conoscere gli ID associati alle risorse eai valori inseriti nella cartella res? Semplice: attra-verso la speciale classe autogenerata R! Al suointerno sono contenute delle sottoclassi statiche,una per ciascuna tipologia di risorsa presente nelprogetto: R.string, R.drawable, R.color e cos via. Inciascuno di questi gruppi vengono introdotti gli IDnumerici che corrispondono alle risorse e ai valoriconservati in res e nelle sue sotto-cartelle.Proviamo con un esempio pratico: facciamo il casoche nel file res/values/strings.xml sia stata dichiara-ta la stringa app_name. Per richiamarla da codiceJava, stando allinterno di una attivit, si deve farealla seguente maniera:

    Resources res = getResources();

    String appName = res.getString(R.string.app_name);

    CIAO MONDO RELOADEDMettiamo a frutto le nozioni acquisite questoggi,assemblando per la seconda volta un esempiodel tipo Ciao, Mondo!. Questa volta, per, use-remo la pi corretta pratica delle risorse esterneper il nome dellapplicazione e per il messaggiopresentato sullo schermo. Create il progettoAndroid in Eclipse e chiamatelo TestResources. Il package di riferimento it.ioprogrammo.testre-sources, mentre lattivit principale deve essereTestResourcesActivity. Non appena il progetto pronto, andiamo ad editare il file res/values/strings.xml:

    TestResources

    Ciao, Mondo Androide!

    Sono state dichiarate due stringhe: app_namecon valore TestResources e message con valoreCiao, Mondo Androide!.Andiamo ora su AndroidManifest.xml:

    Il nome dellapplicazione, citato ben due volteallinterno del file, stato richiamato mediante ilriferimento @string/app_name. Allo stesso modo,licona per lapplicazione, creata automatica-mente da Eclipse al percorso res/drawable/icon.png, stata riferita attraverso la dicitura @draw-able/icon. Adesso tocca alla classe TestResourcesActivity, il cui codice riportato di seguito:

    package it.ioprogrammo.testresources;

    import android.app.Activity;

    import android.content.res.Resources;

    import android.os.Bundle;

    import android.widget.TextView;

    public class TestResourcesActivity extends Activity {

    @Override

    public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    Resources res = getResources();

    String message = res.getString(R.string.message);

    TextView tv = new TextView(this);

    tv.setText(message);

    setContentView(tv);

    }

    }

    Il messaggio Ciao, Mondo Androide!, questavolta, stato caricato attraverso la classeResources ed il riferimento R.string.message.

    PROSSIMAMENTENel prossimo appuntamento approfondiremo iprincipi di programmazione delle attivit, unodei mattoni fondamentali delle applicazioniAndroid.

    Carlo Pelliccia

    NOTA

    INTERNAZIONALIZ -ZAZIONESe si punta ad un mercatointernazionale, bene chele applicazioni realizzatesiano tradotte in pi lingue.Android aiuta glisviluppatori consentendolinternazionalizzazionedelle risorse. Supponiamodi voler realizzareunapplicazione sia ininglese sia in italiano.Prepariamo due differentifile strings.xml con tutti imessaggi di interfaccia,uno in inglese e laltro initaliano. Adesso, invecedella cartella values,creiamo le due cartellevalues-it (per litaliano) evalues-en (per linglese) edinseriamo al loro interno idue file. fatta! I dispositiviAndroid che eseguirannolapplicazione sceglierannoautomaticamente quale filecaricare, in base alla lorolingua predefinita.

    LAUTORE

    Carlo Pelliccia lavorapresso 4IT (www.4it.it),dove si occupa di analisi esviluppo software perpiattaforme Java. Nella suacarriera di technical writerha pubblicato cinquemanuali ed oltrecentocinquanta articoli,molti dei quali proprio tra lepagine di ioProgrammo. Ilsuo sito, che ospita anchediversi progetti Java OpenSource, disponibileallindirizzowww.sauronsoftware.it

    058-061:088-093-corsi-xsl 30-09-2009 12:58 Pagina 61

  • Android programming 16

    Android programming Scopriamo cosa sono e come si programmano le Attivit

    COME IL SISTEMAGESTISCE LE ATTIVIT TERZO APPUNTAMENTO. LE ATTIVIT SONO IL COMPONENTE SOFTWARE PI UTILIZZATODAI PROGRAMMATORI ANDROID. IN QUESTO ARTICOLO IMPAREREMO COS UNATTIVIT,COME VIENE GESTITA DAL SISTEMA E COME POSSIAMO REALIZZARNE DI NOSTRE

    Le applicazioni Android, come si accennatodurante la prima lezione di questo corso, sicompongono di quattro mattoni fondamen-tali: le attivit (activity), i servizi (service), i broadca-st receiver e i content provider. Ogni applicazione formata da uno o pi di questi mattoni. Non dettoche li contenga tutti: ad esempio potrebbe esserecostituita da due attivit e da un servizio, senzaavere broadcast receiver n content provider. Nellastragrande maggioranza dei casi, comunque, leapplicazioni comprendono almeno unattivit. Leattivit, di conseguenza, sono il pi fondamentaledei componenti di base delle applicazioni Android.

    COS UNATTIVITStando alla documentazione ufficiale, unattivit una singola e precisa cosa che lutente pu fare. Proviamo a indagare le implicazioni di questa affer-mazione. Partiamo dal fatto che lutente, per farequalcosa, deve interagire con il dispositivo. Domandiamoci come avvenga, nel caso di unosmartphone, linterazione tra luomo e la macchi-na. Un ruolo essenziale, naturalmente, svolto daimeccanismi di input, come la tastiera e il touch-screen, che permettono allutente di specificare ilproprio volere. Le periferiche di input, tuttavia, dasole non bastano. Affinch lutente sappia cosa pufare e come debba farlo, ma anche affinch ilsoftware possa mostrare allutente il risultato ela-borato, necessario un canale aggiuntivo. Nellamaggior parte dei casi questo canale il display. Nella superficie dello schermo il software disegnatutti quegli oggetti con cui lutente pu interagire(bottoni, menu, campi di testo), e sempre sulloschermo viene presentato il risultato dellelabora-zione richiesta. Il ragionamento ci porta alla con-clusione che, per fare qualcosa con il dispositivo, necessario usare lo schermo. Esiste perci unparallelo tra il concetto di attivit, in Android, equello di finestra, in un sistema desktop, benchnon siano esattamente la stessa cosa. In generale,ad ogni modo, possiamo assumere con tranquillit

    che le attivit sono quei componenti di unapplica-zione Android che fanno uso del display e che inte-ragiscono con lutente.Dal punto di vista del programmatore, poi, possia-mo spingerci oltre e semplificare ulteriormente. In maniera pi pragmatica, unattivit una classeche estende android.app.Activity. Lautore del codi-ce, realizzando lattivit, si serve dei metodi eredi-tati da Activity per controllare cosa appare neldisplay, per assorbire gli input dellutente, perintercettare i cambi di stato e per interagire con ilsistema sottostante.

    CICLO DI VITA DI UNATTIVITIn un sistema desktop il monitor sufficientemen-te spazioso da poter mostrare pi finestre simulta-neamente. Perci non affatto raro lavorare conpi programmi contemporaneamente attivi, le cuifinestre vengono affiancate o sovrapposte. Glismartphone, invece, funzionano diversamente.Prima di tutto il display piccolo, e pertanto hapoco senso affiancare due o pi finestre di applica-zioni differenti. Poi non bisogna dimenticare che lerisorse di calcolo sono modeste, e perci non buona cosa tenere simultaneamente in vita troppiprogrammi. Per questi motivi le attivit di Androidhanno carattere di esclusivit. possibile mandarein esecuzione pi attivit simultaneamente, masoltanto unattivit alla volta pu occupare ildisplay. Lattivit che occupa il display in esecu-zione e interagisce direttamente con lutente. Le altre, invece, sono ibernate e tenute nascoste insottofondo, in modo da ridurre al minimo il consu-mo delle risorse di calcolo. Lutente, naturalmente,pu ripristinare unattivit ibernata e riprenderlada dove laveva interrotta, riportandola in primopiano. Lattivit dalla quale si sta allontanando,invece, sar ibernata e mandata in sottofondo alposto di quella ripristinata. Il cambio di attivit puanche avvenire a causa di un evento esterno. Il casopi ricorrente quello della telefonata in arrivo: se

    MOBILE Scopriamo cosa sono e come si programmano le Attivit

    ht tp ://www. ioprogrammo. i t

    G 54 / Dicembre 2009

    CD WEBcorso_android_pt3.zip

    cdrom.ioprogrammo.it

    Conoscenze richiesteJava

    SoftwareJava SDK (JDK) 5+,Eclipse 3.3+

    Impegno

    Tempo di realizzazione

    REQUISITI

    054-058:088-093-corsi-xsl 29-10-2009 17:40 Pagina 54

  • 17 Android programming

    Android programmingScopriamo cosa sono e come si programmano le Attivit

    ht tp ://www. ioprogrammo. i t Dicembre 2009 / 55 G

    Scopriamo cosa sono e come si programmano le Attivit MOBILE

    il telefono squilla mentre si sta usando la calcolatri-ce, questultima sar automaticamente ibernata emandata in sottofondo. Lutente, conclusa la chia-mata, potr richiamare lattivit interrotta e ripor-tarla in vita, riprendendo i calcoli esattamente dadove li aveva interrotti.Visto che le attivit ibernate, in termini di risorse dicalcolo, non consumano nulla, in Android il con-cetto di chiusura delle attivit secondario e tenu-to nascosto allutente. Ci, di solito, spiazza chi alsuo primo confronto con la programmazione deidispositivi portatili. Le attivit di Android nondispongono di un bottone x, o di un tasto equiva-lente, con il quale possibile terminarle. Lutente,di conseguenza, non pu chiudere unattivit, mapu solo mandarla in sottofondo. Questo, comun-que, non significa che le attivit non muoiano mai,anzi! Per prima cosa le attivit possono morirespontaneamente, perch hanno terminato i lorocompiti. Insomma, anche se il sistema non ci forni-sce automaticamente un bottone chiudi, possia-mo sempre includerlo noi nelle nostre applicazio-ni. In alternativa, la distruzione delle attivit com-pletamente demandata al sistema. I casi in cuiunattivit pu terminare sono due:

    Lattivit ibernata e il sistema, arbitrariamente,decide che non pi utile e perci la distrugge.

    Il sistema a corto di memoria, e per recuperarespazio inizia a uccidere bruscamente le attivitin sottofondo.

    Esistono poi dei task manager di terze parti che

    permettono di killare le attivit in sottofondo, manon sono previsti nel sistema di base.I differenti passaggi di stato di unattivit attraver-sano alcuni metodi della classe Activity che, comeprogrammatori, possiamo ridefinire per intercetta-re gli eventi di nostro interesse.La Fig.1 illustra la sequenza di chiamate ai metodidi Activity eseguite durante i passaggi di stato del-lattivit. Entriamo nel dettaglio:

    protected void onCreate(android.os.BundlesavedInstanceState)Richiamato non appena lattivit viene creata.Largomento savedInstanceState serve per ripor-tare un eventuale stato dellattivit salvato in pre-cedenza da unaltra istanza che stata terminata.Largomento null nel caso in cui lattivit nonabbia uno stato salvato.

    protected void onRestart()Richiamato per segnalare che lattivit sta venen-do riavviata dopo essere stata precedentementearrestata.

    protected void onStart()Richiamato per segnalare che lattivit sta perdiventare visibile sullo schermo.

    protected void onResume()Richiamato per segnalare che lattivit sta periniziare linterazione con lutente.

    protected void onPause()Richiamato per segnalare che lattivit non stapi interagendo con lutente.

    protected void onStop()Richiamato per segnalare che lattivit non pivisibile sullo schermo.

    protected void onDestroy()Richiamato per segnalare che lapplicazione staper essere terminata.

    La prassi richiede che, come prima riga di codice diciascuno di questi metodi, si richiami limplemen-tazione di base del metodo che si sta ridefinendo.Ad esempio:

    protected void onStart() { super.onStart(); // ...}

    importante non dimenticare questa regola: leattivit sviluppate potrebbero non funzionare!

    DESCRIVERE UNATTIVITDopo che si creata unattivit, la si deve registrareallinterno del descrittore dellapplicazione (il fileAndroidManifest.xml), questo affinch il sistemasappia della sua esistenza. Per farlo si usa un tag allinterno del tag :

    NOTA

    ANDROID SDK 1.6 stata da poco rilasciata laversione 1.6 del kit disviluppo per Android. Moltesono le novit incluse nellanuova versione: oltre aiconsueti bugfix e allemigliorie generali, ilsistema comprende oradelle nuove API per ilsupporto delle gesture e del text-to-speech. Se siete fermi alla versione1.5, potete aggiornarvipartendo dallindirizzo:http://developer.android.com/sdk/Oltre allSDK, bisognaaggiornare anche lADT (ilplug-in per Eclipse). Farlo molto semplice:aprite Eclipse e selezionatela voce di menu Help Check for Updates,controllate gliaggiornamenti disponibili eselezionate quelli relativi aicomponenti Android. Dopoaver scaricato e installatogli aggiornamenti, aprite lamaschera della preferenze(voce di menu Window Preferences) e alla schedaAndroid provvedete adaggiornare il percorsodellSDK, in modo dapuntare alla versione 1.6.Con la voce di menuWindow Android SDKand AVD Manager, createpoi un AVD (Android VirtualDevice) compatibile con lanuova versione delsistema.

    Fig. 1: Ciclo di vita di unattivit. Sono illustrate le chia-mate ai metodi che possibile ridefinire per intercettarei passaggi di stato

    054-058:088-093-corsi-xsl 2-11-2009 16:12 Pagina 55

  • Android programming 18

    Android programming Scopriamo cosa sono e come si programmano le AttivitMOBILE Scopriamo cosa sono e come si programmano le Attivit

    ht tp ://www. ioprogrammo. i tG 56 / Dicembre 2009

    . . .

    . . .

    Con lattributo android:name si specifica il nomedella classe registrata come attivit. Si pu espri-mere sia il suo percorso completo (ad esempiomypackage.mysubpackage.MyActivity) sia il nomerelativo rispetto al package dichiarato nel tag sovrastante (ad esempio .MyActivity).Altri attributi possono opzionalmente essere inse-riti nel tag , allo scopo di meglio detta-gliare lattivit che si sta registrando. Tra le tantecose che si possono fare, una delle pi importanti quella di attribuire una label, cio unetichetta,allattivit. Si tratta, sostanzialmente, di un titoloche il sistema user per riferirsi allattivit e perpresentarla allutente. Lattributo da utilizzare android:label. Come si spiegato nel numero pre-cedente, in casi come questo possibile sia scrive-re la stringa direttamente nellXML sia fare riferi-mento ad una stringa memorizzata in un filestrings.xml sotto la directory res/values. Nel primocaso, quindi, si user una formula del tipo:

    Nel secondo caso, invece, si far alla seguentemaniera:

    Un altro attributo spesso usato con il tag android:icon, che permette di specificare unico-na per lattivit. In questo caso si usa sempre il rife-rimento ad una immagine presente nella cartellares/drawable, qualcosa come:

    Se non si specifica alcuna icona, lattivit ereditaautomaticamente licona definita nel sovrastantetag . Allinterno della coppia di tag , invece, possono essereallacciate delle relazioni particolari fra lattivit elapplicazione e fra lattivit ed il sistema. In parti-colar modo, possibile collegare allattivit unintent-filter:

    . . .

    Nel dizionario di Android, un intent la descrizio-ne di unoperazione che deve essere eseguita.

    Pi semplicemente, gli intent sono dei messaggiche il sistema manda a unapplicazione quando siaspetta che questa faccia qualcosa. Di come fun-zionano gli intent e di cosa si compongono torne-remo certamente a parlare in futuro. Per ora cibasta sapere che le attivit, attraverso un intent-fil-ter, possono essere attivate in risposta ad uno spe-cifico evento. Gli intent-filter accettano figli di tretipi:

    Individua gli intent che richiedono lazione spe-cificata.

    Individua gli intent che appartengono alla cate-goria specificata.

    Individua gli intent che portano dati del tipo spe-cificato.

    Le azioni, le categorie ed i tipi di dato che possonoessere usati sono, naturalmente, moltissimi. Pian piano impareremo a conoscerli. Per ora ciinteressa sapere che unattivit dotata di un intent-filter che include lazione android.intent.action.MAIN e la categoria android.intent.catego-ry.LAUNCHER viene identificata come lattivitprincipale dellapplicazione. Ci significa che lap-plicazione sar elencata nel men di sistema e che,quando lutente lavvier, sar lanciata proprio lat-tivit marcata in tale maniera. Ecco perch, in tuttigli esempi dei mesi precedenti, abbiamo sempreusato una formulazione del tipo:

    Oltre allattivit principale, possiamo registrare inAndroidManifest.xml quante attivit vogliamo, dalanciare secondo necessit, come vedremo tra dueparagrafi.

    IL PROGETTOACTIVITYDEMOFermiamoci un attimo con la teoria e mettiamoinsieme in un esempio pratico i concetti appresifinora. Lo scopo dimostrare il ciclo di vita delleattivit, attraverso una activity che registri in un logtutti i suoi cambi di stato. Creiamo il progettoActivityDemo, con package di riferimento it.iopro-

    PROGRAMMAANDROID IN C++Una novit collegata al

    rilascio della versione 1.6dellAndroid SDK lapossibilit di scrivere

    applicazioni in C/C++,compilate poi in codice

    nativo. Nella maggior partedei casi, comunque, rimaneconveniente programmareAndroid in Java, poich la

    piattaforma stataconcepita per essere

    programmata in questamaniera. Esistono dei casi,tuttavia, in cui si deve agire

    a basso livello,scavalcando Java e laDalvik Virtual Machine.Adesso possibile farlo

    scaricando ed installandolAndroid NDK (NativeDevelopment Kit), unaddendum dellSDK

    disponibile al medesimoindirizzo di questultimo.

    NOTA

    054-058:088-093-corsi-xsl 29-10-2009 17:40 Pagina 56

  • 19 Android programming

    Android programmingScopriamo cosa sono e come si programmano le Attivit

    ht tp ://www. ioprogrammo. i t Dicembre 2009 / 57G

    Scopriamo cosa sono e come si programmano le Attivit MOBILE

    grammo.activitydemo, ed inseriamo al suo internola seguente omonima attivit:

    package it.ioprogrammo.activitydemo;

    import android.app.Activity; import android.os.Bundle;

    import android.util.Log;

    public class ActivityDemo extends Activity

    {

    @Override

    protected void onCreate(Bundle savedInstanceState)

    {

    super.onCreate(savedInstanceState);

    Log.i("ActivityDemo", "Richiamato

    onCreate() con bundle " + savedInstanceState);

    }

    @Override

    protected void onRestart()

    {

    super.onRestart();

    Log.i("ActivityDemo", "Richiamato onRestart()"); }

    @Override

    protected void onStart() {

    super.onStart();

    Log.i("ActivityDemo", "Richiamato onStart()"); }

    @Override

    protected void onResume() {

    super.onResume();

    Log.i("ActivityDemo", "Richiamato onResume()"); }

    @Override

    protected void onPause() {

    super.onPause();

    Log.i("ActivityDemo", "Richiamato onPause()"); }

    @Override

    protected void onStop() {

    super.onStop();

    Log.i("ActivityDemo", "Richiamato onStop()"); }

    @Override

    protected void onDestroy() {

    super.onDestroy();

    Log.i("ActivityDemo", "Richiamato onDestroy()");

    }

    }

    Questo codice, oltre a mostrarci la prassi correttada applicare quando si ridefiniscono i metodi cheintercettano i cambi di stato dellattivit, ci fa fareconoscenza con la classe android.util.Log. Come facile intuire, la classe contiene dei metodi staticiper scrivere nel log di sistema. Il metodo i(), usatonellesempio, salva delle righe di log di livello INFO.Altri metodi disponibili sono v() per il livello VER-BOSE, d() per il livello DEBUG, w() per il livelloWARN, ed e() per il livello ERROR. Registriamo lat-tivit nel manifesto dellapplicazione, marcandolacome attivit principale di lancio:

    Non dimentichiamo di includere un file res/val-ues/strings.xml con le risorse riferite nel manifesto:

    ActivityDemo LABEL

    Lapplicazione ora pronta per essere avviata.Avviate lemulatore e fate qualche prova.Mandate lattivit in secondo piano, magari azio-nando qualche altra applicazione fra quelledisponibili nel sistema. Quindi date unocchiataai log emessi, per verificare il ciclo di vita dellat-tivit. Usando Eclipse i log possono essere con-sultati nella prospettiva di lavoro chiamataDDMS, nella scheda LogCat.

    SOTTO-ATTIVITCome spiegato in apertura, unapplicazioneAndroid pu contenere pi di unattivit. In que-sto caso una soltanto sar marcata come attivitprincipale di lancio. Le altre saranno, invece,delle sotto-attivit, che lattivit principale potrlanciare quando ce n bisogno. Realizzare unasotto-attivit semplice tanto quanto realizzarelattivit principale: ancora una volta sufficien-te estendere android.app.Activity. Le attivit secondarie vanno poi registrate nel fileAndroidManifest.xml, senza per applicare lin-tent-filter con lazione e la categoria usate invecedallattivit principale. Lattivit principale pulanciare delle sotto-attivit ricorrendo al metodostartActivity(). Questo accetta come argomentoun oggetto di tipo android.content.Intenet che,come facile intuire, rappresenta un intent. Conquesto intento bisogna esprimere quale sotto-attivit deve essere avviata. Immaginiamo divoler lanciare la sotto-attivit rappresentata dalla

    NOTA

    ALTRI ATTRIBUTIDEL TAG

    Il tag , nelmanifest dellapplicazione,ammette una grandevariet di attributi, oltre aquelli citati nellarticolo.Ad esempio con android:excludeFromRecents si pufare in modo che lattivitnon venga presentatanellelenco delle attivitlanciate di recente, conandroid:screen Orientationsi pu forzare un certoorientamento delloschermo e conandroid:theme si pucambiare il tema graficousato dallattivit. Unelenco completo compreso nelladocumentazione ufficiale,allindirizzo:http://developer.android.com/guide/topics/manifest/activity-element.html

    054-058:088-093-corsi-xsl 29-10-2009 17:40 Pagina 57

  • Android programming 20

    Android programming Scopriamo cosa sono e come si programmano le AttivitMOBILE Scopriamo cosa sono e come si programmano le Attivit

    ht tp ://www. ioprogrammo. i tG 58 / Dicembre 2009

    classe MySubActivity. Tutto quello che dovremofare, dallinterno dellattivit principale, formu-lare unistruzione del tipo:startActivity(new Intent(this, MySubActivity.class));La sotto-attivit verr lanciata e prender loschermo al posto di quella principale.

    SUBACTIVITYDEMOMettiamo in pratica quanto descritto nel paragrafoprecedente. Il progetto si chiama SubActivityDemo,e il package di riferimento it.ioprogrammo.subac-tivitydemo. Allinterno di questo inseriremo dueattivit: MainActivity e SubActivity. La prima sarpoi registrata come attivit principale e conterr untasto per avviare la seconda. SubActivity conterr,invece, un tasto per chiuderla e passare allattivitprincipale:

    package it.ioprogrammo.subactivitydemo;

    import android.app.Activity;

    import android.content.Intent;

    import android.os.Bundle; import android.view.View;

    import android.widget.Button;

    public class MainActivity extends Activity {

    @Override

    public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    Button button = new Button(this);

    button.setText("Lancia SubActivity");

    button.setOnClickListener(new View.OnClickListener() {

    @Override

    public void onClick(View v) { startSubActivity(); }});

    setContentView(button); }

    private void startSubActivity() {

    Intent intent = new Intent(this, SubActivity.class);

    startActivity(intent);

    }}

    Quanto spiegato nel paragrafo precedente statomesso in pratica allinterno del metodo startSubActivity(). Studiamo il codice di SubActivity:

    package it.ioprogrammo.subactivitydemo;

    import android.app.Activity; import android.os.Bundle;

    import android.view.View;import android.widget.Button;

    public class SubActivity extends Activity

    {

    @Override

    protected void onCreate(Bundle savedInstanceState){

    super.onCreate(savedInstanceState);

    Button button = new Button(this);

    button.setText("Termina SubActivity");

    button.setOnClickListener(new View.OnClickListener()

    {

    @Override

    public void onClick(View v) {finish();}});

    setContentView(button); }

    }

    Dal codice apprendiamo una nozione nuova:unattivit, sia principale sia secondaria, pu termi-nare e chiudersi spontaneamente invocando il pro-prio metodo finish(). Registriamo adesso le dueattivit nel descrittore dellapplicazione:

    Per completare ecco il file res/values/strings.xml:

    ManyActivitiesDemo

    Main Activity

    Sub Activity

    Non resta che eseguire lesempio e provare il lancioe la chiusura della sotto-attivit.

    Carlo Pelliccia

    Fig. 2: Il log di ActivityDemo permette di osservare il ciclo di vita dellattivit

    LAUTORE

    Carlo Pelliccia lavorapresso 4IT (www.4it.it),

    dove si occupa di analisi esviluppo software per

    piattaforme Java. Nella suacarriera di technical writer

    ha pubblicato cinquemanuali ed oltre

    centocinquanta articoli,molti dei quali proprio tra lepagine di ioProgrammo. Ilsuo sito, che ospita anchediversi progetti Java Open

    Source, disponibileallindirizzo

    www.sauronsoftware.it

    054-058:088-093-corsi-xsl 29-10-2009 17:40 Pagina 58

  • 21 Android programming

    Android programmingProgrammazione delle interfacce utente con Android

    INTERFACCE: LAYOUTE COMPONENTI QUARTO APPUNTAMENTO. INIZIA LA TRATTAZIONE DEI CONCETTI E DEGLI STRUMENTI DIANDROID PER LA COSTRUZIONE E LA GESTIONE DELLE INTERFACCE UTENTE. SI COMINCIACON I WIDGET ED I LAYOUT DI BASE, INDISPENSABILI IN OGNI APPLICAZIONE

    Dopo aver scoperto cosa sono e come fun-zionano le attivit, studiamo ora come sicostruiscono e si gestiscono le interfacceutente in Android. Apprenderemo le praticheutili per costruire oggetti grafici in grado di inte-ragire con chi impugna il device. Si tratta di unpassaggio cruciale del nostro percorso diapprendimento: tutti i dispositivi mobili dinuova generazione puntano tantissimo sullinte-razione con lutente.

    ANDROID 2.0 ED IL NUOVO SDKCollegatevi allindirizzo di riferimento per il kit disviluppo di Android, cio:http://developer.android.com/sdk/

    Da qui scaricare il pi recente SDK disponibileper la vostra piattaforma (al momento in cuiquesto articolo viene scritto, la versione pirecente la r3). Estraete larchivio scaricato sulvostro disco rigido, al percorso che preferite. Conla riga di comando, adesso, posizionatevi sulladirectory tools del kit di sviluppo. Lanciate ilcomando:

    android

    Verr caricata una GUI che vi permette di gestirei device virtuali ed i componenti aggiuntivi. Ilnuovo SDK, appena scaricato e installato, prati-camente vuoto. Contiene solo gli strumenti disviluppo, e al suo interno non c traccia di alcu-na versione del sistema. La prima cosa da fare,quindi, selezionare la voce Available Packages,che permette di visionare ed installare i compo-nenti aggiuntivi, tra i quali ci sono anche le diffe-renti versioni della piattaforma. Una volta sele-zionata la voce, espandete lelenco dei compo-nenti disponibili per lunica fonte inizialmenteregistrata. Selezionate le piattaforme con le qualiintendete sviluppare (sicuramente la nuova 2.0)ed i componenti aggiuntivi che giudicate utili

    (come la documentazione). Se volete, poteteanche selezionare tutto, in modo da disporre dipi versioni del sistema per sviluppare e testarele vostre applicazioni. Azionando il tasto InstallSelected vi verr chiesto di accettare le licenzedei componenti selezionati. Usate lopzioneAccept All e proseguite poi con il tasto InstallAccepted. Il tool proceder al download e allin-stallazione dei componenti richiesti.Naturalmente potrete ripetere questa operazio-ne in futuro, per controllare il rilascio di nuoveversioni del sistema e per configurarle nel vostroSDK. Dopo aver concluso il download e linstalla-zione, non dimenticatevi di creare uno o pidevice virtuali (AVD) per i vostri sviluppi (voceVirtual Devices nel tool) compatibili conAndroid 2.0 e con le altre versioni che avete sca-ricato. Se sviluppate con Eclipse, come suggeritoin questo corso, dovrete anche aggiornare lADTe collegarlo alla nuova installazione dellSDK.

    VIEW E VIEWGROUPAndiamo allargomento del giorno, cio alleinterfacce grafiche e ai componenti che le attivitpossono usare per interagire con lutente. I primidue concetti che dobbiamo assorbire si chiama-no View e ViewGroup, e corrispondono allamaniera di Android di classificare ed organizzareci che sullo schermo. I bottoni, i campi ditesto, le icone e tutti gli altri congegni di uninter-faccia grafica sono oggetti View. I ViewGroup,invece, sono dei contenitori che possono mette-re insieme pi oggetti View. I ViewGroup, inoltre,sono a loro volta degli oggetti View, e di conse-guenza un possono contenere altri ViewGroup.Grazie a questa intuizione possibile organizza-re i componenti sullo schermo secondo unoschema ad albero, come quello di Fig.2.I componenti View estendono tutti la classe baseandroid.view.View. Nella libreria standard diAndroid ci sono gi molti componenti di questotipo, soprattutto nel pacchetto android.widget.

    MOBILE Programmazione delle interfacce utente con Android

    ht tp ://www. ioprogrammo. i t

    G 50 / Gennaio 2010

    CD WEBcorso_android_pt3.zip

    cdrom.ioprogrammo.it

    Conoscenze richiesteJava

    SoftwareJava SDK (JDK) 5+,Eclipse 3.3+

    Impegno

    Tempo di realizzazione

    REQUISITI

    050-054:088-093-corsi-xsl 1-12-2009 12:48 Pagina 50

  • Android programming 22

    Android programming Programmazione delle interfacce utente con Android

    ht tp ://www. ioprogrammo. i t Gennaio 2010/ 51 G

    Programmazione delle interfacce utente con Android MOBILE

    Oltre ai widget di base, ad ogni modo, semprepossibile estendere la classe View e realizzare ipropri componenti custom. Il pi delle volte nonc bisogno di farlo, poich quelli forniti daAndroid bastano per tutte le principali necessit. comunque importante che sia data questa pos-sibilit. La classe android.view.ViewGroup unaspeciale estensione di View. Come accennato inprecedenza, e come rappresentato in figura, unViewGroup una speciale View che pu contene-

    re altre View. Per questo motivo gli oggettiViewGroup dispongono di diverse implementa-zioni del metodo addView(), che permette pro-prio di aggiungere una nuova View al gruppo:

    public void addView(View child)Aggiunge un oggetto View al gruppo.

    public void addView(View child, int index)Aggiunge un oggetto View al gruppo, specifi-candone la posizione attraverso un indice(index).

    public void addView(View child, int width,int height) Aggiunge un oggetto View al grup-po, specificandone larghezza (width) ed altezza(height).

    public void addView(View child, ViewGroup.LayoutParams params)Aggiunge un oggetto View al gruppo, applican-do una serie di parametri di visualizzazione edorganizzazione del componente (params).

    public void addView(View child, int index,ViewGroup.LayoutParams params)Aggiunge un oggetto View al gruppo, specificandola posizione attraverso un indice (index) ed appli-cando una serie di parametri di visualizzazione edorganizzazione del componente (params).

    ViewGroup una classe astratta. Pertanto nonpu essere istanziata direttamente. Come nelcaso di View, possibile realizzare il proprioViewGroup custom, ma il pi delle volte convienescegliere fra le tante implementazioni messe adisposizione dalla libreria Android. Questeimplementazioni differiscono nella maniera dipresentare i componenti che sono al loro inter-no: alcuni li mettono uno dopo laltro, altri liorganizzano in una griglia, altri ancora possonoessere usati per avere una gestione a schede delloschermo, e cos via. Ovviamente conosceremopresto tutte le principali implementazioni diViewGroup.Una volta che, combinando oggetti View eViewGroup, si ottenuta linterfaccia utente chesi desidera, necessario che questa vengamostrata sullo schermo. Come abbiamo scoper-to mediante alcuni esempi preliminari, le attivit(cio gli oggetti android.app.Activity) mettono adisposizione un metodo setContentView(), dispo-nibile nelle seguenti forme:

    public void setContentView(View view)Mostra sullo schermo loggetto View specifica-to.

    public void setContentView(View view,ViewGroup.LayoutParams params)Mostra sullo schermo loggetto View specifica-to, applicando una serie di parametri di visua-lizzazione ed organizzazione del componente(params).

    WIDGETCon il termine widget (congegno) si indicano queicomponenti di base per linterazione con luten-te, come i bottoni, le check box, le liste, i campi ditesto e cos via. I widget predefiniti di Androidestendono tutti (direttamente o indirettamente)la classe View, e sono conservati nel packageandroid.widget. Esaminiamone alcuni in unaveloce panoramica:

    NOTA

    PROBLEMI SSLSe, nel tentativo discaricare gli aggiornamentiautomatici dellSDK, vidoveste imbattere in unerrore SSL, poteterisolverlo alla seguentemaniera: nellelenco disinistra scegliete la voceSettings, attivate lacheckbox Force https://...sources to be fetchedusing http://,confermate con il tastoSave & Apply. Adessotornate sulla schedaAvailable Packages etentate di nuovo ildownload degliaggiornamenti.

    Fig. 1: Dopo il download della nuova versione dellapiattaforma si deve configurare un device virtualeche la installi, altrimenti non sar possibile usarla per lo sviluppo

    Fig. 2: Android organizza i componenti sullo schermoattraverso i componenti di base View e ViewGroup

    050-054:088-093-corsi-xsl 1-12-2009 12:48 Pagina 51

  • 23 Android programming

    Android programmingProgrammazione delle interfacce utente con AndroidMOBILE Programmazione delle interfacce utente con Android

    ht tp ://www. ioprogrammo. i tG 52 / Gennaio 2010

    ANDROID.WIDGET.TEXTVIEWPermette di mostrare del testo allutente. Ilmessaggio da visualizzare pu essere imposta-to con il metodo setText(), che pu accettarecome parametro sia una stringa sia un riferi-mento a risorsa preso dal gruppo R.string (cfr.ioProgrammo 144).

    ANDROID.WIDGET.EDITTEXTEstende TextView e permette allutente di modifica-re il testo mostrato. Il testo digitato pu essere recu-perato con il metodo getText(), che restituisce unoggetto del tipo android.text.Editable. Gli oggettiEditable sono simili alle stringhe, ed infatti imple-mentano linterfaccia java.lang.Char Sequence.

    ANDROID.WIDGET.BUTTONRealizza un bottone che lutente pu premere ocliccare. Il componente espande TextView, e perquesto possibile impostare il testo mostrato alsuo interno con il metodo setText(), sia con para-metro stringa sia con riferimento a risorsa delgruppo R.string.

    ANDROID.WIDGET.IMAGEVIEWUn componente che permette di mostrare unim-magine. Metodi utili sono: setImage Bitmap(), cheaccetta un oggetto di tipo android.graphics.Bitmap;setImageDrawable(), che accetta un argomentoandroid. graphics. drawable. Drawable; setImageResource(), che accetta un riferimento a risorsadrawable.

    ANDROID.WIDGET.IMAGEBUTTONUn bottone con unimmagine. Estende ImageView, e quindi espone gli stessi metodi di que-stultima per impostare limmagine mostrata.

    ANDROID.WIDGET.CHECKBOXQuesto componente realizza una casella di spunta(check box, appunto). Estende Button e TextView,pertanto il testo a fianco della casella pu essereimpostato con i metodi setText() gi noti..

    ANDROID.WIDGET.RADIOBUTTONQuesto componente realizza un bottone radio.Come nel caso di CheckBox, le classi base Button eTextView forniscono i metodi necessari per limpo-stazione del testo visualizzato. Un bottone radio, dasolo, non ha senso. Due o pi bottoni radio, per-tanto, possono essere raggruppati allinterno di unandroid.widget.RadioGroup. Lutente, cos, potrattivare soltanto una delle opzioni del gruppo.

    ANDROID.WIDGET.TOGGLEBUTTONUn bottone ad interruttore, che pu essere cioon o off. Pu essere usato per far attivare odisattivare delle opzioni.

    ANDROID.WIDGET.DATEPICKERUn componente che permette di scegliere una dataselezionando giorno, mese ed anno. La data impo-stata dallutente pu essere recuperata servendosidei metodi getDayOfMonth(), getMonth() e getYear().

    ANDROID.WIDGET.TIMEPICKERUn componente che permette di scegliere un orarioselezionando ora e minuto. Lorario impostato dal-lutente pu essere recuperato servendosi dei meto-di getCurrentHour() e getCurrent Minute().

    ANDROID.WIDGET.ANALOGCLOCKUn componente che mostra allutente un orolo-gio analogico.

    ANDROID.WIDGET.DIGITALCLOCKUn componente che mostra allutente un orolo-gio digitale.

    Tutti gli oggetti discussi finora richiedono, neiloro costruttori, un oggetto che estenda la classeastratta android.content.Context. Si tratta di unastruttura che permette laccesso al sistema e checostituisce il contesto di esecuzione dellapplica-zione. Non dovete preoccuparvi di come ottene-re oggetti di questo tipo: android.app.Activityestende indirettamente Context, per cui dallin-terno di unattivit, vi sar sufficiente usare laparola chiave this. Ad esempio:

    Button b = new Button(this);

    La considerazione vale per le attivit, ma ancheper tanti altri contesti della programmazioneAndroid: pi o meno tutte le classi che sono mat-toni fondamentali del sistema estendono diretta-mente o indirettamente la classe astrattaandroid.content.Context.Sul CD-Rom allegato alla rivista trovate, insiemecon i codici di questo articolo, gli esempi duso diciascuno dei widget citati.

    LAYOUTCon il termine layout (disposizione, impagi-nazione), in Android, si identificano tutti queiViewGroup utilizzabili per posizionare i widgetsullo schermo. Android fornisce una serie dilayout predefiniti. Esaminiamone alcuni.

    android.widget.FrameLayoutIl pi semplice e basilare dei layout: accetta unwidget, lo allinea in alto a sinistra e lo estendeper tutta la dimensione disponibile al layoutstesso. Ecco un semplice esempio di utilizzo, cheallarga un bottone allintera area a disposizione

    Fig. 3: TextView

    Fig. 4: EditText

    Fig. 5: Button

    Fig. 7: ImageButton

    Fig. 9: RadioButton

    Fig. 8: CheckBox

    Fig. 6: ImageView

    050-054:088-093-corsi-xsl 1-12-2009 12:48 Pagina 52

  • Android programming 24

    Android programming Programmazione delle interfacce utente con Android

    ht tp ://www. ioprogrammo. i t Gennaio 2010/ 53G

    Programmazione delle interfacce utente con Android MOBILE

    di unattivit:

    Button button = new Button(this);

    button.setText("Bottone");

    FrameLayout layout = new FrameLayout(this);

    layout.addView(button);

    setContentView(layout);

    android.widget.RelativeLayoutCome FrameLayout, vuole un solo componente alsuo interno, ma a differenza di questultimo, lodisegna nelle sue dimensioni ideali, senza allar-garlo per ricoprire lintera area a disposizione.Per default, il componente viene allineato in altoa sinistra, ma possibile controllare lallinea-mento servendosi del metodo setGravity().Questo accetta un argomento di tipo int, che bene scegliere fra le costanti messe a disposizio-ne


Recommended