lunedì 20 febbraio 2023

venerdì 1 maggio 2015

[ANDROID] Creare la prima applicazione


Per poter testare la propria macchina di sviluppo è necessario innanzitutto creare un nuovo progetto Android:
  • apriamo la Perspective di Eclipse relativa a Java andando sul menu Window → Open Perspective
  • dal menù File apriamo New → Android Application Project;
  • seguiamo la  procedura di creazione guidata. La serie di schermate (circa 4 o 5) che si susseguono ci chiede di inserire una serie di impostazioni. L’unica assolutamente obbligatoria è il nome dell’applicazione. Diciamo che il nome scelto per questa prima applicazione sia – nemmeno a dirlo – HelloWorldtutte le restanti impostazioni al momento possono essere lasciate con i valori di default, saranno comunque modificabili successivamente. Si può concludere la creazione del progetto selezionando sempre il pulsante Next finché non diventerà attivo quello denominato Finish.
L’architettura di progetto così impostata è costituita da un certo numero di file e cartelle.
Tutti sono importanti ma gli elementi tra i quali il programmatore dovrà sapersi muovere al più presto con scioltezza sono:
  • la cartella src che conterrà tutto il codice Java che scriveremo;
  • la cartella res in cui risiederanno le cosiddette risorse dell’applicazione per la maggior parte configurate in XML ma non solo;
  • il file AndroidManifest.xml anch’esso in XML che custodirà configurazioni e ruoli dei componenti della nostra app.
Un progetto creato in questa maniera da Eclipse è funzionante, sebbene non contenga nessuna funzionalità particolare. Al momento, quindi, non modifichiamo nulla e passiamo subito al suo avvio immediato.

Esecuzione del progetto: dispositivo emulato o reale?

Per eseguire il test è necessario che si abbia a disposizione un dispositivo Android attivo. Può trattarsi di un dispositivo reale o di un sistema emulato.

Esecuzione su un dispositivo emulato

Nel menu Window (attenzione, per vederlo è necessario trovarsi nella prospettiva Java e non Debug) sono disponibili due voci importantissime:Android SDK Manager e Android Virtual Device Manager. Il primo serve a profilare il nostro SDK richiedendo lo scaricamento di versioni di Android per le quali vogliamo sviluppare o strumenti aggiuntivi come l’utilissimo HAXM.
Il secondo strumento,  Android Virtual Device Manager, è ciò che ci serve per preparare un emulatore, seguendo questi passi:
  1. cliccare sulla voce Window → Android Virtual Device Manager;
  2. nell’interfaccia che si apre (vedere in figura) c’è un’area che ospiterà l’elenco degli emulatori che creeremo. Alla sua destra cliccare il pulsante New…;
  1. la nuova finestra che si apre, mostrata in figura, permette di configurare un dispositivo emulato semplicemente assegnandogli un nome e la versione di Android che si vuole che esegua oltre ad una serie di impostazioni ulteriori;
  1. tornando alla finestra presentata al precedente punto 2. dovremmo vedere il nostro emulatore elencato nell’area bianca. Non resta che selezionarlo e avviarlo cliccando il pulsanteStart…

Esecuzione su un dispositivo fisico reale

Se si vuole utilizzare un dispositivo reale via USB non è richiesto apportare modifiche in Eclipse. Usando Windows sono solitamente necessari dei driver reperiti direttamente dal sistema operativo  o scaricati appositamente dal programmatore. Qualora, al contrario, si usasse Linux non è richiesta l’installazione di alcun driver, macchina di sviluppo e Android si interfacceranno direttamente.

Lancio dell’applicazione

Dopo il boot del sistema emulato, potremo lanciare la nostra applicazione che verrà eseguita direttamente sul dispositivo. Ciò può essere fatto in modalità Run o Debug utilizzando uno dei mezzi messi a disposizione dall’IDE (voci nel menu Run, combinazione di tasti o pulsanti sulla barra degli strumenti).
Il risultato dell’esecuzione  è molto semplice.



giovedì 26 marzo 2015

[ANDROID] Ciclo di vita di un'app


Elemento principale per la sopravvivenza di un sistema mobile è la corretta gestione delle risorse. Per esmpio, uno smartphone è un dispositivo dalla vita complicata: si occupa di chiamate, sms, offre pagine web, giochi, comunicazione sui social network per molto tempo ogni giorno. Inoltre, capita sempre più spesso che non venga mai spento impedendo così una fase molto comune nella vita dei PC: l’arresto del sistema con conseguente liberazione della memoria e pulizia di risorse temporanee assegnate.
In questo senso, Android fa in modo di tenere in vita ogni processo il più a lungo possibile. Ciò non toglie che in alcune circostanze ed in base alle risorse hardware a disposizione, il sistema operativo si troverà nella necessità di dover liberare memoria abbattendo processi.
Il punto è quale processo eliminare. La discriminante è quando un’applicazione, candidata all’eliminazione, sia importante per la user experience. Maggiore sarà l’importanza riconosciuta, minori saranno le probabilità che venga arrestata.
In questo modo, Android preserverà il sistema e salvaguarderà l’utente.

I processi possono essere classificati in:

Processi in foreground
sono quelli che interagiscono direttamente o indirettamente con l’utente. Sono applicazioni che contengono l’Activity attualmente utilizzata o i Service ad essa collegati. Questi sono i processi che Android tenterà di preservare maggiormente. Importante notare che, comunque, anche le applicazioni in foreground non sono del tutto al sicuro. Se ad esempio il sistema non disponesse di risorse sufficienti a mantenerli tutti in vita, si troverebbe costretto ad arrestarne qualcuno.


Processi visibili: 
non sono importanti come quelli in foreground ma vengono anch’essi grandemente tutelati da Android. Infatti, avendo componenti ancora visibili all’utente anche se non vi interagiscono più, svolgono comunque un ruolo particolarmente critico. Anche in questo caso si tratta di Activity visibili e Service ad esse collegati.


Processi service: 
contengono dei service in esecuzione che generalmente svolgono lavori molto utili all’utente anche se non direttamente collegati con ciò che egli vede nel display. Il loro livello di priorità può essere considerato medio: importanti sì ma non tanto quanto i processi di cui ai precedenti due punti.


Processi in background: 
contengono activity non più visibili all’utente. Questa è una categoria solitamente molto affollata composta dal gran numero di applicazioni che l’utente ha usato e messo poi in disparte, ad esempio premendo il tasto Home. Non sono considerati molto importanti e sono dei buoni candidati all’eliminazione in caso di scarsità di risorse.


Processi empty: 
sono praticamente vuoti nel senso che non hanno alcuna componente di sistema attiva. Vengono conservati solo per motivi di cache, per velocizzare la loro riattivazione qualora si rendesse necessaria. Come ovvio, sono i candidati “numero 1” all’eliminazione da parte del sistema operativo.

venerdì 20 febbraio 2015

[JAVA] Variabili e dichiarazioni


Si definisce variabile l'insieme di un nome simbolico, detto anche identificatore, e un indirizzo di memoria che contiene una determinata quantità, detta comunemente valore della variabile.

Dichiarazione delle variabili

In Java, ogni variabile ha associato anche un tipo (come Integer, String, Boolean, etc.) che definisce le caratteristiche che avranno i valori che la variabile potrà assumere.
Ad esempio una variabile di tipo Integer potrà contenere il valore 42 ma non il testo quarantadue.

La sintassi per la dichiarazione di una variabile in Java è la seguente:

[public|protected|private] [static] [final] Tipo identificatore [= value];

dove le parti tra parentesi quadre ‘[]‘ sono opzionali ed il simbolo pipe ‘|‘ deve essere letto “oppure”.

Nomi delle variabili

L’identificatore (nome) di una variabile è una sequenza di lettere e cifre il cui primo elemento deve essere una lettera oppure il carattere underscore (‘_‘) o ancora il carattere dollaro (‘$‘).

Vige comunque la convenzione (non regola sintattica) che i nomi delle variabili inizino con unalettera minuscola e, qualora formati da più parole concatenate, tutte le parole successive alla prima siano capitalizzate e non vengano usati i simboli _ e $ nonostante siano ammessi. Ad esempio:

int nomeDellaVariabileIntera;

Per i nomi dei tipi, ovvero per le classi, la convenzione prevede invece che la prima lettera sia maiuscola):

class LaMiaClasse


L’identificatore può essere una qualsiasi stringa ma esistono alcune parole riservare del linguaggio che non possono essere utilizzate come identificatori:



Tipi di variabili

In Java si distinguono tre tipi di variabili: 

- variabili locali 
- variabili di istanza 
- variabili di classe.


Variabili Locali

Le variabili locali sono quelle la cui dichiarazione avviene all’interno di un metodo.
Le variabili locali sono create quando un metodo viene chiamato e scompaiono (vengono cancellate dalla memoria) quando il metodo termina.
Ogni variabile dichiarata all’interno del metodo può essere utilizzata solamente all’interno del metodo stesso ed in Java le variabili locali non possono essere utilizzate prima della loro inizializzazione.

Per esempio, se provassimo a compilare il seguente metodo:





il compilatore Java ci darebbe un messaggio di errore perchè la variabile j non è stata inizializzata prima del suo uso e non è quindi possibile aggiungere un valore alla variabile fino a che a questa non sia stato assegnato un valore.

Il codice seguente sarebbe invece compilato senza alcun errore:




Nell’esecuzione di questo frammento di codice, la macchina virtuale Java crea in memoria lo spazio per registrare le variabili locali i e j, per poi cancellarle (liberando lo spazio in memoria) alla fine dell’esecuzione del metodo add.

Scope di una variabile

Si definisce scope di una variabile, l’area del codice nel quale un identificatore resta associato ad un indirizzo di memoria (e quindi l’area di codice entro il quale una variabile mantiene il suo valore).
In Java ogni bloccodefinisce uno scope e ogni variabile locale ha come scope l’area di codice che inizia dalla definizione della variabile stessa e termina con il blocco corrente.



Variabili di istanza

Le variabili di istanza, anche note come field o campi, sono dichiarate all’interno di una classe ma all’esterno di ogni metodo.

I field hanno come scope l’intero corpo della classe in cui sono dichiarati, compresi i metodi della classe stessa. Quindi sono visibili all’interno di tutti i metodi della classe.
Può succedere che una variabile locale in un metodo (oppure il parametro di un metodo) abbia lo stesso nome (identificatore) di una variabile di istanza. In questo caso ha la precedenza la variabile più specifica, cioè la variabile locale o il parametro.

Per esempio (cliccare per ingrandire):



Un’istanza di una variabile (non statica) continua ad esistere nella memoria di un programma fino a quando esiste l’oggetto che la contiene (ed un oggetto “rimane in vita” fino a quando ne esiste almeno una referenza, quindi una variabile associata ad esso).

Variabili di classe (static)

Le variabili di classe infine, comunemente dette anche static field o campi statici, sono variabili di istanza ma nella loro definizione viene usata la keyword ‘static’.

static int var = 6; 

Una variabile di classe è una variabile visibile da tutte le istanze di quell’oggetto ed il suo valore non cambia da istanza ad istanza, per questo appartiene trasversalmente a tutta la classe.
Mentre per le variabili di istanza viene allocata una nuova locazione di memoria per ogni istanza di una classe, per le variabili statiche esiste una unica locazione di memoria legata alla classe e non associata ad ogni singola istanza.
Una variabile di classe, statica, vive (cioè mantiene occupata la memoria e continua a mantenere il suo valore) fino al termine del programma.

Modificatori di visibilità: public, private, protected, default

Le variabili di istanza e di classe possono essere ulteriormente qualificate per mezzo delle keywords public e private che ne determinano la visibilità all’esterno della classe in cui sono dichiarate.

Se utilizziamo la keyword private una variabile sarà visibile (accessibile, utilizzabile per far riferimento al suo indirizzo di memoria e quindi al suo valore) solamente all’interno della classe.
  
Se qualificheremo la variabile come public indicheremo al compilatore che la variabile potrà essere utilizzata da qualsiasi parte del codice in cui ci sia una istanza della classe (con la notazione idIstanzaClasse.nomeVariabile). 

Protected significa che la variabile sarà accessibile da ogni altra classe che appartiene al medesimo package della classe che contiene la variabile e da ogni classe che ne deriva (la estende). 

Se non specifichiamo un qualificatore di visibilità, la variabile sarà lasciata con la visibilità di default che in Java signifca che sarà accessibile solo da tutte le classi nel medesimo package.

Variabili final e static final

Si usa la keyword final per dichiarare una variabile che potrà essere inizializzata una sola volta, sia nella fase di dichiarazione o attraverso una successiva assegnazione.
Al contrario delle costanti, il valore delle variabili final non è necesariamente noto a compile-time ma il loro indirizzo di memoria può essere inizializzato una sola volta rendendone possibile l’utilizzo in alcuni contesti in cui sarebbe impossibile utilizzare le normali variabili locali.
In Java si definiscono costanti le variabili che vengono qualificate contemporaneamente come final e static: è convenzione che i nomi delle variabili final siano in maiuscolo e se il nome è costituito da più parole, queste vengano separate dal carattere underscore (‘_‘);

domenica 1 febbraio 2015

[ANDROID] Funzionamento di base di un'applicazione


Le applicazioni Android, affidano sue funzionalità a quattro tipi di componenti. Si tratta di Activity, Service, Content Provider e BroadcastReceiver.


Activity 

è un’interfaccia utente. Ogni volta che si usa un’app generalmente si interagisce con una o più “pagine” mediante le quali si consultano dati o si immettono input. La realizzazione di Activity è il punto di partenza di ogni corso di programmazione Android visto che è il componente con cui l’utente ha il contatto più diretto.


Service 
svolge un ruolo opposto all’Activity. Rappresenta un lavoro che viene svolto interamente in background senza bisogno di interazione diretta con l’utente. I Service hanno un’importanza
basilare nella programmazione proprio perchè spesso preparano i dati che le activity devono mostrare all’utente permettendo una reattività maggiore nel momento della visualizzazione.


Content Provider 
nasce con lo scopo della condivisione di dati tra applicazioni. La sua finalità è quella di dare sicurezza, Questi componenti permettono di condividere, nell’ambito del sistema, contenuti custoditi in un database, su file o reperibili mediante accessi in Rete. Tali contenuti potranno essere usati da altre applicazioni senza invadere lo spazio di memoria ma stabilendo quel dialogo “sano” cui si è accennato.


Broadcast Receiver 
è un componente che reagisce ad un invio di messaggi a livello di sistema con cui Android notifica l’avvenimento di un determinato evento, ad esempio l’arrivo di un SMS o di una chiamata o sollecita l’esecuzione di azioni. Questi componenti sono particolarmente utili per la gestione istantanea di determinate circostanze speciali.

Molto importante ricordare che una componente può attivarne un’altra mediante apposite invocazioni di sistema. Questa intenzione viene codificata con un Intent utilizzabile come normale classe Java ma che sottintende un potentissimo strumento di comunicazione di Android.

giovedì 15 gennaio 2015

[ANDROID] Alternative allo sviluppo nativo


Qualsiasi approccio alla programmazione Android, nativo o no, presenta dei pro e dei contro. Il nativo offre la possibilità di una gestione totale del dispositivo senza limiti, d’altra parte richiede spesso una programmazione molto professionale e si concentra esclusivamente su una piattaforma. Il non-nativo offre vantaggi vari, ascrivibili a volte ad una minore necessità di programmare e molto spesso alla possibilità di creare applicazioni cross-platform distribuibili su sistemi operativi diversi.

Alternative allo sviluppo non nativo sono:

- Apache Cordova e Steroids scaturiscono dal know-how nello sviluppo per Internet. Cordova è la versione open source del progetto PhoneGap e serve a realizzare le cosiddette app ibride con un’interfaccia realizzata in modalità web ma in grado di interfacciarsi con il sistema operativo mobile mediante un vasto numero di API. Steroids nasce per superare alcuni limiti riscontrati in PhoneGap ma senza “reinventare la ruota”, si basa infatti su Cordova ma approfondisce il legame con lo strato nativo.

- Corona SDK è un ambiente particolarmente versato alla gestione dell’interazione come per i videogiochi. Creato dai Corona Labs non necessità di alcuna conoscenza del linguaggio Java e propone come alternativa lo scripting in LUA, un formalismo dall’approccio molto semplice che permette di personalizzare maggiormente le proprie applicazioni.

- Unity è il più diffuso motore per videogiochi del mondoche combina editor visuale di altissimo livello ma anche programmazione in tecnologie ad oggetti avanzate come C# oltre che gestione di altri aspetti fondamentali per i videogiochi come grafica, animazione e fisica;

- AppInventor è probabilmente la possibilità più abbordabile per l’appassionato di tecnologia a digiuno di programmazione e che desidera qualche risultato piuttosto rapido. È stato creato dai Google Labs come strumento per la rapida modellazione di app Android ed è stato successivamente ceduto al prestigioso M.I.T.. Intuitività e semplicità le sue chiavi di lettura principali.

lunedì 5 gennaio 2015

[ANDROID] SDK e ambiente di sviluppo


La programmazione su Android necessita di due strumenti softwares:

- JDK, il kit di sviluppo per la tradizionale programmazione Java, visto che questa è la tecnologia con cui realizzeremo i nostri programmi;

- IDE (ambiente di sviluppo integrato) che includa possibilmente tutti gli strumenti necessari al programmatore. 

Alternative più comuni ed entrambe valide sono Eclipse e Android Studio, tutti quanti facilmente reperibili su Internet con download gratuiti
Il vero pacchetto di strumenti che ci permetterà di vedere realizzati i nostri programmi per Android è Android SDK.
Iniziamo innanzitutto ad installare Java. È necessario recarsi presso il sito Oracle e scaricarne una versione per il proprio sistema operativo, specificando non solo la tipologia – Windows, Linux, Mac OS o Solaris – ma anche la versione, 32 o, meglio se se ne ha la possibilità, 64 bit. Una volta eseguito il download del pacchetto si procede all’installazione.

Eclipse

Eclipse è uno strumento gratuito e molto flessibile, ben noto da tanti anni a varie comunità di sviluppatori. In particolare, la sua natura modulare l’ha reso molto ricco di funzionalità mediante vari plug-in installabili al suo interno oltre che utilizzabile nella programmazione con vari linguaggi, primo tra tutti Java, ma anche C/C++, PHP ed altro ancora. 
Nel caso di Android è disponibile un bundle ossia un pacchetto completo già dotato degli ADT (Android Developer Tools) e con Android SDK già disponibile. Il link da cui è possibile raggiungerlo è https://developer.android.com/sdk/index.html
La pagina che ci accoglie spiega subito che con un singolo download avremo a disposizione Eclipse, gli ADT e Android SDK già pronti per essere usati. Le versioni disponibili, come per il JDK, si riferiscono ad ogni possibile sistema operativo. 
Dopo il download – di un pacchetto piuttosto corposo di circa 500 MB – è sufficiente procederne alla decompressione.

Android Studio

Un’alternativa giovane (neanche un anno di vita) ma molto promettente è Android Studio, sponsorizzato direttamente da Google e pensato appositamente per Android. Si può ottenere dal seguente link http://developer.android.com/sdk/installing/studio.html, anch’esso è già inclusivo di Android SDK. 
Nonostante questo interessantissimo strumento non sia ancora arrivato alla versione 1.0 dimostra di accogliere volentieri tutto ciò che di più utile può esserci per lo sviluppatore Android. 
Gli elementi di Android Studio che spiccano maggiormente sono:

- l’utilizzo di Gradle come strumento di build automation, atto quindi ad accompagnare lo sviluppatore nelle fasi di build, sviluppo, test e pubblicazione della propria app;

- disponibilità di un gran numero di template per la realizzazione di applicazioni già in linea con i più comuni pattern progettuali;

- editor grafico per la realizzazione di layout, molto pratico e dotato di un ottimo strumento di anteprima in grado di mostrare l’aspetto finale dell’interfaccia che si sta realizzando in una molteplicità di configurazioni (tablet e smartphone di vario tipo).

Android SDK

Ultima nota, diamo uno sguardo più ravvicinato all’Android SDK. Come detto esso viene già reperito congiuntamente all’installazione di Android Studio o di Eclipse e sarà reperibile, in entrambi i casi, aprendo la cartella contenente l’installazione dell’IDE. Un aspetto molto importante è che questo SDK è costituito da molti strumenti – programmi, emulatori, piattaforme per ogni versione di Android e molto altro – la cui composizione non è immutabile ma viene gestita tramite il programma Android SDK Manager, avviabile sia da Eclipse che da Android Studio. 
Grazie al Manager, il programmatore potrà profilare le piattaforme e gli strumenti presenti nel SDK nella maniera più congeniale al proprio lavoro.