sabato 13 agosto 2011

Guida Android !!!!!


Introduzione: perché Android

Negli ultimi anni abbiamo assistito ad una vera e propria rivoluzione tecnologica incentrata principalmente sulla mobilità che ha portato alla nascita e allo sviluppo di nuovi settori di mercato in fortissima crescita.  Il settore alla testa di questa rivoluzione è sicuramente quello dei telefoni cellulari, ed in particolare quello dei dispositivi conosciuti come smartphone.

È un periodo incredibile ed eccitante per chi si occupa di sviluppo mobile. I telefoni cellulari non sono più semplici dispositivi per parlare, ma anzi sono dotati delle tecnologie più avanzate, come ad esempio accelerometro, schermi touch, GPS. Tecnologie che, combinate insieme, danno vita a dei prodotti così potenti da far pensare di essere destinati a diventare i prossimi PC. Grazie all'hardware di cui sono attualmente dotati si possono creare delle applicazioni mobile innovative e con finalità che rientrano praticamente in qualsiasi ambito della vita quotidiana: lavoro, divertimento, tempo libero, e molto altro ancora.

Android

Creata da Google in collaborazione con l'Open Handset Alliance (il gruppo di 79 aziende che lavorano insieme per accelerare lo sviluppo e le innovazione nel settore mobile), Android è la prima piattaforma completa e gratuita per lo sviluppo di applicazioni mobile.
Attualmente sono disponibili diverse piattaforme mobile, come ad esempio Windows Phone 7, iOS, Symbian, Linux Mobile (LiMo), solo per citarne alcune: cosa rende allora Android così speciale e perché dovremmo scegliere di studiare questa piattaforma?
Ecco alcuni vantaggi che si hanno nello sviluppare con Android:
  • Completamente open source.
  • Altissima diffusione (è il sistema operativo mobile più diffuso).
  • Costi ridotti di accesso e di sviluppo.
  • Gestione automatica del ciclo di vita dell'applicazione.
  • Estremamente portabile: può essere implementata per una grande varietà di hardware differente (non solo smartphone, ma anche internet tablet, ebook reader, netbook).
  • Gestione della grafica e del suono di altissima qualità.
In Android tutte le applicazioni sono ugualmente importanti e valide: sia le applicazioni native che quelle di terze parti sono scritte con le stesse API (Application Programming Interface) e sono eseguite dallo stesso ambiente allo stesso modo. Ciascuno di noi può rimuovere qualsiasi applicazione nativa e sostituirla con una di terze parti, compresi gli home screen e l'applicazione per le gestione delle telefonate.
Questa guida è dedicata allo sviluppo di applicativi Android: vedremo non solo l'ambiente di sviluppo e le componenti principali, ma anche e soprattutto tutti i passaggi necessari per implementare da zero un'applicazione. Dopo aver preparato l'ambiente di sviluppo, vedremo una panoramica degli elementi principali di una applicazione (che chiameremo come è oramai invalso "app"), come è strutturata e le fasi da seguire per progettarne correttamente una.
Infine spazio alla pratica: vedremo una serie di tutorial su alcuni degli strumenti principali dell'ambiente (layout, menu, form, localizzazione e così via) e la procedura per pubblicare le nostre app nell'Android Market, il servizio principale per vendere o distribuire gli applicativi sviluppati.

I software necessari

Il Software Development Kit (SDK) di Android è disponibile per Windows, Linux e Mac OS X, e tutte le applicazioni che si creano sono installabili ed utilizzabili su qualsiasi dispositivo Android. Per configurare un completo ambiente di sviluppo è necessario installare il Java Development Kit (JDK 5 o 6) e l'Android SDK.
Una volta installato il JDK ci possiamo occupare dell'Android SDK. Il software è completamente gratuito e non ci sono costi di alcun tipo per scaricarlo o per utilizzarne le API. Possiamo scaricare l'ultima versione disponibile dell'SDK di Android per il sistema operativo dal sito sviluppatori di Android. L'SDK è disponibile in due versioni: come archivio compresso (attualmente chiamato android-sdk_r11-windows.zip) e come applicazione auto-installante (chiamata installer_r11-windows.exe).
Se avete scelto, da vero developer, l'archivio compresso, l'installazione consiste semplicemente nello scaricare il file compresso e decomprimerlo in una nuova cartella. Il percorso di questa cartella ci servirà più avanti, dunque è importante prenderne nota.
Il prossimo passo è l'installazione di un ambiente di sviluppo Java: il consiglio è quello di utilizzare Eclipse (sono anche supportati Netbeans e JetBrains IDEA), perché è un IDE (Integrated Development Environment) open source, potente e fornito di strumenti davvero utili per lo sviluppatore. È disponibile per tutti i principali sistemi operativi ed è scaricabile al seguente indirizzo dawww.eclipse.org/downloads/.
Nota: se non avete particolari esigenze è consigliabile scaricare la versione per Java Developers (Eclipse IDE for Java Developers) che pesa 99MB. La versione per Java EE Developers va ugualmente bene, ma è più pesante e soprattutto include alcuni elementi che almeno inizialmente non utilizzerete.
L'installazione di Eclipse è molto semplice: è sufficiente decomprimere la cartella scaricata e il gioco è fatto. Per semplificare la vita dello sviluppatore, Google ha rilasciato anche un plug-in per Eclipse chiamato Android Development Tool (ADT). È uno strumento davvero comodo che permette di integrare in Eclipse i tool per la compilazione, il testing, il debugging del codice rilasciati con l'Android SDK.
L'installazione di ADT dipende dalla versione di Eclipse che si utilizza: l'installazione che spiegheremo a breve si riferisce all'ultima versione dell'IDE, che nel momento in cui si sta scrivendo corrisponde alla 3.6.2 ("Helios"). Per chi avesse bisogno di dettagli circa l'installazione di ADT su altre versioni di Eclipse può trovarli all'indirizzo http://developer.android.com/sdk/eclipse-adt.html.
La procedura di installazione del plugin è la seguente:
  1. Lanciato Eclipse, selezionare dal menu in alto la voce Help / Install New Software.
  2. Nella finestra che compare, nella casella di testo in alto (Work with), scrivete https://dl-ssl.google.com/android/eclipse/ e premete il pulsanteAdd.
Figura 1: L'installazione del plugin Android per Eclipse
(clic per ingrandire)
Figura 1: L'installazione del plugin Android per Eclipse
  1. Nella finestra che compare scegliete un nome, ad esempio ADT Plugin, e fate clic su Ok;
  2. Selezionate la checkbox Developer Tool e fate clic su Next: Eclipse comincerà a scaricare il plugin (a volte può impiegare molto tempo) e verificare le dipendenze. Al termine fate clic su Next.
  3. Dopo aver accettato la licenza, clicchiamo su Finish.
Effettuato il riavvio di Eclipse, rimane da configurare il plugin. La configurazione del plugin ADT richiede solo un altro minuto di lavoro: nel menu in alto di Eclipse selezioniamo Window / Preferences / Android. Dobbiamo impostare il percorso della cartella in cui abbiamo installato l'SDK di Android (il percorso in cui abbiamo decompresso l'SDK di Android). Se il programma dovesse richiedere l'installazione di alcuni componenti mancanti, non fateci caso, ne vedremo l'installazione più avanti, quando andremo a scrivere la nostra prima applicazione.
Siamo quasi pronti per scrivere la prima app: ma prima occorre introdurre i concetti fondamentali che caratterizzano lo sviluppo in ambiente Android.

I concetti fondamentali

La visualizzazione: View

Android fornisce una collezione di controlli studiati e progettati appositamente per i device mobili: il cuore di questi controlli è rappresentato principalmente da due classi, android.view.View e android.view.ViewGroup.
Una View è sostanzialmente un'area rettangolare nello schermo responsabile del disegno degli elementi grafici e della cattura e gestione degli eventi generati dall'utente. Un oggetto ViewGroup è anch'esso una View,ma che contiene altre View.
Nella piattaforma Android si utilizza il concetto di "layout" per gestire l'impaginazione dei controlli all'interno di un contenitore di oggetti View.Utilizzare i layout facilita la progettazione delle interfacce perché è più semplice orientare e posizionare i controlli che le compongono.
Possiamo considerare una View come un widget: bottoni, etichette, caselle di testo, tabelle, sono tutti esempi di controlli e widget che possiamo utilizzare per comporre le interfacce grafiche delle nostre applicazioni.
Come vedremo più in dettaglio nel tutorial passo per passo che concluderà questa guida possiamo scegliere approcci diversi per la costruzione delle interfacce in ambiente Android: la prima possibilità è quella di definire l'interfaccia interamente da codice, altrimenti possiamo scegliere di costruire le interfacce attraverso delle configurazione XML, oppure ancora possiamo scegliere un approccio "ibrido", definire le interfacce in XML e poi, attraverso un riferimento, modificarle e gestirle da codice.

Le azioni: Intent

Un Intent è un meccanismo che descrive un'azione specifica, come ad esempio "chiamare a casa" o "inviare un sms": in Android praticamente ogni cosa passa attraverso un Intent, e lo sviluppatore li può utilizzare per riusare o sostituire diversi componenti software.
Ad esempio è disponibile un Intent "inviare una email": se nella nostra applicazione abbiamo la necessità di gestire l'invio di email possiamo invocare l'Intent che il sistema ci mette a disposizione, oppure possiamo scriverne uno nuovo e utilizzare quest'ultimo nelle nostre Activity sostituendo l'Intent di default con quello implementato da noi.
Possiamo immaginare un Intent come un'azione che possiamo far invocare ad Android: un Intent può essere molto specifico ed essere richiamabile da una specifica Activity oppure può essere generico e disponibile per qualsiasiActivity che rispetta determinati criteri.
Schematizzando, un Intent può essere utilizzato per:
  • trasmettere l'informazione per cui un particolare evento (o azione) si è verificato;
  • esplicitare un'intenzione che una Activity o un Service possono sfruttare per eseguire un determinato compito o azione, solitamente con o su un particolare insieme di dati;
  • lanciare una particolare Activity o Service;
  • supportare l'interazione tra qualsiasi applicazione installata sul dispositivo Android, senza doversi preoccupare di che tipo di applicazione sia o di quale componente software gli Intent facciano parte.
L'Intent è uno dei concetti e dei meccanismi fondamentali di Android: la sua implementazione trasforma ogni dispositivo Android in una collezione di componenti indipendenti ma facenti parte di un singolo sistema interconnesso.

La condivisione dei dati con i Content Provider

Un Content Provider è un contenitore di dati e rappresenta uno dei modi migliori per condividere informazioni "globali" tra applicazioni. Nel modello di sicurezza implementato in Android, i file scritti da una applicazione non possono essere letti o scritti da un'altra. Android è un sistema Linux-based in cui ogni applicativo ha il suo userid Linux, la sua directory "data" (/data/data/nome_pacchetto) e il suo spazio di memoria dedicato e protetto. Questo è il motivo per cui gli applicativi Android necessitano dei Content Provider per comunicare tra loro.
I processi possono segnalare se stessi al sistema come Content Provider di un insieme particolare di dati: quando queste informazioni sono richieste vengono richiamate da Android grazie ad un insieme specifico di API che permettono di agire sul contenuto secondo le specifiche definite. Alcuni Content Provider, ad esempio, forniscono l'accesso ai proprio dati solo in lettura, mentre altri permettono alle applicazioni di creare, aggiornare, modificare o cancellare record, come nel caso di quella che gestisce i contatti.
Un database SQLite in un device Android è un esempio di sorgente di dati che possiamo incapsulare all'interno di un Content Provider: Chiaramente Android è provvisto di un insieme di Content Provider nativi, documentati nel package "android.provider" dell'SDK. Possiamo vedere la lista di questi Content Provider sul sito degli svilupppatori Android.
Per accedere alle risorse fornite da un Content Provider utilizziamo un insieme di URL caratterizzati dallo schema "content://" con un modello che ricorda molto da vicino le chiamate REST.
Diversi database nativi, come ad esempio quello dei contatti, sono disponibili come Content Provider rendendosi accessibili anche ad applicativi di terze parti.

Lavoriamo in backgroud con i Service

Un Service è un processo che gira in background senza la diretta interazione con l'utente (un concetto molto simile al deamon in ambiente Unix). La classe Service viene utilizzata per creare componenti software che possono svolgere attività in modo "invisibile", senza interfaccia utente.
Un esempio tipico di Service lo vediamo implementato nelplayer di musica, che continua a riprodurre canzoni anche quando non è in primo piano (foreground) e stiamo utilizzando altri programmi. Il codice responsabile di questa attività sarà implementato in un Service, al quale successivamente un'altra Activity potrà "ordinare" di cambiare traccia o di fermare la musica.
Utilizzando i Service possiamo far girare le nostre applicazioni e farle reagire ad eventi anche quando non sono in primo piano: un Service può essere avviato, fermato e controllato da altri componenti dell'applicazione, inclusi altri Service e Activity. Se la nostra applicazione deve svolgere attività che non dipendono direttamente dall'input inserito dall'utente, allora implementare un Service potrebbe essere la risposta alle nostre necessità: applicazioni che si aggiornano regolarmente ma che raramente o ad intermittenza interagiscono con l'utente sono buone candidate ad essere implementate come Service.
Un Service avviato ha una priorità più alta rispetto ad Activity in stato di inattività, in questo modo vi è minore probabilità per un Service di essere terminato dal gestore delle risorse di runtime. L'unica ragione per cui Android potrebbe fermare un Service prematuramente è per fornire risorse addizionali al componente software in primo piano (normalmente una Activity).
Quando questo si verifica il Service fermato sarà riavviato automaticamente non appena le risorse diventano nuovamente disponibili.
Nel caso in cui il Service debba interagire direttamente con l'utentepotrebbe essere necessario incrementare la sua priorità come quella di un'Activity in foreground. Questo ci assicura che i nostri Service non vengano terminati se non in circostanze estreme, chiaramente però a scapito della gestione delle risorse a tempo di esecuzione, potenzialmente con un conseguente degrado generale dell'esperienza utente.

Il cuore di un'applicazione Android: AndroidManifest.xml

L'AndroidManifest.xml è il file che definisce i contenuti e il comportamento della nostra applicazione: all'interno di questo file sono elencate le Activity e i Servicedell'applicazione, con i permessi che necessita per funzionare correttamente.
Ogni progetto Android include un AndroidManifest.xmlmemorizzato nella directory principale del progetto: in questo file XML si possono inserire nodi per ogni elemento (ActivityServiceContent Provider e così via) che compone la nostra applicazione, impostando i permessi per determinare come questi interagiscono l'un l'altro e con le altre applicazioni.
Come abbiamo visto ogni applicazione gira all'interno di un proprio processo Linux, per cui ci sono delle restrizioni ben specifiche: ogni processo non può accedere alla memoria di un altro processo, e ad ogni applicazione è assegnato uno specifico identificatore utente. Inoltre i file di un applicativo non possono essere letti o scritti da altri applicativi: anche l'accesso a diverse operazioni critiche sono protette, e dobbiamo specificatamente chiedere i permessi per utilizzarle. Questo tipo di richieste vanno impostate nell'AndroidManifest.xml .
Quando l'applicazione viene installata il gestore dei pacchetti concede o non concede i privilegi a seconda di come li abbiamo configurati nell'AndroidManifest.xml.
Tra i principali permessi che possiamo richiedere ci sono i seguenti:
  • READ_CONTACTS: leggere (ma non scrivere) i dati dei contatti dell'utente.
  • WRITE_CONTACTS: scrivere (ma non leggere) i dati dei contatti dell'utente
  • RECEIVE_SMS: monitorare l'arrivo di messaggi SMS
  • INTERNET: accedere ed utilizzare la connessione Internet
  • ACCESS_FINE_LOCATION: utilizzare un accurato sistema di localizzazione come il GPS
La radice di ogni AndroidManifest.xml è il tag <manifest>: questo tag include i nodi che definiscono i componenti dell'applicazione, l'ambiente di sicurezza, e tutto ciò che fa parte dell'applicazione. Nelle lezioni successive vedremo come si configura correttamente questo importante file e quali strumenti possiamo utilizzare per facilitare il nostro lavoro.

Android Virtual Device: virtualizziamo i dispositivi

L'Android Virtual Device (AVD) permette agli sviluppatori di testare le loro applicazioni senza dover per forza possedere e collegare al PC uno smartphone Android vero e proprio. Gli AVD possono essere creati con differenti configurazioni per emulare differenti tipi di smartphone reali. L'SDK di Android non include alcun AVD pre-installato, dunque è necessario creare almeno un device virtuale prima di poter testare le nostre applicazioni in un emulatore.
Come vedremo in dettaglio nelle lezioni successive, ogni AVD è configurato almeno con un nome, una versione di SDK supportata (Android 1.6, Android 2.1 e così via), un valore che indica la quantità di memoria da riservare per la scheda SD e una risoluzione per lo schermo.
Il plugin ADT di Eclipse (nelle lezioni precedenti abbiamo visto come installarlo e come integrarlo all'interno dell'IDE) permette di gestire come facilità gli AVD e gli emulatori. In particolare permette di lanciare automaticamente l'emulatore all'interno dell'AVD selezionato per testare o effettuare il debug dei nostri progetti. Ovviamente chi non volesse utilizzare Eclipse e il plugin corrispondente può controllare l'emulatore attraverso la linea di comando (il terminale).

Resource : la gestione delle risorse in Android

Una Resource può essere un'immagine bitmap, una stringa di testo che valorizza una etichetta o un bottone, o può essere qualsiasi altra informazione che non sia codicee che è necessaria per il corretto funzionamento dell'applicazione Android.
Tutte le Resource vengono compilate all'interno dell'applicazione: questo è molto utile per implementare l'internazionalizzazione o per supportare diversi tipi di device. Le Resource sono memorizzate e create all'interno di una directory specifica, la directory res del nostro progetto: il compilatore delle risorse di Android processa le risorse in base alle sotto-directory in cui sono memorizzate e in base al formato dei file.
Ad esempio i file immagine JPG o PNG dovrebbero essere memorizzati in una directory all'interno del percorso res/drawable mentre i file XML che descrivono e configurano i layout delle schermate dovrebbero essere memorizzate in una directory all'interno del percorso res/layout. Possiamo aggiungere alle directory suffissi specifici per indicare una particolare lingua, un determinato orientamento dello schermo, la densità dei pixel e molto altro ancora.
Il compilatore delle risorse comprime e impacchetta le risorse delle nostre applicazioni, e successivamente genera una classe chiamata "R" che contiene tutti gli identificatori che possiamo utilizzare per riferirci alle risorse del programma. Questa tecnica assicura che tutte le referenze delle Resourcesiano valide e permette di risparmiare spazio non dovendo memorizzare anche le stringhe di referenza come avviene in ambiente Java standard.

Nessun commento:

Posta un commento