Seminario Sviluppo mobile su Android -...

51
Corso di Telecomunicazioni Wireless a.a. 2015-2016 Fondamenti di sviluppo mobile su Android © A. Tedeschi 2015/2016 1 Dott. A. Tedeschi [email protected]

Transcript of Seminario Sviluppo mobile su Android -...

Corso diTelecomunicazioni Wireless

a.a. 2015-2016

Fondamenti di sviluppo mobile su

Android

© A. Tedeschi 2015/2016 1

Dott. A. Tedeschi

[email protected]

• 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

© A. Tedeschi 2015/2016 3

DEMO

Demo

4

Android: La prima app

Recap

Creazione di un nuovo progetto

Android Studio -> Start a new Android Studio project

© A. Tedeschi 2015/2016

5

Android: La prima app

© A. Tedeschi 2015/2016

6

Android: La prima app

© A. Tedeschi 2015/2016

7

Android: La prima app

© A. Tedeschi 2015/2016

8

Android: La prima app

© 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

34

DEMO

Demo

© 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);

42

DEMO

Demo

© 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 49

DEMO

Demo

© 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

51

DEMO

Demo

© 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