Il 0% ha trovato utile questo documento (0 voti)
16 visualizzazioni46 pagine

Slides 2017

Il documento presenta un corso di programmazione mobile Android tenuto dal Prof. Roberto De Prisco presso l'Università di Salerno per l'anno accademico 2017-2018. Vengono forniti dettagli sul programma del corso, le modalità di contatto con il docente, e le risorse didattiche disponibili, oltre a informazioni su un contest per le migliori app sviluppate dagli studenti. Il corso coprirà vari argomenti, tra cui layout, networking, e utilizzo di Android Studio.

Caricato da

donmatteo
Copyright
© © All Rights Reserved
Per noi i diritti sui contenuti sono una cosa seria. Se sospetti che questo contenuto sia tuo, rivendicalo qui.
Formati disponibili
Scarica in formato PDF, TXT o leggi online su Scribd
Il 0% ha trovato utile questo documento (0 voti)
16 visualizzazioni46 pagine

Slides 2017

Il documento presenta un corso di programmazione mobile Android tenuto dal Prof. Roberto De Prisco presso l'Università di Salerno per l'anno accademico 2017-2018. Vengono forniti dettagli sul programma del corso, le modalità di contatto con il docente, e le risorse didattiche disponibili, oltre a informazioni su un contest per le migliori app sviluppate dagli studenti. Il corso coprirà vari argomenti, tra cui layout, networking, e utilizzo di Android Studio.

Caricato da

donmatteo
Copyright
© © All Rights Reserved
Per noi i diritti sui contenuti sono una cosa seria. Se sospetti che questo contenuto sia tuo, rivendicalo qui.
Formati disponibili
Scarica in formato PDF, TXT o leggi online su Scribd
Sei sulla pagina 1/ 46

9/25/17

Slide
per favore … 2
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

Prof. Roberto De Prisco


An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

… o almeno … e … NON RISPONDERE!!!!


(ex BDSIR)
1 Scrivere un app che metteil silenzioso il lun 14:00-16:00 e mer 09:00-11:00

Slide Slide
Info corso 3 Vendite per OS 4
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

• Prof. Roberto De Prisco


– studio: 4° piano, studio 58
• numerazione Dip. di Informatica
[email protected]

• Orario lezioni
– Lunedì 15:00-17:00 Aula F8
– Giovedì 14:00-16:00 Aula F8

• Ricevimento
– Martedì 11:00-13:00
– Giovedì 16:00-17:00

Slide Slide
Vendite per OS 5 Telefoni android prodotti da 6
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

ed altri …

1
9/25/17

Slide Slide
Vendite per marca 7 Altre motivazioni 8
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

• Ambiente di sviluppo (Android Studio)


– facile da istallare
– molti tools per lo sviluppo di app

• Istallazioni delle app


– facile
– non richiede nessuna registrazione

• Moltissime risorse online

Slide Slide
Cosa faremo nel corso 9 Cosa faremo nel corso 10
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

Impareremo a scrivere app per Android!!!

Vedremo tutto ciò che serve per scrivere app …

Slide Slide
Argomenti 11 Risorse didattiche 12
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

• Layout • Lezioni!!!!
• Listener • Google
• Intent – http://developer.android.com
• Permessi – http://developer.android.com/guide
• Piattaforma Android – http://developer.android.com/training
• Alarms
• Android Studio • Books
• Frammenti
• Emulatore – BigNerd Ranch (in inglese)
• Networking – http://www.bignerdranch.com/
• Grafica • Cursera
• Sensori – ottimo video corso (in inglese)
• Multimedia – https://www.coursera.org/course/android
• Data storage • Googling!

2
9/25/17

Slide Slide
Sito e piattaforma S3 13 Contest 14
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

• La migliore app sviluppata DURANTE il


• Sito http://www.di-srv.unisa.it/~robdep/MP/ corso verrà premiata con un dispositivo
Android!
– Informazioni
– Per partecipare occorre
– Annunci • frequentare il corso
– Codice app • sviluppare in gruppi di 2 persone max
• consegnare l’app una settimana prima dell’ultima
lezione del corso
• S3 • app di una certa complessità
– Esami
– Risultati • Sponsorizzato da eTuitus
– www.etuitus.it
– commissione: docente, eTuitus

Slide Slide
Contest – albo d’oro 15 Esame 16
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

• L’app sviluppata per il contest verrà valutata per


• 2016: Fabricio Madaio l’esame
• Bizarre 3D Pong
– non sostituisce la prova di laboratorio

• 2015: Raffaele D’Arco


• Esame
– ShootTheFruits – Scritto
– Laboratorio
• vengono ammessi gli studenti che superano lo scritto
– Orale a discrezione del docente
• 2014: Carmelo Orlando
• svolto in caso di dubbi sulla autenticità delle prove
– AIR Orari Linee precedenti

Slide Slide
Come contattare il docente 17 Domande? 18
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

• Fine lezione (o nella pausa)


• Orario di ricevimento studenti
– Mer 11:00-13:00
– Ven 11:00-13:00

• Email
– Risposta non garantita, dipende dalla domanda!
– Condizione necessaria: il messaggio deve contenere
il nome del mittente
– Appuntamento

• NON telefonare

3
9/25/17

Slide
La piattaforma Android 20
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

• Sistema software per telefonini e tablet


An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8
– OS kernel
– Librerie di sistema
– Framework per le applicazioni
– Applicazioni di base
La piattaforma Android • SDK per lo sviluppo di nuove applicazioni
– librerie
– tool di sviluppo
– documentazione
• manuali
• esempi http://developer.android.co m/tra ini ng
19

Slide Slide
L’architettura Android 21 Linux kernel Layer 22
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

• Fornisce i servizi di
base del sistema
operativo
– filesystem
– gestione della memoria e dei processsi
Si basa su un – gestione dell’interfaccia di rete
kernel Linux – drivers per le periferiche
• Servizi specifici per Android
– gestione della batteria
– gestione della memoria condivisa
– low memory killer
– interprocess communication e altre

Slide Slide
Hardware Abstraction Layer 23 Java 24
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

• App Android sono scritte in Java


• La libreria fornisce molte classi pronte per l’uso:
– classi di base: java.*, javax.*
• HAL: Hardware Abstraction Layer
– classi per le app: android.*
– Interfacce standard per esporre le capacità hardware
ai servizi di livello superiore – Internet/web services: org.*
• Audio – Unit testing: junit.*
• Bluetooth
• Fotocamera
• Sensori
• …

4
9/25/17

Slide Slide
File dex e ART 25 Android runtime: ART e Dalvik VM 26
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

• App:
– Scritte in Java
– Compilate in file Java Bytecode
– Un tool, DX, trasforma i file bytecode in un singolo
file Dex Bytecode (classes.dex) • ART: Android Runtime è una VM specifica per sistemi Android
– CPU meno veloci (rispetto ad un PC)
– Il file classes.dex contiene anche tutte i file di dati – Meno RAM
necessari e viene istallato sulla target device – Batteria con durata limitata
– ART Virtual Machine esegue il file Dex
• ART: da 5.0 API level 21
• Dalvik: API level < 21
• App che funzionano bene su ART dovrebberofunzionare bene
anche su Dalvik
– Il contrario no

Slide Slide
Librerie native 27 Application framework 28
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

• Tutte le funzionalità del s.o. Android vengono esposte tramite


un API
– View System
• Molte componenti Android necessitano di • fornisce gli elementi di base per le interfacce utente
librerie native – icone, testo, bottoni, ecc.
– Content Providers
– Webkit • Per accedere a dati di altre app, per es. ai contatti della rubrica
– Libc – Package manager
• gestisce l’istallazione delle app sul dispositivo mobile
– openGL ES – Activity Manager
–… • gestisce il ciclo di vita delle applicazioni
• permette di passare da un’applicazione all’altra

Slide Slide
Applicazioni (app) 29 Versioni 30
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

Dati aggiornati a luglio 2017


API Nome Verisone % 100%
10 Gingerbread 2.3 0.8%
15 Ice cream Sandwich 4.0 0.8%
• Applicazioni già presenti nel sistema 16 Jelly Bean 4.1 3.1%
17 4.2 4.4%
– Home: Main screen
18 4.3 1.3%
– Contatti 19 Kit Kat 4.4 18.1%
– Telefono 21 Lollipop 5.0 8.2%
– Browser 22 5.1 22.6%
– Email client 23 Marshmallow 6.0 31.2%
– Media player 24 Nougat 7.0 8.9%
25 7.1 0.6% 0%
– … altre
• Ovviamente … si possono scrivere nuove app! Versione 8.0? Annunciata per fine2017

5
9/25/17

Slide
Android Studio 32
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

• Istallare l’ADT
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

• L’interfaccia
Android
Developer • L’emulatore Android

Tools • Strumenti per il debug

• Altri strumenti
31

Slide Slide
Istallazione ADT 33 Android Studio 2.3 34
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

http://developer.android.com/sdk • Richiede:
– Java 8
– Intel Hardware Accelerated Execution Manager
HAXM (per l’emulatore)

• Offre
– Piattaforma Android
– Android SDK Tools
• sviluppo
• debug
– Gradle
– Emulatore Android
è necessario avere Java 8 istallato e per l’emulatoreIntel HAXM

Slide Slide
Modalità sviluppatore 35 Listeners 36
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

• Modalità sviluppatore • Gli oggetti della classe View hanno dei metodi
– Info dispositivo, Versione build “listeners”
• Click 7 volte – sono in “ascolto” per entrare in azione quando si
verifica un evento specifico
• Comparirà il menu Opzioni Sviluppatore
• Ad esempio
• Debug USB – un pulsante ha il metodo onClickche viene eseguito
– Attivare quando l’utente preme il pulsante
– Dare il consenso per l’accesso

6
9/25/17

Slide Slide
Prima app: CiaoMondo 37 CiaoMondo 38
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

• Visualizza un saluto al mondo! • Manifesto


– informazioni generali sull’app
• permessi, attività, icona, …

Icona: New→Image Asset Creator


• Java
– file sorgenti
• res, risorse
CiaoMondo – drawable
• Vediamo – layout
– il codice – values
• Scriviamo l’app! – menu
– Tour di Android Studio – mipmap

Slide Slide
CiaoMondo 39 SDK 40
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

• Gradle • Android SDK Manager


– build system

• Informazioni
– dipendenze da altro codice

dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:22.1.1'
}

– altre informazioni su come compilare

buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}

Slide Slide
SDK 41 Emulatore Android 42
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

• Occorre istallare le versioni per le quali si vuole • Android Virtual Device Manager
sviluppare

7
9/25/17

Slide Slide
Emulatore vs. real device 43 Emulatore 44
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

• Real device • telnet


veloce, facile gestire l’input (es. rotazioni display)
l’esecuzione è reale Attivare modalità sviluppatoree debug USB!!!
7 click su Info dispositivo→Versione build
Poi attivare USB debug in opzioni sviluppatore
• Emulatore
lento (a volte molto), alcune operazioni sono
difficoltose
è comunque un “simulatore”
possono esserci dei bug
Facile creare situazioni particolari:
• batteria scarica
• arrivo di un messaggio

Slide
Emulatore 45
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

• Comunicazione fra due emulatori


An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

“numero di telefono”: 5556 “numero di telefono”: 5554

Layouts
Non è possibile lanciare due istanze della stessa AVD: occorre creare due AVD
diverse e lanciare un’istanza di ognuna.
Layout
46

Slide Slide
Layouts 47 Layouts 48
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

• Layout • XML
– Definiscono l’aspetto grafico dell’interfaccia utente – vantaggi
• facile da specificare
• separa in modo netto la definizione dell’UI dal codice
• Si possono definire in due modi dell’applicazione (facile fare modifiche)

– Con un file XML – svantaggi


• elementi statici
– In modo programmatico*
• Programmatico
• Non sono mutuamente esclusivi – vantaggi
– si possono usare in sinergia • dinamico, si può facilmente adattare
– svantaggi
*programmaticamente, nel gergo Android, significa attraverso delle istruzioni nel • dobbiamo gestire il layout nel codice dell’applicazione
programma (eseguite a runtime), quindi sono utili per gestire layout dinamici

8
9/25/17

Slide Slide
Layout – elementi base (esempi) 49 Layout - ViewGroup 50
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

• TextView • Gruppi di altri elementi


<TextView android:id="@+id/text"
– sia di base che altri gruppi
android:layout_width="wrap_content" Ciao, sono un TextView Linear Layout orizzontale
android:layout_height="wrap_content"
android:text=”Ciao, sono un TextView" />
• Linear Layout
– orizzontali e verticali

• Button
• Relative Layout
<Button android:id="@+id/button"
android:layout_width="wrap_content"
• Grid Layout (griglia)
android:layout_height="wrap_content" Ciao, sono un Pulsante • Frame (contenitore)
android:text=”Ciao, sono un Pulsante"
android:background=”#00FF00” />

Slide Slide
Layout - XML Un solo elemento 51 Layout - XML - attributi 52
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco
“radice” in ogni file XML Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

<?xml version="1.0" encoding="utf-8"?>


• Ogni elemento (View o ViewGroup) supporta
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/andro id" degli attributi
android:layout_width="fill_parent" – specificano l’aspetto grafico
android:layout_height="fill_parent" – specificano dove visualizzare l’elemento
android:orientation="vertical" >
<TextView android:id="@+id/text"
– forniscono informazioni
android:layout_width="wrap_content"
android:layout_height="wrap_content"
• Es. TextView
android:text="Hello, I am a TextView" />
<Button android:id="@+id/button"
– textSize
android:layout_width="wrap_content" Elementi arbitrari
android:layout_height="wrap_content" contenuti nell’elemento
radice
• Alcuni attributi sono comuni a tutti gli elementi
android:text="Hello, I am a Button" />
</LinearLayout> – altri sono specifici

Slide Slide
Layout - XML - attributi 53 Layout - XML - attributi 54
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

• ID (creazione) • Layout parameters


android:id="@+id/text" – layout_something
@: il resto della stringa deve essere interpretato
• android:layout_width="30px"
– se non c’è @ il valore è quello letterale • Ogni View ha dei parametri di layout
+: specifica che stiamo creando (aggiungendo) un – appropriati per il ViewGroup a cui la View appartiene
nuovo identificatore (id) il cui nome è text
– alcuni sono comuni a tutti i tipi di View
• layout_width
• layout_height
• ID (riferimento) – altri hanno significato solo per alcuni tipi
android:id="@id/text" • layout_alignParentTop
senza il + è un riferimento ad un ID esistente

9
9/25/17

Slide Slide
Layout – posizione e grandezza 55 Layout – padding e margini 56
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

• Una view è un rettangolo (0,0)


android:background="#CCDDEE"
– posizione: angolo in alto a sinistra 50px

– dimensione: larghezza ed altezza 40px


30px

android:layout_padding="10px"
12px

• Posizione (relativa al parent) android:layout_margin="10px"


– determinata dal layout
• Dimensione
– android:layout_width="30px" android:layout_padding="10px"
android:layout_margin="10px"
– android:layout_heigth="12px"
– android:layout_width="match_parent"
– android:layout_heigth="wrap_content" Un Button per default ha un’altezza minima di 48dp

Slide Slide
Misure pixel: px vs. dp 57 Misure Pixel 58
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

• Screen size
– grandezza reale del display (es. 4’’)
• Screen density
– Quanti pixel ci sono nell’unità di area
• raggrupppati in: low, medium, high e extra high
• es 240 dpi = 240 dot-per-inch

• px = pixel reali
– es. 240 dpi x 4’’ => 960 pixel
• dp (dip) = density independent pixels
– dimensione calcolata su una densità di 160 dpi
• un “dp” ha le dimensioni di un “px” a 160 dpi
– la dimensione non dipenderà dalla densità reale

Slide Slide
Alternative per i “drawable” 59 Unità di misura 60
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

• Una buona app dovrebbe fornire alternative per gli • dp, density-independent pixels
oggetti da disegnare (drawable)
• sp, scale-independent pixels
• Esempio: l’icona dell’applicazione dovrebbe essere – scalato in base alle preferenze dell’utente sulla
fornita in 4 versioni: grandezza del font
– 36x36 pixel per display con densità low • pt, points (1/72 di inch)
– 48x48 pixel per display con densità medium
– 72x72 pixel per display con densità high • px, real pixels
– 96x96 pixel per display con densità extra high • mm, millimetri
• Tutte le immagini in 4 versioni • in, inches
– Da Android 4.3, directory mipmap
• MIP, Multum In Parvo (molto in poco)

10
9/25/17

Slide Slide
Layouts – Linear Layout 61 Layouts – Linear Layout 62
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

<?xml version="1.0" encoding="utf-8"?>


• Posiziona gli elementi uno dopo l’altro <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width=”match_parent"
android:layout_height=”match_parent"
(linearmente) android:paddingLeft="16dp"
android:paddingRight="16dp"
android:orientation="vertical" >
• Orientazione: <EditText
android:layout_width=”match_parent"
android:layout_height="wrap_content"
– android:orientation="vertical" android:hint="@string/to" />
<EditText
– android:orientation="horizontal" android:layout_width=”match_parent"
android:layout_height="wrap_content"
android:hint="@string/subject" />
<EditText
android:layout_width=”match_parent"
android:layout_height="0dp"
• In ogni figlio: android:layout_weight android:layout_weight="1"
android:gravity="top"
– peso che determina quanto spazio il singolo android:hint="@string/message" />
<Button
android:layout_width="100dp"
elemento prende nel Linear Layout android:layout_height="wrap_content"
android:layout_gravity="right"
android:text="@string/send" />
</LinearLayout>

Slide Slide
Layouts – Linear Layout 63 Layouts – Relative Layout 64
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

• LL in cui i figli si dividono equamente lo spazio: • La posizione degli elementi è “relativa”


– verticalmente: – al layout padre
android:layout_height="0dp"
android:layout_weight="1” – agli altri elementi del layout
– orizzontalmente:
android:layout_width="0dp"
android:layout_weight="1”
• Esempi
– android:layout_alignParentTop=”true"
– android:layout_centerVertical=”true"
• Non viene lasciato spazio vuoto – android:layout_below=”@id/other_object"
– Se lo si vuole si devono inserire degli elementi fittizi
– android:layout_toRightOf=”@id/other_object”
– Es. Frame vuoti

Slide Slide
Layouts – Relative Layout 65 Layouts – Grid View 66
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

<?xml version="1.0" encoding="utf-8"?>


<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
• Visualizza un insieme di elementi
android:layout_width="match_parent"
android:layout_height="match_parent” > – numero totale variabile
<TextView
android:id="@+id/textView1" – visibile solo una parte
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
– scroll
android:layout_centerVertical="true"
android:text="Al centro” />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content" • Adapter
android:layout_below="@id/textView1"
android:layout_centerHorizontal="true" – fornisce gli elementi da inserire nel Grid View
android:text="Button1" />
<Button
android:layout_width="wrap_content"
• lo vedremo in seguito
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:text="Button2" />
</RelativeLayout>

11
9/25/17

Slide Slide
Layouts – Grid Layout 67 Layouts – List View 68
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

<GridLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content" • Visualizza un insieme di elementi organizzati in
android:background="#abcdef"
android:columnCount="3" una lista
android:rowCount="3” >
<Button – numero totale variabile
android:background="#aa55ee"
android:id="@+id/button1" – visibile solo una parte
android:text="Button 1" />
<Button
– scroll
android:id="@+id/button2"
android:text="Button 2" />
<Button
android:id="@+id/button3" • Adapter
android:layout_column="2"
android:layout_row="2" – fornisce gli elementi da inserire nel List View
android:text="Button 3" />
• lo vedremo in seguito
<Button
android:id="@+id/button4"
android:text="Button 4" />
</GridLayout>

Slide
Layouts - widget 69
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

• TextView
• Button An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

• TextEdit
• ImageView La nostra


CheckBox
RadioButton
prima
• … e molti altri (vera) app
– es. Orologio

Layouts 70

Slide
Prima app 71
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

• Calcolatrice
– Una sola “Activity” An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

– Pulsanti
• Listeners
– TextView
Android Studio
Debugger
Calcolatrice
72

12
9/25/17

Slide Slide
Copiare un intero progetto 73 Android Studio Debugger 74
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

• Fare una copia della directory • Permette


– Rinominarla con NuovoNome
– Eseguire un’app in modalità “debug”
• Aprire NuovoNome in Android Studio
• Sia con l’emulatore che con una device reale
• Rinominare package e directories
– Right-click sul package, Refactor>Rename – Inserire dei “breakpoints”
• Rinomina directory • Esaminare il valore delle variabili
• Nel file build.gradle – Esecuzione “passo-passo”
– Rinominare ApplicationId (vecchionome->nuovonome)
• Nel manifesto
– Rinominare package (vecchionome->nuovonome) • LLDB
• Nel file strings.xml – Se c’è codice C/C++ viene usato anche il debugger
– <string name="app_name">NuovoNome</string> LLDB
• Clean, Rebuild – Useremo solo il debugger Java

Slide Slide
Android Studio Debugger 75 Android Studio Debugger 76
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

• Build variant • Si apre la finestra di debug


– Deve essere “debuggable” – CMD-5
• Build>Select Build Variant

• Per lanciare l’app in modalità debug


– Run>Debug (CTRL-ALT-D)
– icona

• Selezionare la device

Slide Slide
Breakpoints 77 Comandi debugger 78
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

• Per inserire/eliminare breakpoints • Valuta una espressone


– Click a destra del numero di riga
• Esecuzione di una singola istruzione

• Entra all’interno di una funzione

• L’esecuzione si fermerà ad ogni breakpoint • Esci dalla funzione


– Possiamo controllare lo stato della memoria
– Continuare l’esecuzione passo-passo, etc. • Riprendi l’esecuzione fino al prossimo
breakpoint

13
9/25/17

Slide Slide
Debugger 79 Messaggi di log: Log.X 80
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

• Ispezione • private static final String TAG = "MyActivity”;


– Frames, stack delle chiamate
– Variables, valori memoria
– Wacthes • Log.x(TAG, “messaggio”);

• x può essere
– d: debug
– e: errore
– i: info
– w: warning
– v: verbose

Slide Slide
Monitor 81 Logcat 82
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

Video capture • Logcat • Crash: stack trace


– Messaggi di log – Fa vedere
Screenshot
• Monitors • la linea di codice che ha causato l’errore
• lo stack delle chiamate
– Uso memoria, CPU, rete e GPU

Slide
Widgets 84
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

Widgets

Widgets

83

14
9/25/17

Slide Slide
ListView 85 ListView 86
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

• Widget specifico per le liste • Lista semplice


<ListView
– divide l’area disponibile in varie posizione android:id="@+id/mylistview”
• il numero dipende dall’area disponibile e dalla grandezza di ogni android:layout_width="wrap_content"
elemento android:layout_width="wrap_content”
</ListView>

• Gli elementi vengono memorizzati in un array • File xml per il singolo elemento della lista
– solitamente sono di più rispetto alle posizioni disponibili <?xml version="1.0" encoding="utf-8" ?>
nel widget <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent” android:layout_height="match_parent”>
– Si può “scorrere” la lista <TextView
android:id="@+id/textViewList"
android:layout_width="wrap_content"
• Adapter android:layout_height="wrap_content"
android:text="" android:padding="10dp"
– fornisce gli elementi da visualizzare in base allo android:textSize="22dp"/>
scorrimento effettuato dall’utente </LinearLayout>

Slide Slide
ListView 87 ListView 88
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

• Definire l’array con gli elementi • Definire un listener per i click sugli elementi
– String [] array = {"Pasquale","Maria","Michele","Antonella", "Vincenzo",
"Teresa", "Roberto", "Rossella", "Antonio", "Luca", "Liliana", "Stefania",
"Francesca", "Andrea", "Marco", "Elisa", "Anna", "Lorenzo"};
listView.setOnItemClickListener(new OnItemClickListener() {

• Definire un adapter @Override


– ArrayAdapter<String> arrayAdapter = public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
new ArrayAdapter<String>(context, R.layout.list_element,
R.id.textViewList, array); String str = listView.getItemAtPosition(position).toString();
// Fai qualcosa con l’elemento
• Individuare il widget listview …
– listView = (ListView)findViewById(R.id.mylistview); …
}
});
• Associare l’adapter al widget
– listView.setAdapter(arrayAdapter);

Slide Slide
ListView 89 ListView 90
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

• ListView semplice • Per personalizzare gli elementi


– Ogni elemento è una stringa – il file di layout!
– CustomAdapter
• ListView personalizzato
– Ogni elemento ha un proprio layout con dei • Per il click multiplo
sottoelementi – non possiamo più usare il listener del listview
• es. nome, cognome, telefono, foto • funziona per tutto l’elemento
– Il click è però su tutto l’elemento – listeners ad-hoc per ogni elemento
• problema: non sappiamo più in quale posizione dell’array
siamo!!!
• ListView personalizzato con click multiplo
• trucchetto per risolverlo: setTag, getTag
– si possono cliccare i singoli elementi

15
9/25/17

Slide
ListView 91
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

ListaCustom
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

Ciclo di vita

ListaSemplice ListaCustomMClick 92

Slide Slide
Ciclo di vita delle attività 93 Ciclo di vita delle attività 94
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

• Ogni “Activity” ha un ciclo di vita

Attività non esiste


1. onCreate()
2. onStart()
3. onResume()
Attività in esecuzione
4. onPause()
5. onStop()
6. onDestroy()
Attività non esiste

• Eseguiti secondo un determinato schema

Slide Slide
Ciclo di vita delle attività 95 Ciclo di vita delle attività 96
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

• Quando l’utente preme il pulsante “Home”


– vengono chiamate
• onPause()
• onStop()

• Quando si ritorna all’attività


– vengono chiamate
• onRestart()
• onStart()
• onResume()

16
9/25/17

Slide Slide
Ciclo di vita delle attività 97 onSaveInstanceState 98
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

• Quando l’utente ruota il dispositivo • Si salva lo stato in onSaveInstanceState()


– l’attività viene prima eliminata: @Override
public void onSaveInstanceState(Bundle savedInstanceState) {
• onPause() // Salvare lo stato dell’app
savedInstanceState.putStringArrayList("LISTA_STRINGHE", array_di_stringhe);
• onStop() savedInstanceState.putInt("CONTATORE", counter);
// Always call the superclass so it can save the view hierarchy state
• onDestroy() super.onSaveInstanceState(savedInstanceState);
– e poi ricreata: }

• onCreate()
• Lo si recupera in onCreate()
• onStart()
@Override
• onResume() protected void onCreate(Bundle savedInstanceState) {

if (savedInstanceState != null) {
array_di_stringhe = savedInstanceState.getStringArrayList("LISTA_STRINGHE");
• onDestroy(): perdita dello stato!!!! counter = savedInstanceState.getInt("CONTATORE");
}
}

Slide Slide
Main activity 99 Ciclo di vita delle attività 100
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

<activity android:name=".MainActivity" android:label="@string/app_name">


<intent-filter>
• App Calcolatrice
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
– Cosa succede se ruotiamo il dispositivo?
</intent-filter>
</activity>

ActivityLifeCycle Correggere l’errore nell’app Calcolatrice

Slide Slide
Backstack 101 Backstack 102
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

• Un’app normalmente è fatta di più activity • Un’attività può lanciare un’altra attività
– ogni activity ha uno specifico compito – anche attività che appartengono ad altre app
• modularità

• Class “Intent”
• Es. un’app per la posta elettronica – serve a lanciare una nuova attività e “passare” i dati
– un’attività per la scrittura del messaggio all’attività che si lancia
– un’attività per spedire il messaggio – la vedremo fra poco
– un’attività per vedere una lista dei messaggi
– un’attività per vedere il contenuto di un messaggio • Task
– ecc. – è un insieme di attività con cui l’utente interagisce

17
9/25/17

Slide Slide
Backstack 103 Backstack 104
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

• Più attività possono coesistere, vengono


organizzate in un backstack

• Solitamente un task parte dall’Home screen


– l’utente clicca un’icona e lancia un’attività
– l’applicazione viene mostrata sulla schermo
• gergo tecnico: viene portata in “foreground”

• Se vengono lanciate nuove attività


– l’attività corrente viene messa nel backstack
– l’utente ci può tornare con il pulsante Back
• Continuando a premere Back si ritorna all’Home screen

Slide Slide
Foreground e background 105 Istanze multiple 106
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

• Un task con le sue attività può essere spostato in • Se un’attività può essere lanciata da più di
“background” un’altra attività si possono avere istanze multiple
– quando l’utente inizia un nuovo task oppure preme il
pulsante Home
– Le attività vengono messe in stato di stop, ma il loro
backstack rimane intatto

MultiActivity

http://developer.android.com/guide/components/tasks-and-back-stack.html

Slide
VisualizzaMappa 107
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

• Un’app che usa attività di altre app


– permette di inserire un indirizzo An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

• L’indirizzo può essere preso dalla


rubrica
– sfrutta un’attività della rubrica Intent
– permesso per leggere la rubrica!!!

• Visualizza la mappa
– sfrutta un’attività dell’app VisualizzaMappa
GoogleMaps 108

18
9/25/17

Slide Slide
Classe Intent 109 Intent 110
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

• Intent • Parti principale di un oggetto Intent


– Action: l’azione da svolgere
– è una descrizione (astratta) di un’operazione da • es. ACTION_VIEW, ACTION_EDIT, ACTION_MAIN
svolgere – Data: i dati su cui operare espressi come URI
• Uniform ResourseIdentifier: <schema>:<parte specifica>
– “http://www.di.unisa.it/”
• Permette di – “mailto:[email protected]
– “geo:0,0?via+Posidonia+Salerno+Italy”
– startActivity: lanciare una nuova attività – “tel:+391112223456”
– “content://com.android.contacts/contacts”
– broadcastIntent: spedire l’intent in broadcast
• verrà ricevuto dai BroadcastReceiver interessati
• Esempi di coppie (azione,dati):
– startService o bindService: comunicare con un – ACTION_VIEW, content://contacts/people/1
servizio di background – ACTION_DIAL, content://contacts/people/1
– ACTION_DIAL, tel:1112233

Slide Slide
Intent 111 Intent 112
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

• Altre parti di un intent • Risoluzione esplicita


– Category – specifichiamo in modo esplicito l’attività (Component)
• informazioni aggiuntive sull’azione da eseguire che vogliamo lanciare
– es. CATEGORY_BROWSABLE significa che si può usare un browser
come Component
• Risoluzione implicita
– Type
– Component non è specificata
• specifica in modo esplicito il tipo (MIME) dei dati.
Normalmente il tipo viene dedotto automaticamente – Android sceglie un’attività appropriata, in base a
• Action
– Component • Type
• Specifica in modo esplicito l’attività da eseguire (che • URI
altrimenti verrebbe dedotta dalle altre informazioni)
• Category
– Extras – Le attività dichiarano le action che possono soddisfare
• un bundle di informazioni addizionali (dati specifici per nel manifesto
l’attività).

Slide Slide
Intent 113 Intent 114
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

Intent i; @Override
i = newIntent(Intent.ACTION_PICK,ContactsContract.Contacts.CONTENT_URI); protected void onActivityResult(int request, int result, Intent data) {
startActivityForResult(i, REQUEST_CODE); if (request == REQUEST_CODE && result == Activity.RESULT_OK) {

• Azione: ACTION_PICK
– Chiede di selezionare un item
• onActivityResult
• Data: – viene chiamato quando si ritorna all’attività di
partenza
– ContactsContract.Contacts.CONTENT_URI
– “content://com.android.contacts/contacts” – permette di controllare il risultato restituito
• controlliamo il REQUEST_CODE
• startActivityForResult
• in questo caso anche un flag di OK
– lancia l’attività chiedendo un risultato
• gestiamo i dati restituiti
– REQUEST_CODE serve ad identificare la richiesta

19
9/25/17

Slide Slide
Intent Extras 115 Intent Flags 116
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

• Informazioni “extra” • Informazione su come l’intent dovrebbe essere


– coppie chiave-valore trattato
• putExtra – Esempi:
• getExtra • FLAG_ACTIVITY_NO_HIS TORY
– non memorizzare l’attività nello stack delle attività
intent.putExtra(“CONTATORE”,c ); • FLAG_DEBUG_LOG_R ESOLUTION
intent.putExtra(“STRINGA”,”Ciao”); – stampa informazioni addizionali quando l’intent viene eseguito
intent.putExtras(bundle); //Inserisce tutti i dati del Bundle bundle – molto utile in fase di debug se l’intent che vogliamo far eseguire
non viene eseguito

c = intent.getExtra(“CONTATORE”);
stringa = intent.getExtra(“S TRINGA”);
Bundle b = intent.getExtras();

Slide Slide
Intent Component 117 Intent 118
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

• Permette di specificare l’attività “target”


– da usare quando c’è una sola specifica attività
(componente) che deve ricevere l’intent Quiz

Intent intent = new Intent(Context context, Class<?> class);

//oppure
intent.setComponent(…);
intent.setClass(…);
intent.setClassName(…);

Slide
Quiz 119
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

• Cosa succede se ruotiamo lo schermo?


– Un utente può barare sfruttando questo fatto An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

Correggere l’errore dovutoalle rotazioni


nell’app Quiz

• L’app Quiz contiene (volutamente) alcuni errori


Permessi
e omissioni
Individuare e correggere gli errori e
colmare le omissioni

120

20
9/25/17

Slide Slide
Permessi 121 Permessi 122
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

• Android protegge risorse e dati con un • Vengono rappresentati da stringhe


meccanismo di permessi di accesso
• Ogni app deve dichiarare nel manifesto i
• Servono a limitare l’accesso a “permessi” che intende utilizzare
– informazioni dell’utente (e.g. i contatti della rubrica) <uses-permission android:name = “android.permission.CAMERA”/>
– servizi con costi (e.g., invio SMS, chiamate tel., <uses-permission android:name =
accesso a Internet) “android.permission.INTERNET”/>
<uses-permission android:name =
– Risorse di sistema (e.g., fotocamera, GPS) “android.permission.ACCESS_FINE_LOCATION”/>

• L’utente deve accettare i permessi al momento


dell’istallazione

Slide Slide
Permessi 123 Permessi normali (API 23, 6.0) 124
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

• ACCESS_LOCATION_EXTRA_COMMANDS• NFC
• I permessi sono divisi in due classi • ACCESS_NETWORK_STATE • READ_SYNC_SETTINGS
– Normali e “pericolosi” • ACCESS_NOTIFICATION_POLICY • READ_SYNC_STATS
• ACCESS_WIFI_STATE • RECEIVE_BOOT_COMPLETED
• BLUETOOTH • REORDER_TASKS
• I permessi normali vengono concessi senza •

BLUETOOTH_ADMIN
BROADCAST_STICKY


REQUEST_INSTALL_PACKAGES
SET_TIME_ZONE
chiedere nulla all’utente • CHANGE_NETWORK_STATE • SET_WALLPAPER
• CHANGE_WIFI_MULTICAST_STATE • SET_WALLPAPER_HINTS
• I permessi “pericolosi” devono essere approvati • CHANGE_WIFI_STATE • TRANSMIT_IR
dall’utente • DISABLE_KEYGUARD • USE_FINGERPRINT
• EXPAND_STATUS_BAR • VIBRATE
– quando si istalla l’app (API < 23) • FLASHLIGHT • WAKE_LOCK
– a runtime (API >= 23) • GET_PACKAGE_SIZE • WRITE_SYNC_SETTINGS
• INTERNET • SET_ALARM
• KILL_BACKGROUND_PROCESSES • INSTALL_SHORTCUT
• MODIFY_AUDIO_SETTINGS • UNINSTALL_SHORTCUT

Slide Slide
Permessi pericolosi (API 23, 6.0) 125 Permessi pericolosi (API 23, 6.0) 126
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

Gruppo Permesso Gruppo Permesso


CALENDAR READ_CALENDAR SENSORS BODY_SENSORS
WRITE_CALENDAR SMS SEND_SMS
CAMERA CAMERA RECEIVE_SMS
CONTACTS READ_CONTACS READ_SMS
WRITE_CONTACTS RECEIVE_WAP_PUSH
GET_ACCOUNTS RECEIVE_MMS
LOCATION ACCESS_FINE_LOCATION STORAGE READ_EXTERNAL_STORAGE
ACCESS_COARSE_LOCATION WRITE_EXTERNAL_STORAGE
MICROPHONE RECORD_AUDIO
PHONE READ_PHONE_STATE • Quando l’app richiede un permesso pericoloso
CALL_PHONE
READ_CALL_LOG
– se ha già un permesso per lo stesso gruppo viene
WRITE_CALL_LOG concesso automaticamente
ADD_VOICEMAIL – altrimenti viene richiesto all’utente (dialog box) il
USE_SIP
PROCESS_OUTGOING_CALLS
permesso per il GRUPPO

21
9/25/17

Slide
Threads 127
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

• Computazione parallela all’interno di un processo


– Ogni thread ha il proprio program counter ed il proprio An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

stack
– condivide con gli altri thread del processo l’heap e la
memoria statica

p1 p2 p3 p4
Threads
t1 t3 t7

t4 ... t6 t8 ...
t2

t5 t9

CPU 1 CPU 2 128

Slide Slide
Java Threads 129 Threads 130
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

• Oggetti java.lang.thread • Per usare un thread:


• Implementano l’interfaccia runnable – Creare un oggetto Thread
– devono aver il metodo void run() – Chiamare il metodo start() del thread
• che chiamerà il metodo run()
APP
Thread
• Metodi che useremo (main thread)
new
– void start()
– void sleep(long time)
– void wait() start()
• aspetta che un altro oggetto chiami notify() su questo run()
oggetto
– void notify()

Slide Slide
Threads 131 Threads 132
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

• Android non permette ai thread in background


di interagire con l’interfaccia utente

• Solo il main thread può farlo


ThreadNo – Non possiamo aggiornare l’immagine nel thread
creato per caricare l’immagine

• Metodi
– boolean View.post(Runnable action)
– void Activity.runOnUiThread(Runnable action)

22
9/25/17

Slide Slide
Threads 133 Async task 134
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

• Facilitano l’interazione fra background thread e


main thread

• Background thread
– esegue il task
ThreadSi – notifica sullo stato di avanzamento

• Main (UI) thread


– setup iniziale
– display dello stato di avanzamento
– usa i risultati (es. mostrandoli sul display)

Slide Slide
AsyncTask 135 AsyncTask.execute() 136
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

• Classe Java generica • void onPreExecute()


– eseguito nel main thread prima di doInBackground()
class AsyncTask<Params, Progress, Result> {
… • Result doInBackground(Params… params)
} – viene eseguito
• lista variabile di parametri
• restituisce un oggetto di tipo Result
• Parametri – può chiamare
– Params: tipo (di dati) per il lavoro che deve svolgere • void publishProgress(Progress… values)
il background thread • void onProgressUpdate(Progress… values)
– Progress: tipo (di dati) usato per lo stato di – nel main thread in risposta a publishProgress
avanzamento • void onPostExecute(Result result)
– Result: tipo (di dati) per il risultato del task – nel main thread DOPO doInBackground() con il risultato
di doInBackground come parametro

Slide
AsyncTask 137
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

Fragments
ThreadAsyncTask

138

23
9/25/17

Slide Slide
Fragments 139 Fragments 140
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

• Frammento • Un frammento è sempre “ospitato” da


– rappresenta una “porzione” dell’UI un’activity

• Un activity può “ospitare” vari frammenti • Un frammento è una sorta di sub-activity


– I frammenti possono essere inseriti e rimossi – ha il suo ciclo di vita
durante l’esecuzione – che è strettamente legato a quello dell’activity
• es. se l’activity è in pausa (stato “paused” del ciclo di vita)
lo sono anche tutti i suoi frammenti
• Si possono creare UI con molti frammenti • se l’activity è in esecuzione (stato “resumed”) allora i
frammenti possono essere gestiti
– anche in funzione della grandezza dello
schermo

Slide Slide
Fragments 141 Fragments 142
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

• La porzione di UI occupata dal frammento deve • Filosofia di progettazione


essere specificata nel layout
– Interfacce utente dinamiche
– può essere definita dinamicamente
– in particolare per sfruttare schermi grandi
Spazio per il frammento 3
Spazio per il frammento 1

App user Interface • Esempio tipico


– App che gestisce un elenco di elementi
• es. titoli di articoli di un giornale
Spazio per il frammento 2 – Ogni elemento può essere cliccato per essere
esaminato
• es. visualizzazione dell’articolo

Slide Slide
Fragments 143 Fragments 144
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

• Si può usare
– un frammento per l’elenco
– un frammento per la visualizzazione

• Se lo schermo è piccolo
– sarà visibile solo uno dei frammenti
• cliccando un titolo si passerà dal frammento titoli al
frammento visualizzazione
• Se lo schermo è grande
– saranno visualizzati entrambi i frammenti

24
9/25/17

Slide Slide
Creare frammenti 145 Creare frammenti 146
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

• Istanziare un oggetto Fragment • Normalmente dovremo implementare almeno


– la classe Fragment è simile alla classe Activity – onCreate()
– proprio ciclo di vita • Inizializzazione come in un activity
• NON definiamo il layout
– onCreateView()
• definiamo il layout. Il metodo deve restituire una View
• facciamo l’inflate di un file di layout
– onPause()
• il primo metodo chiamato quando il frammento viene
eliminato (si dovrebbero rendere permanenti eventuali
cambiamenti altrimenti si perdono)

Slide Slide
Creare frammenti 147 Fragments 148
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

public static class ExampleFragment extends Fragment {


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup view,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View v =inflater.inflate(R.layout.example_fragment, container, false);
return v;
}
}

• è l’equivalente di setContentView nella activity


host
– view è un oggetto che serve a specificare i parametri
di layout

Slide Slide
Creare frammenti 149 Creare frammenti 150
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

• Un frammento può essere inserito staticamente • Oppure dinamicamente a runtime


nel layout
<?xml version="1.0" encoding="utf-8"?> FragmentManager fm= getFragmentManager();
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/andro id" FragmentTransaction ft = fragmentManager.b eginTransac tion();
android:orientation="horizontal"
ExampleFragment fragment = new ExampleFragment();
android:layout_width="match_parent"
android:layout_height="match_parent"> ft.add(R.id.fragment_container, fragment);
<fragment android:name=”com.example.news.ArticleListFragment" ft.commit();
android:id="@+id/list"
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="match_parent" />
• R.id.fragment_container
<fragment android:name="com.example.news.ArticleReaderFragment" – è un ViewGroup nel layout dell’activity che individua
android:id="@+id/viewer"
android:layout_weight="2"
la porzione dello schermo da dedicare a questo
android:layout_width="0dp" frammento
android:layout_height="match_parent" />
</LinearLayout>

25
9/25/17

Slide Slide
Gestire i frammenti 151 Gestire i frammenti 152
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

• Usiamo il FragmentManager • addToBackStack()


FragmentManager fm= getFragmentManager(); – per inserire i cambiamenti nel backstack

• Iniziamo una transazione


• Il backstack considera solo le activity
FragmentTransaction ft = fragmentManager.b eginTransac tion();
– dobbiamo gestire manualmente i frammenti
• Effettuiamo le operazioni
– inserire un frammento (già vista) • Se non chiamiamo addToBackStack
– rimuovere un frammento – quando premiamo back “salteremo” i cambiamenti
– sostituire un frammento fatti con i frammenti
• Commit – non è quello che l’utente si aspetta
ft.commit();

Slide Slide
Esempi 153 Comunicare con l’activity 154
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

• Può essere utile comunicare con l’activity


– Creare dei metodi di callback

FragmentsLifecycle
• Ad es. il frammento può definire un interfaccia
public static class MyFragment extends Fragment {
...
// Container Activity must implement this interface
public interface OnArticleSelectedListener {
public void onArticleSelected(int index);
FragmentsLifeCycleDyn }
...
}

Slide Slide
Comunicare con l’activity 155 Comunicare con l’activity 156
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

Frammento B
• App Frammento A Main Activity
– lista Interfaccia Implementa
– dettagli elementi Communicator Communicator
void res pond dettaglio(index) {
mos tra dettagli index
}

onCreate {

• Frammento lista
A.s etCommunicator(this )
}

– deve comunicare l’elemento selezionato Portrait Activity


s etCommunicator {
• Frammento dettagli communicator =
MainActivity
res pond(index) {
– deve ricevere l’informazione }
if (lands cape) {
B.dettaglio(index)
}
els e {
• Evitare la comunicazione diretta fra i frammenti onItemClick{
MainActivity.res pond(index) }
N ew activity(index)

– diminuisce la riusabilità } }

26
9/25/17

Slide Slide
Frammenti e backstack 157 Esempi 158
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

• Nuova activity per la modalità portrait


– facilita la gestione del backstack
– per le activity è automatica FragmentsCitazioni

• Frammenti e backstack
FrammentiBackstack
– i frammenti non vengono inseriti nel backstack
– quando premiamo il pulsante back
• si ritorna alla precedente activity
• saltando eventuali cambiamenti dell’UI dovuti all’uso dei
frammenti
FragmentCartelle
– se si vuole occorre gestire il backstack manualmente

Slide
Frammenti 159
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

• Esercizio (avanzato)
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

• L’app FragmentCartelle utilizza un layout


predefinito di 12 cartelle
– quindi può gestire al massimo 12 cartelle

• Scrivere una nuova versione in cui il layout viene


Networking
costruito dinamicamente
– creare nuove view (LinearLayout, Frame, etc)
– LayoutParameters
– view.add()
160

Slide Slide
Networking 161 Networking 162
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

• Socket • Classe InetAddress


– Java.net – permette di gestire gli indirizzi IP

• HTTP • InetAddress.getByName(“www.server.com”);
– org.apache • InetAddress.getByName(“11.22.33.44”);
• HttpRequest
• Httpresponse
• Restituisce l’indirizzo IP
• Data formats – stringa di 32 bit per IPv4
– JSON, XML – stringa di 128 bit per IPv6

27
9/25/17

Slide Slide
Networking 163 Networking 164
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

• classe Socket • Scrivere nell socket


– crea il canale di comunicazione con il server
• PrintWriter out =
• Socket(InetAddress addr, int port) new PrintWriter(
– socket = new Socket(serverAddr, port); new BufferedWriter(
new OutputStreamWriter(
socket.getOutputStream())),
• Per leggere e scrivere
true); //Autoflush
– getInputStream(socket)
– getOutputStream(socket)
• out.println(strToSend);

Slide Slide
Networking 165 Networking 166
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

• Leggere dal socket SocketRaw

• BufferedReader in =
new BufferedReader(
new InputStreamReader(
socket.getInputStream()));

• in.readLine(), in.read(), …
SocketRawProgressBar

Slide Slide
URL e HTTP 167 HTTP 168
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

• Il trasferimento di pagine web è l’operazione più • classe AndroidHttpClient


comune
– esistono delle classi apposite • classe HttpGet

• HttpURLConnection • classe responseHandler


– openConnection()
– getInputStream()
• ci permettono facilmente di
– stabilire una connessione HTTP
• e poi si procede come prima leggendo i dati
dallo stream – inviare una richiesta GET
– leggere la risposta

28
9/25/17

Slide Slide
Networking 169 Documenti HTML 170
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

• Dati in documenti HTML


SocketURL – difficile estrarli

• Esistono delle librerie che implementano il


parsing di documentl HTML
– es. JSOUP

• Per utilizzare una libreria


– procurarci il file .jar (es. jsoup-1-1.7.3.jar)
– memorizzarlo nella cartella lib del progetto
– Aggiungere il file jar nella lista delle librerie
SocketHTTP
• Progetto -> Proprietà -> Java Build Path -> Librerie

Slide Slide
JSoup 171 Networking 172
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

• La classe Jsoup permette


– parsing di documenti HTML
– estrarre singoli parti del documento

• Esempi:
– Document doc =
Jsoup.connect("http://en.wikipedia.org/").get();
– Element e = doc.getElementById(“id”);
– Elements e = doc.select(“[class=id”);
SocketJSoup

Slide
Data Storage 174
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

• Shared Preferences
–dati privati, coppie chiave-valore
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

• File
Data Storage –File privati dell’app
–File pubblici (accessibili da altre app)

• Database SQLite
–Dati strutturati in database privati
173

29
9/25/17

Slide Slide
SharedPreferences 175 SharedPreferences 176
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

• Classe SharedPreferences • SharedPreferences obj;


– permette di salvare e recuperare dati usando coppie
di chiave-valore • Leggere i dati: is usa “get”
– Boolean v = obj.getBoolean("KEY");
• 2 metodi della classe Activity
– getSharedPreferences(“filename”) • Scrivere i dati: serve un “editor”
• quando si vogliono usare più file di “preferenze” (dati)
– lo si ottiene con il metodo edit
– getDefaultSharedPreferences()
– SharedPreferences.Editor editor = obj.edit();
• quando basta un solo file
– restituiscono un oggetto SharedPreferences • Con l’editor si può usare “put”:
– editor.putBoolean("KEY", bool_value);
Attenzione a non usare getPreferences (senza “Shared”), che serve per
– editor.commit();
preferenze non condivise con altre activity dell’app.

Slide Slide
File 177 File 178
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

• Per ogni app il sistema operativo prevede una String FILENAME = "hello_file";
directory privata String string = "hello world!";

– solo l’app può accedere a questa directory FileOutputStream fos = openFileOutput(FILENAME, Context.MODE_PRIVATE);
– se l’app viene disinstallata, la directory viene fos.write(string.getBytes());
cancellata fos.close();

• Per creare e scrivere un file • La modalità può essere


1. Chiamare openFileOutput(fileName, mode) – MODE_PRIVATE (file accessibile solo all’app)
• restituisce un FileOutputStream – MODE_APPEND
2. Scrivere nel file (write()) – MODE_WORLD_READABLE (leggibile da tutti)
3. Chiudere lo stream (close()) – MODE_WORLD_WRITABLE (scrivibile da tutti)

Slide Slide
File 179 File 180
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

• Per leggere un file • getFilesDir()


1. Chiamare openFileInput(fileName) – Restitusice la directory privata dell’app (dove
• restituisce un FileInputStream vengono salvati i file)
2. Leggere dal file (read()) • getDir()
3. Chiudere lo stream (close()) – Crea (o apre se esiste) una directory all’interno dello
spazio privato dell’app
• deleteFile()
È possibile usare un file “statico” mettendolo nella directory
“res/raw” dell’applicazione. Lo si può leggere usando
– cancella il file nello spazio privato
openRawResource passando come argom ento l’identificatore • filelist()
R.raw.<filename>. Il metodo openRawR esource res tituisce un
InputStream che può essere usato per leggere il file. – Restituisce un array di file, quelli presenti nello
spazio privato

30
9/25/17

Slide Slide
File temporanei 181 File su External Storage 182
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

• Per i file temporanei si può usare una directory • Android permette l’utilizzo di una memoria esterna
cache – tipicamente una SD card
– Android cancellerà i file in questa directory SE
necessario (quando manca spazio) • File nella memoria esterna sono pubblici (world-
readable)
• getCacheDir()
– restituisce la directory cache • Occorre richiedere il permesso di lettura/scrittura
– è comunque responsabilità dell’app cancellare i file
– non si dovrebbe usare la directory cache per file • La memoria esterna può essere rimossa
grandi (grandezza massima raccomandata 1MB) – quindi non si può assumere che i file siano sempre
disponibili

Slide Slide
External Storage 183 External Storage 184
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

<manifest ...> /* Checks if external storage is available for read and write */
<uses-permission public boolean isExternalStorageWritable() {
android:name="android.permission.WRITE_EXTERNAL_STORAGE” String state = Environment.getExternal Storag eState();
android:maxSdkVersion="18" if (Environment.MEDIA_MOUNTED.equals(state)) {
/> return true;
… }
</manifest>
return false;
}
• Permesso Write include il permesso Read /* Checks if external storage is available to at least read */
<manifest ...> public boolean isExternalStorageReadable() {
<uses-permission String state = Environment.getExternal Storag eState();
android:name="android.permission.READ_EXTERNAL_STORAGE” if (Environment.MEDIA_MOUNTED.equals(state) ||
/> Environment.MEDIA_MOUNTED_READ_ONLY.equ als(state)) {
… return true;
</manifest> }
return false;
Apartire da Android 4.4,per lo spazio privato non c’è bisogno di permessi. }

Slide Slide
Condividere file con altre app 185 SQL – Quick tutorial 186
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

• getExternalStoragePublicDirectory(type) • Android fornisce supporto per database SQL


– type: DIRECTORY_PICTURES, DIRECTORY_MUSIC , – Structured Query Language
DIRECTORY_RINGTONES, … – Il linguaggio standard per database relazionali

• Tavole
• Esempio: metodo che crea una nuova dir per – ogni riga è un elemento
delle foto nella dir pubblica delle immagini – ogni colonna rappresenta un campo

public File getAlbumStorageDir(String albumName) {


// Get the directory for the user's public pictures directory. ID Nome Cognome Esame Voto
File file = new File(Environment.getExternalStoragePublicDirectory( 1356251 Giuseppe Verdi MP 30
Environment.DIRECTORY_PICTURES), albumName); 1367288 Attilio Bianchi Algoritmi 25
if (!file.mkdirs()) {
5267712 Valentino Rossi MotoGP 30
Log.e(LOG_TAG, "Directory not created");
} 7126714 Giuseppe Verdi Sicurezza 22
return file; 1562689 Marco Arancione MP 30
}

31
9/25/17

Slide Slide
SQL – Quick tutorial 187 SQL – Quick tutorial 188
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

• Tavole • Chiave principale


– CREATE
• crea una nuova tavola (o anche altro, es. view) – una colonna (o più colonne) che serve da
– ALTER identificatore univoco per ogni record
• Modifica una tavola (o altro)
– DROP
• Cancella una tavola • Esempio creazione tavola:
• Contenuto
– SELECT SQL> CREATE TABLE CUSTOMERS (
• legge uno o più record (righe) di una tavola (o view) ID INT NOT NULL,
– INSERT NAME VARCHAR (20) NOT NULL,
• Inserisce un record AGE INT NOT NULL,
ADDRESS CHAR (25) ,
– UPDATE SALARY DECIMAL (18, 2),
• Modifica uno o più record PRIMARY KEY (ID)
– DELETE );
• Cancella uno o più record

Slide Slide
SQL – Quick tutorial 189 SQL – Quick tutorial 190
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

• Esempi di inserimento • Tavola prodotta


INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY) VALUES (1, ’Marco', 32, ’Napoli',
2000.00 );

INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY) VALUES (2, ’Adele', 25, ’Milano', ID NAME AGE ADDRESS SALARY
1500.00 ); 1 Marco 32 Napoli 2000
2 Adele 25 Milano 1500
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY) VALUES (3, ’Carla', 23, ’Palermo',
2000.00 ); 3 Carla 23 Palermo 2000
4 Maria 25 Roma 6500
5 Pasquale 27 Firenze 8500
INSERT INTO CUSTOMERS VALUES (4, ’Maria', 25, ’Roma', 6500.00 ); 6 Renato 22 Venezia 4500
INSERT INTO CUSTOMERS VALUES (5, ’Pasquale', 27, ’Firenze', 8500.00 );

INSERT INTO CUSTOMERS VALUES (6, ’Renato', 22, ’Venezia', 4500.00 );

Slide Slide
SQL – Quick tutorial 191 SQL – Quick tutorial 192
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

• Esempi di update
• Esempi di select
UPDATE CUSTOMERS SET ADDRESS = ‘Salerno’ WHERE ID = 5
SELECT ID, NAME, AGE, ADDRESS, SALARY FROM CUSTOMERS;
ID NAME AG E AD D RESS SALARY

+----+--- -- -- -- - +- -- -- +- - -- -- -- -+ - -- -- -- -- + 1 Marco 32 N apoli 2000


| ID | NAME | AGE | ADDRESS | SALARY | 2 Adele 25 Milano 1500
+----+--- -- -- -- - +- -- -- +- - -- -- -- -+ - -- -- -- -- +
| 1 | Marco | 32 | Napoli | 2000.00 | 3 Carla 23 Palermo 2000
| 2 | Adele | 25 | Milano | 1500.00 | 4 Maria 25 Roma 6500
| 3 | Carlo | 23 | Palermo | 2000.00 |
| 4 | Maria | 25 | Roma | 6500.00 | 5 Pas quale 27 Salerno 8500
| 5 | Pasquale | 27 | Firenze | 8500.00 | 6 Renato 22 Venez ia 4500
| 6 | Renato | 22 | Veneia | 4500.00 |
+----+--- -- -- -- - +- -- -- +- - -- -- -- -+ - -- -- -- -- +
UPDATE CUSTOMERS SET SALARY = 1000.00;
ID NAME AG E AD D RESS SALARY
1 Marco 32 N apoli 1000
SELECT NAME, SALARY FROM CUSTOMERS;
2 Adele 25 Milano 1000
SELECT NAME, SALARY FROM CUSTOMERS WHERE SALARY > 5000;
3 Carla 23 Palermo 1000
SELECT NAME, SALARY FROM CUSTOMERS WHERE SALARY > 5000 AND AGE <26;
SELECT NAME, SALARY FROM CUSTOMERS WHERE NAME LIKE ’M%’; 4 Maria 25 Roma 1000
SELECT NAME FROM CUSTOMERS ORDER BY NAME ASC; 5 Pas quale 27 Salerno 1000
SELECT * FROM CUSTOMERS ORDER BY NAME, SALARY DESC; 6 Renato 22 Venez ia 1000

32
9/25/17

Slide Slide
Database 193 Database 194
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

• Android fornisce supporto per database SQL • Sul database si possono applicare comandi
– solo all’interno dell’app standard SQL

• Per usare un database • Il database (tavola) viene creato (comando


– Creare una sottoclasse di SQLiteOpenHelper CREATE) nel metodo onCreate() della sottoclasse
– sovrascrivere il metodo onCreate() DatabaseOpenHelper

• Quindi si crea un nuovo Helper: • Nell’app vengono usati:


– dbHelper = new DatabaseOpenHelper(this);
– db.insert()
– db.delete()
• Dal quale si ricava un database – db.update()
– SQLiteDatabase db = dbHelper.getWritableDatabase();

Slide Slide
Database 195 Data Storage 196
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

public class MyOpenHelper extends SQLiteOpenHelper {


private static final int DATABASE_VERSION = 1; DataStorageIntFile
private static final String TABLE_NAME = "dictionary";
private static final String CREATE_CMD = DataStorage
"CREATE TABLE " + DICTIONARY_TABLE_NAME + " (" +
KEY_WORD + " TEXT, "+ KEY_DEFINITION + " TEXT);”;

MyOpenHelper(Context context) {
super(context, TABLE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_CMD); DataStoragePreferences
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// override necessario
} DataStorageSQL
}

Slide
Grafica 198
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

• Un’immagine può essere disegnata in


An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8
– un oggetto View
• grafica semplice, senza necessità di cambiamenti
– un oggeto Canvas
• grafica complessa, aggiornamenti frequenti

Grafica • Classe Drawable


– rappresenta un oggetto che può essere disegnato
• un’immagine, ma anche un colore, una forma, etc
• ShapeDrawable – una forma
• BitmapDrawable – una matrice di pixels
• ColorDrawable – un colore (uniforme)
197

33
9/25/17

Slide Slide
Grafica 199 Animazioni 200
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

• L’oggetto Drawable deve essere inserito • Android permette di definire delle animazioni da
nell’oggetto View applicare alle immagini
– direttamente nel file XML
– in modo programmatico • Descritte con file XML
• View.setImageDrawable()
– rotazione
– traslazione
– scaling (dimensione)
– trasparenza
– con controllo di vari parametri
• es., punto di pivot, velocità, etc.
GraficaSimpleImg

Slide Slide
Animazioni 201 Custom Views 202
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

• Class Animation • Android ha molti widget


– Pulsanti, Liste, ImageView, etc, etc.
• permette di
– leggere le animazioni dai file XML • Per esigenze particolare possiamo definire dei
– applicarle alle ImageView widget personalizzati

• Permettono un maggiore controllo sulla grafica


– ovviamente sono più complicati da usare

GraficaImgAnim

Slide Slide
Albero delle View 203 Meccanismo di layout 204
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

LinearLayout • “Container Views”


– RelativeLayout
– LinearLayout

Frame LinearLayout • Il meccanismo di layout inizia quando viene


ImageView EditText
chiamato il metodo requestLayout su una View
dell’albero
– solitamente un widget chiama requestLayout quando
Button Button ha bisogno di altro spazio
RelativeLayout

• requestLayout mette un evento nella coda degli


public class View {
… eventi UI
Button ImageView public void onMeasure(…) – Quando l’evento viene processato, ogni container view
public void onLayout(…) ha la possibilità di interagire con i figli

}

34
9/25/17

Slide Slide
Meccanismo di layout 205 Misura 206
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

• Il processo ha due fasi • La fase di misura offre la possibilità alle views di


1. misura delle views contenute nel container chiedere lo spazio di cui hanno bisogno
2. posizionamento delle views all’interno del
container • Android inizia il processo chiamando il metodo
measure sulla radice dell’albero
• Tutte le view devono implementare la fase 1 – a partire dalla radice ogni container view chiede ai
figli lo spazio di cui hanno bisogno
– la richiesta si propaga ricorsivamente
• Sole le view container devono avere anche la
fase 2 • Measure è un metodo “final” che non può
essere riscritto
– onMeasure invece sì, viene chiamato da measure

Slide Slide
onMeasure() 207 MeasureSpec 208
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

public class MyView extends Views{ int widthMode = MeasureSpec.getMode(widthMeasureSpec);


MyView(Context context) { int width = MeasureSpec.getSize(widthMeasureSpec);
super(context); int heightMode = MeasureSpec.getMode(heightMeasureSpec);
} int height = MeasureSpec.getSize(heightMeasureSpec);}

@Override
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { • width e heigth
setMeasuredDimension(
getSuggestedMinimumWidth(), – in pixels
getSuggestedMinimumHeigh());
} • widthMode e heigthMode
….
} – MeasureSpec.EXACTLY
– MeasureSpec.AT_MOST
• onMeasure potrebbe essere chiamata varie – MeasureSpec.UNSPECIFIED
volte!
• gli “int” contengono anche dei bit addizionali

Slide Slide
Layout 209 Disegnare nel canvas 210
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

• Nella fase di Layout le view container • Quando la view è stata posizionata verrà
comunicano la posizione effettiva ad ogni view disegnata
figlio – metodo onDraw
public class MyView extends Views{

@Override • Oggetto Paint e metodi dell’oggetto Canvas
public void onLayout (int x1, int y1, int x2, int y2) {
Log.d("DEBUG","onLayout”); public class MyView extends Views{
Log.d("DEBUG","coordinate x1="+x1+" y1="+y1+" x2="+x2+" y2="+y2); …
int smw = getSuggestedMinimumWidth(); @Override
int smh = getSuggestedMinimumHeight(); public void onDraw (Canvas canvas) {
Log.d("DEBUG","onLayout smw="+smw+" smh="+smh); //Codice per disegnare la view
setMeasuredDimension(smw,smh); } }
….
….
} }

35
9/25/17

Slide Slide
Esempi 211 Multitouch 212
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

• MotionEvent
– rappresenta un movimento registrato da una
periferica
• penna, trackball, mouse
• dita sul display

• Il movimento è rappresentato con


– ACTION_CODE
• cambiamento avvenuto
GraficaCustomWidget GraficaCanvas – ACTION_VALUES
• Posizione e propietà del movimento
– tempo, sorgente, pressione e altro

Slide Slide
Multitouch 213 Multitouch 214
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

• Focalizziamo l’attenzionesul Multitouch


• MotionEvents ACTION_CODES:
• Multitouch display – ACTION_DOWN
– Permettono il rilevamento di uno o più tocchi
• un dito tocca lo schermo ed è il primo
• “Pointer” – ACTION_POINTER_DOWN
– il singolo evento (es. un dito che tocca lo schermo)
• un dito tocca lo schermo ma non è il primo
• Un MotionEvent rappresenta – ACTION_MOVE
– un singolo pointer
– a volte più di un pointer • un dito che è sullo schermo si muovo
• in questo caso possiamo accedere ai singolo pointer usando un indice
– ACTION_POINTER_UP
• Ogni pointer ha un ID unico per tutto il tempo in cui esiste • un dito che è sullo schermo non lo tocca più
– L’indice di un MotionEven multiplo NON è il pointer ID
• il pointer ID è costante
– ACTION_UP
• l’indice può cambiare per eventi successivi • l’ultimo dito sullo schermo viene alzato

Slide Slide
Multitouch 215 Multitouch 216
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

Remark Action ID Remark Action ID


Primo dito ACTION_DOWN 0 Primo dito ACTION_DOWN 0
ACTION_MOVE 0 ACTION_MOVE 0
Secondo dito ACTION_POINTER_DOWN 1 Secondo dito ACTION_POINTER_DOWN 1
ACTION_MOVE 0,1 ACTION_MOVE 0,1
Primo dito ACTION_POINTER_UP 0 Secondo dito ACTION_POINTER_UP 1
ACTION_MOVE 1 ACTION_MOVE 0
Secondo dito ACTION_UP 1 Primo dito ACTION_UP 0

36
9/25/17

Slide Slide
Multitouch 217 Multitouch 218
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

• Per gestire i MotionEvent:


– getActionMasked()
Remark Action ID • Restituisce l’Action Code dell’evento
Primo dito ACTION_DOWN 0 – getPointerCount()
Secondo dito ACTION_POINTER_DOWN 1
• Numero di pointer coinvolti
Terzo dito ACTION_POINTER_DOWN 2
ACTION_MOVE 0,1,2 – getActionIndex()
Secondo dito ACTION_POINTER_UP 1 • indice di un pointer
Primo dito ACTION_POINTER_UP 0 – getPointerID(int pointerIndex)
Terzo dito ACTION_UP 2
– getX(int pinterIndex)
– getY(int pointerIndex)
– findPointerIndex(int pointerId)

Slide Slide
Multitouch 219 Multitouch 220
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

• Android notifica l’oggetto View • onTouch


– View.onTouchEvent(MotionEvent e) – verrà invocata quanto c’è un evento
• finger down, up o movimento

• onTouchEvent()
– deve restituire un Boolean • onTouch viene chiamata prima che la View
• true, se l’evento è stato consumato venga notificata dell’evento
• false, altrimenti – anche onTouch deve restituire un Boolean
• true, se l’evento è stato consumato
• false, altrimenti
• Oggetti che vogliono ricevere la notifica
– View.onTouchListener
– View.setOnTouchListener()

Slide Slide
Multitouch 221 Multitouch 222
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

• Spesso si ha la necessità di gestire una


combinazione di eventi

• Es. Il doppio “click” equivale a


– ACTION_DOWN
– ACTION_UP
Fare in modo che non si possa “uscire” dallo schermo.
– ACTION_DOWN
– ACTION_UP MultitouchExample
– in rapida successione
Fare in modo che i cerchi non possano sovrapporsi, segnalando che due
cerchi si sono toccati cambiano il loro colore.

37
9/25/17

Slide Slide
GestureDetector 223 GestureDetector 224
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

• Classe GestureDetector • Bisogna creare un GestureDetector


– permette di riconoscere dei gesti fatti sul display – che implementa l’interfaccia
– GestureDetector.OnGestureListener interface
• Alcuni gesti riconosciuti:
– pressione semplice • Riscrivere (override) il metodo onTouchEvent
– doppia pressione (double “click”) – che viene chiamato in risposta ad un gesto
– fling (scorrimento) – questo metodo delega il riconoscimento del gesto al
metodo GestureDetector.OnGestureListener

ADVANCED TOPIC: è possibile anche definire dei gesti personalizzati attraverso


un apposito tool di Android e poi riconoscerli tramite il GestureDetector

Slide Slide
ViewAnimator e ViewFlipper 225 GestureDetector 226
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

• View Animator
– classe per un contenitore di tipo FrameLayout
– animazione cambiamento fra view
• Simple ViewAnimator
– sottoclasse di ViewAnimator
– crea animazione fra 2 o più view del contenitore
– Solo una view per volta viene visualizzata
– Può anche cambiare views ad intervalli regolari
GestureFlip
• metodi
– showNext()
– showPrevious()
Implementare ancheil fling per il decremento

Slide
MediaPlayer 228
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

• AudioManager
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8
– controlla le sorgenti audio e l’output
• volume
• MediaPlayer
– Play di audio e video
Media player
• Sorgente dati
– Risorse locali
– URI (interni)
– URL
227

38
9/25/17

Slide Slide
MediaPlayer 229 MediaPlayer 230
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

• Play di un file in res/raw


MediaPlayer mediaPlayer = MediaPlayer.create(context, R.raw.sound_file);
mediaPlayer.start(); // no need to call prepare(); create() does that for you

• Play di un file da URL


String url = "http://........"; // your URL here
MediaPlayer mediaPlayer = new MediaPlayer();
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.setDataSource(url);
mediaPlayer.prepare(); // might take long! (for buffering, etc)
mediaPlayer.start();

setDataSource() richiede la gestionedi IOException o di IllegalArgumentException

Slide Slide
MediaPlayer 231 MediaPlayer 232
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

• Rilasciare la risorsa • Audio focus

mediaPlayer.release();
mediaPlayer = null; • Poichè c’è un solo canale di output
– l’utilizzo da parte di più applicazioni può essere un
problema
• mediaPlayer.start(); • es. se stiamo ascoltando musica potremmo non sentire l’arrivo
• mediaPlayer.pause(); di un messaggio
• mediaPlayer.stop();
• È possibile gestire l’accesso contemporaneo usando
• Attenzione all’uso asincrono (prepareAsynch) l’audio focus
– necessario per non appesantire l’app – un’app richiede l’audio focus per usare l’audio
– richiede più attenzione – se lo perde deve o smettere di suonare o abbassare il
• Play da fare in/dopo onPrepareListener.onPrepared()
proprio volume

Slide
MediaPlayer 233
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

Sensori
MusicPlayer

Inserire altri brani nel MusicPlayer

Implementare la lista dei brani con un ListView


234

39
9/25/17

Slide Slide
Sensori 235 Sensori 236
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

• Molti smartphones, tablet hanno sensori • SensorManager ci dice


– di movimento – sensori disponibili
• forze di accelerazione e di rotazione
– accelerometri, bussola, giroscopio
– caratteristiche del singolo sensore
• range massimo
– di ambiente
• temperatura, pressione, umidità • accuratezza
– termometri, barometri • etc.
– di posizione
• posizione fisica • ci permette di
– magnetometro, bussola, giroscopio
– leggere i dati grezzi del sensore
• Forniscono dati “grezzi” – usare Listeners sui cambiamenti dei dati
– accuratezza dipende dalla qualità

Slide Slide
Sensori 237 Sensori 238
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

• Pochi device hanno tutti i tipi di sensori • Coordinate fisse: se la device ruota
– a volte più di un sensore dello stesso tipo – il sistema di riferimento rimane fermo
– ecco un elenco parziale: – cambieranno i valori letti sugli assi
Sensore Tipo Descrizione y y
TYPE_ACCELEROMETER Hw Misura le forze in m/s2 applicate alla device
(inclusa la gravità) nelle 3 direzioni (x,y,z)
TYPE_AMBIENT_TEMPERATURE Hw Misura la temperatura dell’ambiente in gradi
centigradi
TYPE_GRAVITY Hw o Sw Misura le forze di gravità sui 3 assi (x,y,z)
x x
TYPE_GYROSCOPE Hw Misura la velocità di rotazione in rad/s nelle 3
direzioni (x,y,z)
TYPE_MAGNETIC_FIELD Hw Misura il campo magnetico sui tre assi z z
TYPE_ORIENTATION Sw Misura la rotazione riferita ai 3 assi
TYPE_RELATIVE_HUMIDITY Hw Misura la % di umidità dell’ambiente
TYPE_LIGHT Hw Misura la luminosità dell’ambiente

Slide Slide
Sensori 239 Sensori 240
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

• L’attività deve implementare SensorEvenListener @Override


protected void onResume() {
super.onResume();
mSensorManager.registerListener(this, mLight, SensorManager.SENSOR_DELAY_NORMAL);
public class SensorActivity extends Activity implements SensorEventListener{ }
...
} @Override
protected void onPause() {
super.onPause();
mSensorManager.unregisterListener(this);
• Poi si deve controllare se il sensore esiste }

private SensorManager mSensorManager;


• Velocità di campionamento
– SENSOR_DELAY_NORMAL (0,2sec)
...
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); – SENSOR_DELAY_GAME (0,02sec)
if (mSensorManager.getDefaultSensor(Sensor.TYPE_LIGHT) != null){ – SENSOR_DELAY_UI (0,06sec)
// Success! There's an ambient light sensor. – SENSOR_FASTEST (0sec )
}
else { • Registrazione e rilascio in onResume e onPause
// Failure! No light sensor
} – per evitare di consumare la batteria

40
9/25/17

Slide Slide
Sensori 241 Sensori 242
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

@Override
public final void onCreate(Bundle savedInstanceState) {
….
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
mLight = mSensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);
}

@Override
public final void onAccuracyChanged(Sensorsensor, int accuracy) {
// Do something here if sensor accuracy changes.
}

@Override
public final void onSensorChanged(SensorEvent event) {
// The light sensor returns a single value, Many sensors return 3 values, one for each axis.
float lux = event.values[0];

}

Accelerometro

Slide
Notifications 244
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

• Notifiche: informazioni all’utente al di fuori


An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8
dell’interfaccia grafica dell’app
– Toast
– Dialog
– Notification Area (Status Bar)
Notifiche

Notifications
243

Slide
Alarms 246
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

• Permettono di eseguire intent in funzione di


An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 specifici eventi

• Un’applicazione che usa un alarm riesce ad


eseguire porzioni di codice anche se
Alarms l’applicazione è terminata

• Un alarm è attivo anche se il telefono va in


modalità di sleep
– l’alarm può causare la ripresa dell’attività
– oppure potrà essere gestito quando l’utente rimette
245
il telefono in modalità normale

41
9/25/17

Slide Slide
Alarms 247 Alarms 248
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

• Gli alarms rimangono attivi fino a quando • Per usare gli alarm in un’app
– vengono cancellati – AlarmManager
– la periferica viene spenta
• Ottenere un riferimento all’AlarmManager:
• Esempi di alarms – getSystemService(Context.ALARM_SERVICE)
– app per gli MMS: usa alarm per controllare
periodicamente i messaggi non spediti (retry • Creare alarms
scheduler)
– void set(int type, long triggerAtTime, PendingIntent i)
– Settings: usa un alarm per rendere la periferica non
visibile via Bluetooth dopo un determinato tempo – void setRepeating(…)

A partire dall’API level 19 (KitKat) gli alarm non sono “esatti”: il SO operativo
può modificare i triggerTime perminimizzare wakeups e l’uso della batteria

Slide
Oltre le Activity 250
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

• 4 componenti fondamentali di Android


An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8
– Activity
– Broadcasts
– Content Providers

Content Providers, – Services

Broadcast, Services • Finora abbiamo parlato delle activity


– servono per lo sviluppo delle app!
– Le altre componenti sono di ausilio e servono in casi
particolari, ma in alcuni casi sono estremamente utili

249
• Nelle prossime slide ci sono dei cenni

Slide Slide
Broadcasts 251 Content providers 252
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

42
9/25/17

Slide Slide
Services 253 Broadcast ed eventi 254
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

• Parleremo
– della classe BroadcastReceiver
– di come un “ricevitore di broadcast” deve essere
“registrato”
– dei modi in cui gli eventi possono essere inviati ai
ricevitori di broadcast
– di come i ricevitori ricevono una notifica di un
evento
– di come i ricevitori gestiscono la notifica

Slide Slide
BroadcastReceiver 255 BroadcastReceiver 256
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

• serve per ricevere e “reagire” ad eventi • Il ricevitore riceve l’Intent tramite il metodo
– eventi sono rappresentati da Intents – onReceive(Context c, Intent i)

• un “ricevitore” deve “registrarsi” dichiarando gli


eventi ai quali è interessato • Riassumendo
– es. esiste un BroadcastReceiver che ha il compito di
spedire messaggi MMS 1. Il “ricevitore” si “registra” usando registerReceiver()
(disponibile nel LocalBroadcastManager o nel Context)
2. L’evento viene creato (da qualche altra
• Quando un’altra componente crea un MMS invia
componente del sistema)
un evento (Intent)
3. Android notifica il ricevitore chiamando onReceive()
– l’Intent viene mandato in broadcast al sistema
– Il ricevitore lo intercetta e spedisce il messaggio

Slide Slide
Registrazione BroadcastReceiver 257 Registrazione BroadcastReceiver 258
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

• Lo si può fare • Se la registrazione è statica


– staticamente nel Manifesto dell’app – il ricevitore viene registrato durante il Boot del
sistema (oppure quando l’app viene istallata)
– dinamicamente usando registerReceiver()
<?xml version="1.0"encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
• Se la registrazione è dinamica
… – il ricevitore viene registrato quando si chiama
<application
… • LocalBroadcastManager.registerReceiver( )
<receiver – per i broadcast locali all’app
android:name=”.My_Receiver" • Context.registerReceiver()
android:exported="false”
<intent-filter> – per i broadcast system-wide
<action android:name=”it.unisa.mp.MY_ACTION"/>
</intent-filter>
</receiver> • è possibile anche revocare la registrazione
</application>
</manifest>
usando unregisterReceiver()

43
9/25/17

Slide Slide
Spedizione broadcast 259 Esempi 260
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

• Per spedire un messaggio si usa il metodo


– sendBroadcast(Intent i)
– sendBroadcast(Intent i, String permission)

• Se si specifica anche una stringa di permesso


l’intent verrà consegnato solo ai ricevitori che
hanno il permesso
– il permesso lo deve avere l’app nel Manifesto BCastGlobal
sendBroadcast(Intent i) è disponibile sia nel LocalBroadcastManager che nel Context.
BCastLocal
Chiaramente si utilizza il primo per messaggi locali all’app ed il secondo per • ACTION_TIME_CLICK
messaggi system-wide. sendBroadcast(Intent i, String permission) è disponibile solo nel
Context. – Intent inviato ogni minuto

Slide Slide
BroadcastReceiver 261 ContentProvider 262
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

• Esempi di altri eventi globali.: • Rappresentano Contenitori Dati


– android.intent.action.AIRPLANE_MODE – progettati per condividere le informazioni fra le
– android.intent.action.BATTERY_LOW applicazioni
– android.intent.action.DATA_SMS_RECEIVED
– android.intent.action.DATE_CHANGED
– android.intent.action.DEVICE_STORAGE_LOW • Per accedere ad un ContentProvider si utilizza
– android.intent.action.TIMEZONE_CHANGED un ContentResolver
– android.intent.action.TIME_TICK – interfaccia simile a quella di un database
– android.intent.action.USER_PRESENT – comandi SQL-like
– android.intent.action.WALLPAPER_CHANGED • QUERY, INSERT, UPDATE, DELETE, etc
– …
– in più, notifiche su cambiamenti dei dati
Lista completa: sdk/platforms/android-19/data/broadcast_actions.txt

Slide Slide
ContentProvider 263 ContentProvider 264
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

• Per usare il resolver occorre recuperare un suo • I dati contenuti in un provider sono memorizzati
riferimento chiamando in tabelle
– Context.getContentResolver()
• Gli utenti possono far riferimento ad uno
• ContentProviders standard specifico ContentProvider usando un URI
– Browser (info su bookmarks, history)
– Call Log (info sulle chiamate) • URI: content://authority/path/id
– Contact (info sui contatti presenti in rubrica)
– authority: specifica il content provider
– Media (lista dei file multimediali utilizzabili)
– path: specifica la tabella
– UserDictionary (lista delle parola digitate) – id: specifica un particolare record
– … molti altri

44
9/25/17

Slide Slide
ContentProvider 265 ContentProvider 266
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

• Esempi di URI • Per ottenere i dati usiamo una query ed un


– content://com.android.contacts/contacts/ Cursor
• ContentResolver.query()
• Authority è com.android.contacts Cursor query(Uri uri,
String[] projection \\ colonne
String selection \\ SQL selection
• La tabella richiesta è “contacts” String[] args \\ SQL args
String sortOrder) \\ ordinamento

• Non c’è nessun ID, quindi l’URI identifica l’intera


• Restituisce un Cursor che ci permette di iterare
tabella dei contatti sull’insieme di record restituiti dalla query

Slide Slide
ContentProvider 267 Services 268
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

• Esempio: leggere la rubrica • Servono a eseguire operazioni complesse che


<uses-permission possono richiedere molto tempo
android:name="android.permission.READ_CONTACTS”
– es. scaricare un file d Internet, sincronizzare
/> informazioni locali con un server

• Vedremo
– La classe Services
– come usare dei Services esistenti
– come definire dei nuovi Services

ContentProvider

Slide Slide
Services 269 Services 270
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

• Services non interagiscono con l’utente • Una volta partito, il Service può continuare la sua
esecuzione fino a che la device è accesa
– non c’è una UI – potrebbe anche essere interrotto se occorrono le risorse
che esso usa
– potrebbe anche terminare volontariamente
• Servono per eseguire delle operazioni in
background • Nell’utilizzo tipico un Service fatto partire da un’app
termina la propria esecuzione dopo aver eseguito
l’operazione richiesta
• L’app interagisce con il servizio
• per default, il Service gira nel main thread dell’app
che lo ha fatto partire
• La prima cosa da fare è far partire il Service – in alcuni casi deve essere esplicitamente fatto girare su
– Context.startService(Intent i) un thread separato

45
9/25/17

Slide Slide
Services 271 Services 272
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

• Le componenti che vogliono interagire con un Service • Occorre dichiarare il Service nel Manifesto:
devono effettuare un “bind”
– Context.bindService(Intent service,
ServiceConnection conn,
int flags);
<?xml version="1.0"encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
• Il binding permette di …
<application
– inviare richieste …
– ricevere riposte <service
android:name=”MyService”
</servicer>
• Se al momento delle richiesta di bind il Service non è </application>
</manifest>
ancora attivo
– viene fatto partire
– rimane attivo fino a quando c’è almeno un client connesso

Slide Slide
Services 273 Services 274
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8 An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

• Nell’esempio visto il servizio è nella stessa app


del client

• Per approfondire i Service:


http://developer.android.com/guide/components/bound-services.html

ServiceSimple

Slide
Buon Natale! 276
An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

An d ro i d M o bi l e P rogrammi n g – P ro f. R . De P ri sco Un i versi tà d i Sal ern o - a.a. 2 0 1 7 -2 01 8

Fine del corso!

275

46

Potrebbero piacerti anche