Corso diTelecomunicazioni Wireless
a.a. 2015-2016
Fondamenti di sviluppo mobile su
Android
© A. Tedeschi 2015/2016 1
Dott. A. Tedeschi
• Fondamenti di programmazione Android
• Creare un nuovo progetto
• Struttura del progetto
• Struttura di un file apk
• Activity lifecycle
• Intent e la comunicazione tra activity e
applicazioni
• Emulatore
© A. Tedeschi 2013/2014
Outline
2
4
Android: La prima app
Recap
Creazione di un nuovo progetto
Android Studio -> Start a new Android Studio project
© A. Tedeschi 2015/2016
9
Android: La prima app
Recap
Creazione di un nuovo progetto:
Android Studio -> Start a new Android Studio project
Impostare opportunamente:
• I nomi dell’app, del progetto e in particolare del package(!).
NOTA
com.example.NAME è il nome di default del package è
consigliabile cambiarlo
• La versione minima e target delle API.
Ciò permette di definire la retrocompatibilità di un’app e le API
che possono essere adottate.
© A. Tedeschi 2015/2016
10
Android: Struttura del progetto
Organizzazione del progetto e struttura dei file
Android Studio propone diverse view come
accade per Eclipse ognuna delle quali ci permette
di visualizzare un determinato set cartelle e dati
Di default, alla creazione di un nuovo progetto
viene mostrata la vista Android project view, che:
• mostra una versione ridotta del progetto
mostrando solo i file e le cartelle principali
• Raggruppa i file di build per tutti i moduli in
un’unica cartella
• Raggruppa i file di manifest per ogni modulo
in un’unica cartella
© A. Tedeschi 2015/2016
Android Studio permette la gestione dei Moduli, che possono essere applicazioni (mobile devices, TV, …), librerie e test
11
Android: Struttura del progettogradle
• Si tratta di un prodotto di build automation diffuso nel
mondo Java. L’omonima cartella contiene i gradler-wrapper
file
.idea
• È la cartella in cui sono memorizzati i setting di IntelliJ IDEA
Nota: Android Studio si basa su IntelliJ
External Libraries
• Contiene al suo interno un set di librerie necessarie per lo
sviluppo dell’app.
• appcompat_v7
• Libreria di supporto auto-importata alla creazione di
un progetto in cui si crea un nuovo progetto
• Permette retrocompatibilità di elementi presenti nelle
recenti versioni, come ActionBar, utilizzabili dalla
versione 2.1 e superiori
• support-v4.jar permette l’utilizzo dei fragment dalla
versione 1.6 e superiori (info)
• design-23.1.0 libreria di supporto per la definizione di alcuni
elementi material design© A. Tedeschi 2015/2016
12
Android: Struttura del progetto
build
• Memorizza l’output della compilazione di tutti i moduli del
progetto
build.grade
• Permette di customizzare le proprietà per la compilazione
del sistema. Possibile usare le impostazioni di default
gradlew e gradlew.bat
• Startup script del gradel per i sistemi Unix e Windows,
rispettivamente
local.properties
• Permette di settare le proprietà specifiche del calcolatore
per fare la build del sistema, ad esempio il path della SDK
installata.
.iml
• File del modulo creato da IntelliJ IDEA per memorizzare le
informazioni sul modulo
settings.gradle
• Specifica i sotto-progetti da compilare© A. Tedeschi 2015/2016
13
Android: Struttura del progetto
assets
• Cartella base vuota
• È possibile utilizzarla per integrare nell’applicazione risorse
primarie, come: font custom, database sqlite per lo storage
dei dati, molteplici tipologie di file da utilizzare
nell’applicazione.
• Possibile navigare questa cartella come un file system
attraverso l’AssetManager
• Tale cartella non è inserita di default nella creazione del
progetto, va aggiunta manualmente (tasto destro sul nome
del progetto -> New -> Folders -> Assets Folder
output
• Directory di output della compilazione
• Al suo interno è presente il file .apk ottenuto dalla
compilazione del codice e delle risorse comprese quelle
contenute in assets
libs
• Cartella in cui è consigliato inserire le librerie private che
varranno impiegate nell’applicazione© A. Tedeschi 2015/2016
14
Android: Struttura del progetto
© A. Tedeschi 2015/2016
public static final class drawable {
public static final int
ic_launcher = 0x7f020000;
}
Classe responsabile
della Grafica
«Oggetto» grafico che
si vuole rappresentare
Valore numerico univoco
che identifica «l’oggetto»
Senza questo file Android non sarebbe in grado di effettuare le associazioni tra
gli elementi che compongono l’activity dal punto di vista grafico (layout,
immagini, bottoni, … ) e il codice Java dell’activity stessa.
R.java non va MAI modificato manualmente! È compito del compilatore
aggiungere o rimuovere classi o attributi. Quando si importa un progetto è
possibile che questo file non sia presente o non venga generato
correttamente -> fare Clean & Build del progetto manualmente
15
Android: Struttura del progetto
app
• Contiene il sorgente dell’applicazione non
solo in termini di codice Java ma anche di
gestione delle risorse
AndroidManifest.xml
• Generato automaticamente alla creazione del
progetto
• Permette la definizione:
• delle Activity per renderle utilizzabili dal
sistema
• nome dell’applicazione
• dei permessi, come accesso ad internet,
localizzazione, etc
© A. Tedeschi 2015/2016
16
Android Manifest
How to…
• Definire una activity in portrait<activity android:name="it.sp4te.MainActivity"
android:screenOrientation="portrait" />
• Impostare una activity come principale<activity
android:name="it.roma3.droidbike.SplashActivity"
android:screenOrientation="portrait" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category
android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
• Aggiungere un permesso<uses-permission android:name="android.permission.INTERNET" />
© A. Tedeschi 2015/2016
17
Android: Struttura del progetto
Java
• codice sorgente come le Activity
• logica di business dell’applicazione
res
• Contiene diverse tipologie di risorse, quali immagini,
layout, file xml per definire le stringhe statiche,
animazioni, ecc.
Gradle Scripts
• Al suo interno ci sono due file build.gradle:
uno generale per tutto il progetto ed uno più specifico
per ogni modulo che stiamo sviluppando
• build.gradle (Module: app) contiene al suo interno le
dipendenze e le configurazioni di default dell’app.
Ad esempio: minSdkVersion, targetVersion,
versionCode.
NOTA: queste informazioni sono state rimosse
dall’AndroidManifest alleggerendolo
© A. Tedeschi 2015/2016
18
Android: Struttura del progetto
drawable-LAYOUT
sono le cartelle in cui inserire la grafica in base alla
qualità dello schermo che si desidera supportare.
• Se la grafica non è definita per ogni risoluzione,
Android effettuerà il resize automatico a partire
dalla risoluzione più vicina a quella che deve
essere finita.
• Possibili effetti collaterali come immagini sgranate
o troppo piccole
• Le cartelle drawable a diverse risoluzioni non
sono create di default, ma possono essere create
values: contiene diversi file xml per la definizione
• stile dell’applicazione (style.xml)
• dimensioni di margini dei layout, widget (es.
TextView) o font (dimens.xml)
• definizione delle stringe statiche della
applicazione in una lingua di base scelta
(string.xml) © A. Tedeschi 2015/2016
19
Android: Struttura del progetto
anim
• Contiene file XML per la creazione e gestione delle
animazioni
color
• se necessario è possibile specificare colori non
standard non offerti da Android
xml
• Insieme di file XML che possono essere utili per la
configurazione di alcuni componenti
dell’applicazione
mipmap
• è la cartella per le icone dell’app e permette al
sistema di scegliere in base alla risoluzione del
dispositivo l’icona opportuna. Rimpiazza la cartella
drawable per le icone
raw
• Alternativa alla cartella assets. I file contenuti sono
gestiti dall’Android Asset Packaging Tool© A. Tedeschi 2015/2016
20
Android: Struttura del progetto
layout:
• contiene un insieme di file XML che
rappresentano l’interfaccia grafica
dell’applicazione.
• Attenzione layout permette la gestione della
grafica dell’applicazione ma spesso è necessarie
creare ulteriori cartelle dal nome layout-
RISOLUZIONE per gestire opportunamente una
data risoluzione.
menu
• Contiene un insieme di file XML relativi ai menu
impiegati nelle singole activity dell’applicazione.
• Prende il nome dell’activity se questa è creata
automaticamente.
• Dalla versione 3.0 serve per gestire anche le
ActionBar
© A. Tedeschi 2015/2016
22
Android: Emulatore
Contro
• Lento (a volte molto) specie con laptop non prestanti
• Presenta bug
• Le ultime versioni (API 17 e superiori) richiedono Intel HAXM (Hardware
Accelerator Execution Manager) per rendere più performante l’emulatore
attraverso la virtualizzazione (da attivare dal Bios) non sempre disponibile nei
propri laptop. Problema: se attivo Hyper-V, HAXM non viene installato e
l’emulatore non viene eseguito (per Windows, Mac, Linux). Soluzione: scegliere
quale dei due abilitare ogni volta oppure creare due opzioni di boot (guida)
Pro
• Possibilità di ricreare situazioni particolari, come la localizzazione, ricezione
chiamate e messaggi
• Permette la verifica del comportamento della nostra applicazione
• Possibilità di creare device con risoluzione, qualità di schermo e versione
dell’OS di nostro interesse al fine di testare la bontà dell’app dal punto di vista
di compatibilità. Android Studio offre template di dispositivi già pronti
all’utilizzo© A. Tedeschi 2015/2016
23
Android: Logcat
• Il termine Log indica la registrazione cronologica delle operazioni
man mano che vengono eseguite (Wikipedia).
• Il termine Cat indica un comando dei sistemi operativi Unix e Unix-
like che legge i file che gli sono specificati come parametri (o lo
standard input) e produce sullo standard output la concatenazione
del loro contenuto (Wikipedia).
• I due termini uniti formano Logcat che indica il tracciamento
cronologico delle operazioni con la relativa visualizzazione sullo
standard output del sistema.
Esempi reali:
• Lista della spesa
• Elenco delle chiamate ricevute ed effettuate, organizzate
secondo un ordine cronologico
© A. Tedeschi 2015/2016
24
Android: Logcat
• iI logcat non è altro che un insieme di informazioni che ci permettono di
ricordare o tracciare eventi nel passato
• Ad ogni informazione può essere associato un livello (o meglio filtro), in
modo da organizzare in modo gerarchico le informazioni. In particolare i
livelli sono i seguenti:
• V — Verbose (lowest priority)
• D — Debug
• I — Info
• W — Warning
• E — Error
• F — Fatal
• Tramite un analisi di questi dati e un apposito filtraggio per tag, PID o testo
è possibile individuare la causa di errori o malfunzionamenti
dell’applicazione.
© A. Tedeschi 2015/2016
Il logcat è nostro amico…
Imparare a usarlo salverà il nostro tempo…
© A. Tedeschi 2015/2016 25
Struttura *.apk
Un file apk (Android Package) contiene tutte le informazioni
necessarie per permettere l’esecuzione dell’applicazione creata
(sia su dispostivi che su emulatore)
© A. Tedeschi 2015/2016 26
Struttura *.apk – build process
• Android Asset Packaging Tool (aapt) prende le
risorse, come il manifest e gli xml, e li compila.
Questo passo genera il file R.java
• aidl tool converte ogni interfaccia .aidl presente
tra le interfacce Java
• Tutto il codice Java (comprese R.java e I file
.aidl) sono compilati restituendo file .class
• dex tool converte i file .class in bytecode della
Dalvik. Stessa cosa accade per le librerie incluse
nel progetto
© A. Tedeschi 2015/2016 27
Struttura *.apk – build process
• I file .dex, le risorse compilate e quelle non
compilate sono inserite nell’Android PacKaging
(apk)
• L’app viene firmata con la chiave di debug o di
release
• Se l’app è stata fermata con la chiave release è
necessario allineare l’apk con lo zipalign tool,
diminuendo l’uso della memoria quando
questa è in esecuzione
28
Activity
• Una activity in Android rappresenta una singola schermata di una
app con cui l’utente si interfaccia.
• Un’app ha una o più activity, ma solo una activity per volta può
essere visualizzata sullo schermo
• Una activity attraverso gli intent può richiamare altre activity
• Solo con alcuni tipi di device, come i Samsung Galaxy Note, è
possibile tenere aperte contemporaneamente più activity sullo
schermo
• Competitor: Microsoft Windows 8.1-10 offre la stessa opportunità.
© A. Tedeschi 2015/2016
29
Activity: lifecycle
• Le activity sono inserite in uno
stack, back stack gestisto tramie
LIFO
• Quando una Activity in running
richiama una nuova Activity,
viene messa in pausa e stoppata
• Il cambio di activity può anche
avvenire per mano dell’utente
(apre una nuova app) o a causa
di un evento esterno (es.
telefonata in arrivo)
• L’utente può ibernare o
ripristinare un’activity ma non
può chiuderla
• Terminazione gestita dal sistema
ed è trasparente al developer
© A. Tedeschi 2015/2016
30
Activity: lifecycle
© A. Tedeschi 2015/2016
Approfondimenti: link
31
Activity: lifecycle
© A. Tedeschi 2015/2016
Esempio di comportamento del back stack gestito secondo l’approccio
Last In, First Out (LIFO) (link)
• Quando un’activity corrente lancia una nuova activity, quella corrente viene messa in
cima alla pila.
• L’activity resta nella pila ed è stoppata
• Quando una activity viene stoppata, il sistema mantiene in memoria lo stato corrente
ad essa relativa
• Cliccando sul tasto back, l’activity corrente viene tolta dalla pila (e distrutta dal
sistema) ripristinando l’activity precedente
• Iterando quest’ultima operazione si arriva fino all’activity di partenza dell’applicazione
e se anche da qui viene cliccato il tasto back, si torna alla home deallocando del tutto
l’app
32
Activity: lifecycle
• protected void onCreate(android.os.Bundle savedInstanceState) Richiamato alla creazione dell’attività.
setContentView() per assegnare un layout all’interfaccia utente
L’argomento savedInstanceState serve per riportare un eventuale stato dell’attività
salvato in precedenza da un’altra istanza che è stata terminata.
L’argomento è null nel caso in cui l’attività non abbia uno stato salvato.
• protected void onStart() Segnala che l’attività sta per diventare visibile sullo schermo
• protected void onResume() Segnala che l’attività sta per iniziare l’interazione con l’utente
• protected void onPause() Segnala che l’attività non sta più interagendo con l’utente
• protected void onStop() Segnala che l’attività non è più visibile sullo schermo
• protected void onRestart() Segnala che l’attività sta per essere riavviata, causa precedente arrestato
• protected void onDestroy() Segnala che l’applicazione sta per essere terminata
© A. Tedeschi 2015/2016
33
Activity: lifecycle
Questi metodi:• Sono annotati con @Override
• possono essere riscritti dallo sviluppatore per
specificarne il comportamento.
• Non necessariamente devono essere specificati
tutti (fatta eccezione per OnCreate)
• Hanno come prima riga di codice il richiamo del
metodo di base che si sta sovrascrivendo
Es:@Override
protected void onResume() {
super.onResume();
//proprio codice
}
© A. Tedeschi 2015/2016
35
Intent
• Servono a comunicare ad Android che un certo evento sta per
avvenire.
• Spesso vengono utilizzati per il lancio di una Activity
• Descrivono l’azione che si desidera compiere e fornisce i dati che
vengono impiegati per compiere tale azione.
Possono essere:
• Espliciti: creazione e definizione della classe da eseguire
• Impliciti: viene specificata l’azione ma il destinatario non è noto.
Fondamentale per la collaborazione tra app diverse. Es:
l’apertura PDF può essere eseguita da diverse app.
36
Intent
• Impliciti: viene specificata l’azione ma il destinatario non è noto.
Fondamentale per la collaborazione tra app diverse
Ricerca di tutte le appcon il medesimo intentfilter
37
Intent
• Per passare da un’activity ad un’altra (modalità esplicità)
Intent intent = new Intent(this, FooActivity.class);startActivity(intent);
• Per far partire un’activity di cui non senza conoscere l’applicazione destinataria
(modalità implicita). Fondamentale il filtro ACTION_SEND che deve essere
presente e settato nell’applicazione destinataria.
Intent intent = new Intent(Intent.ACTION_SEND);startActivity(intent);
• Possibilità di creare AppChooser per permettere all’utente di scegliere con
quale app aprire l’oggetto inviato attraverso l’intent
38
Intent
• Ricezione di un intent implicito
• Necessario dichiarare uno o più intent filters all’interno del manifest
attraverso il tag <intent-filter>
• In ogni filtro si deve specificare
• action: dichiara il tipo di intent accettato, da specificare nell’attributo
«name»
• data: dichiara il tipo di dato accettato, usando uno o più attributi che
specificano i vari aspetti dell’URI (host, port, path, ecc) e il MIME type
• category: dichiara la categoria dell’intent accettato da specifiare
nell’attributo name.
• Esempio di intent filter che permette di ricevere un intent con
ACTION_SEND
<activity android:name="ShareActivity"><intent-filter>
<action android:name="android.intent.action.SEND"/><category android:name="android.intent.category.DEFAULT"/><data android:mimeType="text/plain"/>
</intent-filter></activity>
39
Intent
• Passaggio di dati tra due activity attraverso il metodo
putExtra(..) di Intent
intent.putExtra(name, value);startActivity(intent);
• Estrazione dei dati dall’activity di destinazione
Intent intent = getIntent();intent.getStringExtra(name)
40
Intent
Esempio di intent per inviare una mail
Intent intent= new Intent();
String[] recipients = new String[]{"[email protected]"};
intent.setAction(Intent.ACTION_SEND); intent.putExtra(Intent.EXTRA_TEXT, "testo da mostrare"); intent.putExtra(Intent.EXTRA_EMAIL, recipients); intent.putExtra(Intent.EXTRA_SUBJECT, "Oggetto Email"); intent.setType("text/plain");
startActivity(intent);
41
Intent
Esempio di intent per inviare aprire una pagine web del browser .
String url = "http://www.uniroma3.it";
Intent i = new Intent(Intent.ACTION_VIEW);
i.setData(Uri.parse(url));
startActivity(i);
Alternativamente
Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
startActivity(i);
© A. Tedeschi 2015/2016 43
Layout e grafica
Componente fondamentale dell’interfaccia grafica è la classe android.view.View
In generale un oggetto View• occupa una porzione rettangolare dello schermo
• è responsabile della creazione della grafica e della gestione degli
eventi della porzione di schermo assegnata
• è la classe alla base dei widget (Button, check box, textview, ecc)
Progettato il layout di una certa activity, ossia la View, è possibile
mostrarla all’utente finale dell’applicazione attraverso il metodo
della classe Activity
public void setContentView(View view)
© A. Tedeschi 2015/2016 44
Layout e grafica
FrameLayout
definito per bloccare in una certa area dello schermo un singolo oggetto. Non
sempre utilizzato perché non permette un buon adattamento alle altre
risoluzioni di schermo. Permette di aggiungere comunque dei nodi figli (widget
o altro) la cui posizione deve essere gestita opportunamente attraverso le
proprietà offerte da Android come android:layout_gravity
TableLayout
posiziona gli oggetti in righe e colonne, senza mostrare bordi. Una singola riga
è rappresentata da un oggetto di tipo TableRow in cui inserire i widget
© A. Tedeschi 2015/2016 45
Layout e grafica
RelativeLayout
consente ai figli di specificare la propria posizione relativamente alla View
genitore o ad altri figli. Offre un’ottima gestione nel posizionamento dei suoi
nodi attraverso opportune proprietà
LinearLayout
allinea tutti gli oggetti orizzontalmente o verticalmente a seconda del valore
dell'attributo orientation.
I figli sono posizionabili mediante la proprietà gravity.
Definisce due proprietà fondamentali weightsum da utilizzare all’interno del
LinearLayout e weight da usare su i figli. Tramite queste è possibile posizionare
gli elementi del layout affinché occupino sempre la medesima posizione nelle
schermate.
© A. Tedeschi 2013/2014 46
Layout e grafica
<?xml version="1.0" encoding="utf-8"?><RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"android:layout_height="match_parent"android:background="@android:color/black">
//QUI VANNO INSERITI GLI ELEMENTI CHE SI DESIDERA MOSTRARE ALL’UTENTE
</RelativeLayout>
Esempio di definizione di un layout
© A. Tedeschi 2013/2014 47
Layout e grafica
Widget componenti di base per l’interazione con l’utente
Ne esistono diversi e sono tutti disponibili al programmatore attraverso il
package android.widget
<ImageViewandroid:id="@+id/androidsplash"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerHorizontal="true"android:layout_marginBottom="5dp"android:contentDescription="@string/empty"android:src="@drawable/android" />
<TextViewandroid:id="@+id/splash"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerInParent="true"android:paddingLeft="20dip"android:paddingRight="20dip"android:text="@string/splashtext"android:textColor="@android:color/white"android:textSize="25sp" />
Estendono la classe View
Possono essere creati da codice Java o
da file xml.
Sono definiti da proprietà
(android:nomepro=valore) che ne
definiscono la posizione, la grandezza,
il colore, ecc.
La possibilità di accesso ad alcune
proprietà dipende dal tipo di Layout
scelto
© A. Tedeschi 2013/2014 48
Layout e grafica
I widget e i layout permettono adottano delle unità di misura per
stabilire lo spazio occupato o la grandezza del font
Queste sono rappresentate dai seguenti acronimi
• px = pixel, attuali sullo schermo
• sp = scale-independent pixels
• adottato per la dimensione del font
• dip | dp = Density-independent pixels
• si basa sulla desità fisica dello schermo
• 1 px = 160dp, tale rapporto cambia in base alla densità
dello schermo
• È adottato per definire le grandezze delle immagini, del
padding, del layout, ecc
© A. Tedeschi 2013/2014 50
Layout e grafica
ProblemaA causa della molteplicità dei dispositivi mobili in circolazione (oltre i 2000 con
caratteristiche hardware e software differenti tra loro) è necessario gestire
opportunamente la grafica.
Soluzione• Creare opportunamente il layout grafico principale adottando il RelativeLayout
ove possibile e necessario
• Supportare le diverse soluzioni di schermo, creando nuovi layout con layout-
RISOLUZIONE. Es: layout-ldpi
• Supportare le diverse versioni della piattaforma Android
• Popolare opportunamente le cartelle drawable-RISOLUZIONE, che differiscono
tra loro per la risoluzione dell’immagine
Il sistema automaticamente in base alla caratteristiche del dispositivo selezionerà il
layout e le immagini opportune per garantire la migliore esperienza utente.
Approfondimentihttp://developer.android.com/guide/practices/screens_support.html
© A. Tedeschi 2013/2014 52
App Multilingua
Per creare un’applicazione multilingua è necessario compiere i seguenti
passi:
• Definire opportunamente in lingua inglese il contenuto del file
string.xml presente nella cartella values
• Creare una o più cartelle values-LINGUA, dove LINGUA è
l’abbreviazione della lingua che si desidera supportare es: Italiano =
it; Spagnolo = es; ecc…
• Copiare e incollare il file string.xml presente in values e incollarlo
all’interno della cartella values-LINGUA che avete creato.
• Aggiornate opportunamente il file con i valori corretti di lingua.
Android automaticamente riconoscerà che l’applicazione supporta più
lingue e pertanto selezionerà la lingua che corrisponde con quella del
telefono.
Se così non fosse Android utilizzerà la lingua di default, ossia l’inglese.
NOTA: quanto descritto è valido solo per contenuti testuali statici