GUIDA COMPLETA PER IMPARARE A SVILUPPARE SU ANDROID

android_guida

In questo articolo vedremo i principali concetti della programmazione nativa mobile per sistemi Android. Illustreremo gli strumenti necessari per realizzare da zero una semplice app destinata a presentare una generica pizzeria che, con le sezioni, “chi siamo”, “prenota”, “le nostre pizze”,  ecc, decide di esporsi, tramite mobile, ai suoi clienti.

Seguiremo, dunque, la fase di progettazione, di simulazione, di pubblicazione sullo store e vedremo come monetizzare con gli strumenti offerti dal Google Play Store. Requisito indispensabile è la conoscenza di Java, linguaggio di riferimento per lo sviluppo su piattaforma Android ed una buona dimestichezza con il mondo degli IDE Java, in particolare Android Studio.

THE REVOLUTION IS MOBILE

“The revolution is mobile”: così titolava The Economist 1’8 ottobre 2011. Gli attuali scenari mostrano quanto la famosa rivista avesse azzeccato il suo titolo; stiamo vivendo una nuova rivoluzione tecnologica legata alla diffusione, sempre più accentuata, dei dispositivi mobili. Se da un lato è chiaro il ruolo fondamentale che riveste il mondo mobile nel suo complesso e come, lo stesso, non possa e non debba essere trascurato da nessuna azienda, dall’altro appare sempre più faticoso, per le software house e gli sviluppatori tutti, districarsi in un mercato frastagliato dominato da sistemi operativi e linguaggi di sviluppo diversi.

NATIVA, WEB-BASED O IBRIDA?

Oggi la diatriba più avvertita negli ambienti dedicati allo sviluppo di applicazioni mobile è la seguente: nativa, web-based o ibrida?

Per applicazioni native (o native app/ication) si intendono le app che sono create espressamente per un dispositivo specifico utilizzando i linguaggi di programmazione previsti dalla piattaforma destinataria.

Un’applicazione nativa destinata ai device Android richiederà uno sviluppo in Java, mentre una destinata a sistemi iOS andrà implementata a mezzo di Objective-C (o il più recente Swift). Ci sarà bisogno di C– o C= nel caso in cui il nostro target sia invece un Windows Phone e così via. Vediamo i principali vantaggi dello sviluppo in linguaggio nativo:

Un app nativa, essendo progettata per un OS specifico, ha un approccio più “intimo” con l’OS stesso. Infatti sfrutta tutte le funzionalità native del dispositivo. Ha accesso, ad esempio, al file system, al controllo dei vari sensori, al GPS, alla rubrica, messaggi, notifiche, ecc. ..

• Le prestazioni sono massimizzate, in quanto si sfrutta al meglio l’hardware ospite;

• Le app native funzionano (volendo) anche in modalità off-line;

• Vengono distribuite mediante gli store ufficiali, ciò aumenta la visibilità e, di conseguenza, la diffusione ed eventuale guadagno;

• E’ possibile amplificare la user-experience. La grafica, infatti. sarà molto simile a quanto l’utente è abituato ad usare nel resto del dispositivo. Le interfacce ed i componenti risulteranno ottimizzati, altamente efficienti.

Lo svantaggio principale dello sviluppo in linguaggio nativo è quello della portabilità. Per come già discusso un’app nativa può essere usata solo sui dispositivi per i quali è stata progettata senza possibilità di essere portata su  piattaforme diverse.

Generalmente, per applicazioni “importanti” si è disposti ad esporsi alle conseguenze di questo svantaggio optando per lo sviluppo nativo, che offre maggiori garanzie e maggiore controllo sull’applicazione.

IL NECESSARIO PER INIZIARE

Lo sviluppo di un’applicazione mobile segue un flusso logico che riepiloghiamo nella seguente figura.

Android_developing_overview

Come si nota I blocchi fondamentali da percorrere sono quattro: la fase di setup e configurazione dell’ambiente di lavoro, la fase di development o di sviluppo e scrittura del codice necessario alla nostra applicazione, il momento di debugging and testing mediante il quale si genera il progetto eseguibile sotto forma di file .apk, da testare sul nostro dispositivo fisico oppure sull ‘emulatore reso disponibile dai tools di sviluppo configurati ai passi precedenti ed infine la fase di publishing, che ha lo scopo di pubblicare sullo stare la nostra applicazione al fine di distribuirla al nostro target di utenza implementando, a nostro piacimento, le politiche di monetizzazione.

Percorreremo insieme, nelle pagine seguenti, le fasi più salienti di questo workflow.

LA FASE DI SETUP

Il primo passo da seguire è sicuramente quello di munirsi, qualora se ne fosse sprovvisti, del JDK (Java Oevelopment Kit). Come visto in premessa, infatti, Java è il linguaggio di riferimento per la scrittura di applicazioni native Android. Il JDK è facilmente reperibile sul sito Oracle (http:Uwww.oracle.com), seguendo i link Downloads e poi Java for developers, scegliendo la versione compatibile con il proprio sistema operativo.

Il passo successivo è quello di installare lo strato dedicato all’Android SDK (Software Development Kit)  che contiene tutto il necessario per scrivere le nostre applicazioni Android. Tra le altre cose, al suo interno sono contenuti: librerie, esempi, debugger, emulatore e tutta una serie di funzionalità gestite mediante l’Android SDK Manager. Mentre fino a poco tempo fa questo modulo meritava un’installazione specifica, oggi è contenuto, generalmente, negli IDE dedicati.

Abbiamo introdotto quindi un altro componente fondamentale: l’IDE (lntegrated Development Environment), ANDROID ovvero l’ambiente di sviluppo. Si trovano in giro differenti IDE da poter utilizzare per i nostri obiettivi.

Abbiamo deciso di usare quello ufficiale Android noto con il nome di Android Studio. Il motivo di questa scelta è da ricercarsi nella perfetta integrazione con tutti gli strumenti necessari. Al suo interno è già contenuto l’Android SDK. Ne deriva che installando l’IDE saremo subito operativi avendo il necessario previsto dalla fase di setup! Android Studio (reperibile all ‘url: http://developer.android.com/sdk/index.html) è un progetto relativamente nuovo che ha conquistato da subito gli sviluppatori grazie alla sua interfaccia completa e professionale. Risulta basato su lntelliJ IDEA Community Edition, il popolare IDE Java di JetBrains e, difatti, è l’ambiente ufficiale di sviluppo Android promosso da Google.

Si distingue dagli altri IDE generalisti (nel senso che sono pensati per lo sviluppo in diversi ambienti) per essere stato pensato appositamente per gli sviluppatori Android e, pertanto, ad oggi è un passo obbligato se non si hanno motivi particolari per preferire IDE differenti.

Altro IDE molto usato per lo sviluppo mobile Android è il sempre presente Eclipse: potente, flessibile, riesce a raggiungere un’elevata integrazione con l’SDK Android e gode di ottima considerazione nelle community di sviluppatori.

Tuttavia i più attenti noteranno, nella pagina di download sul sito ufficiale dedicato agli sviluppatori Android, un messaggio che avvisa gli utilizzatori di Eclipse di essere consapevoli del fatto che l’IDE ufficiale è Android Studio invogliando alla migrazione verso quest’ultimo al fine di avere sempre gli aggiornamenti più recenti!

Sempre nella fase di setup viene configurata la componente AVO (Android Virtual Device Manager) che consente di preparare un emulatore che eseguirà, in un ambiente dedicato, le nostre applicazioni sostituendosi al device fisico. E’ possibile settare, nell’emulatore così configurato, una serie di caratteristiche come la dimensione dello schermo e la memoria disponibile ma anche camera, GPS, sensori vari, potendo, di conseguenza, vedere il risultato su una varietà di configurazioni. Per accedere ad AVD si va da Tools > Android >AVO Manager.

Per creare un nuovo device virtuale cliccare sul pulsante Create Virtual Device e, negli step successivi, selezionare l’hardware e le versioni di sistema preferite.

ARCHITETTURA DI UN SISTEMA ANDROID

architettura-sistema-androidLa prossima immagine mostra l’architettura complessiva di Android. E’ sempre bene ricordarla quando si approccia per la prima volta a questo sistema in quanto riesce a dare una visione di insieme dei vari strati e dei moduli in essi contenuti.

CONCETTI FONDAMENTALI DI PROGRAMMAZIONE MOBILE: LE ACTIVITY

A livello logico un’applicazione Android è costituita da diverse componenti che interagiscono con il sistema operativo e con l’utente. Viste le finalità del  presente articolo ci soffermeremo sulle componenti essenziali: tra queste quelle di maggior rilievo sono le activity.

Le activity possiamo immaginarle come delle finestre della nostra applicazione. Ricoprono un ruolo fondamentale nell’approccio alla costruzione di un’app. Con buona approssimazione possiamo intenderle come le pagine vuote dalle quali partire al fine di rappresentare una singola sezione di quanto vorremo realizzare ovvero il contenitore delle nostre interfacce grafiche che avranno il compito di interagire con gli utenti.

In realtà questa definizione non le rappresenta appieno, ma per gli scopi che ci prefiggiamo è sufficientemente espressiva. Facendo un esempio, se volessimo crea re un’app che contenga due “pagine”, una che dice “Chi siamo” e l’altra che dice “Come contattarci”, in linea di massima ci servirà creare due activity associate rispettivamente alle due sezioni.

Generalmente viene definita un’activity principale, che verrà eseguita al primo avvio dell’applicazione, dalla quale si possono richiamare tutte le sezioni secondarie. Le activity sono gestite mediante l’activity stack, una pi la dove in testa c’è l’activity in esecuzione pronta a lasciare il posto (alla pressione del tasto back ad esempio) ad altre activity in background.

Un’activity può assumere sostanzialmente quattro stati:

  1. Running. Un’activity in primo piano (quindi in testa al la pila precedentemente descritta) si dice in stato di running; e’ quella che ha il focus dell’applicazione.
  2. Paused. Un’activity è in stato paused quando ha perso il focus ma è ancora visibile (ad esempio vi si è sovrapposta ad essa un’activity in stato running che non è lancia a in full screen). In questo stato l’activity è viva.
  3. Stopped.  . Se un’activity non è visibile all’utente, è in stato stopped. Essa è “nascosta” da altre activity in primo piano . Mantiene le informazioni.
  4. Killed. Se un’actività è in paused o stopped, il sistema può decidere di fare killing del processo ad essa associato liberando la memoria impegnata. Quando ciò accade, se l’activity interrotta deve essere nuovamente visualizzata dall’utente, essa andrà completamente riavviata.

Nella figura, oltre agli stati sopra descritti, si notano dei metodi (onCreate, onStart, … ), la cui gestione è riservata al sistema operativo, ma che possono essere controllati dal programmatore, in fase di scrittura delle applicazioni, mediante override al fine di avere un controllo completo della nostra applicazione mentre la stessa evolve tra i suoi stati caratteristici.

Uno dei metodi più importanti è onCreate, metodo essenziale, che da il via al ciclo di vita di un’activity. Viene invocato quando l’activity è istanziata per la prima volta. Il ciclo termina con il metodo onDestroy che si occupa di distruggere il processo e liberare la memoria impegnata. Un’activity è pronta ad essere visibile all’utente in tutto il percorso  compreso tra i metodi onStart (indica che l’activity sta per essere visualizzata) ed onStop (chiamato quando l’attività non è più visibile all’utente). In questo lasso di tempo potrebbe anche non essere in primo piano, trovarsi nello stato di paused come precedentemente spiegato ma comunque si tratterebbe di un’activity viva! Il metodo onPause è invocato quando l’activity sta per andare in background. Naturalmente dopo una chiamata onStop e conseguente terminazione del processo o semplice “parcheggio” dello stesso in attesa delle decisioni dell’utente, può trovare luogo una nuova chiamata onStart per la stessa activity che la riporta in primo piano e, dunque, alla vista dell ‘utente (vedi figura sulle possibili evoluzioni del metodo onStop: da sinistra si va verso il killed, quindi onCreate e quindi onStart mentre da destra verso onRestart (questo provvede a ridisegnare l’activity dormiente) e dunque onStart: in quest’ultima ipotesi non e’ necessario un onCreate in quanto l’activity non era stata distrutta ma semplicemente messa in secondo piano nella pila e risvegliata dall’activity manager). Per essere più precisi l’activity sarà di certo visibile tra gli stati onResume (che indica che sta per essere prospettata all’utente ed è pronta ad interagire con esso) ed onPause. In questo arco temporale la· finestra dell’attività occupa il primo posto della pila, è davanti a tutte le altre. La seguente porzione di codice mostra un primo approccio alla gestione di una nostra activity.

public class MyActivity extends Activity

{

protected void onCreate(Bundle savedlnstanceState)

{

su per. on Create( savedlnsta nceState);

// Activity creata ed istanziata

}

protected void onResume()

 

{

super.onResume();

//L’activity sta per essere prospettata all’utente

}

protected void onPause() {

super.onPause();

//L’activity sta per andare in background

}

}