slides2017 - unisarobdep/mp/slides/slides2017.pdfandroid mobile programming –prof. r. de prisco...

46
9/25/17 1 An d ro i d M o bi l e P rogrammi n g – P ro f. R .De P ri sco Un iversità d i Salern o - a.a. 2 0 1 7 -2 01 8 1 Prof. Roberto De Prisco (ex BDSIR) Slide An d ro i d M o bi l e P rogrammi n g – P ro f. R .De P ri sco Un iversità d i Salern o - a.a. 2 0 1 7 -2 01 8 per favore… 2 … o almeno … e … NON RISPONDERE!!!! Scrivere un app che metteil silenzioso il lun 14:00-16:00 e mer 09:00-11:00 Slide An d ro i d M o bi l e P rogrammi n g – P ro f. R .De P ri sco Un iversità d i Salern o - a.a. 2 0 1 7 -2 01 8 Info corso 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 3 Slide An d ro i d M o bi l e P rogrammi n g – P ro f. R .De P ri sco Un iversità d i Salern o - a.a. 2 0 1 7 -2 01 8 Vendite per OS 4 Slide An d ro i d M o bi l e P rogrammi n g – P ro f. R .De P ri sco Un iversità d i Salern o - a.a. 2 0 1 7 -2 01 8 Vendite per OS 5 Slide An d ro i d M o bi l e P rogrammi n g – P ro f. R .De P ri sco Un iversità d i Salern o - a.a. 2 0 1 7 -2 01 8 Telefoni android prodotti da 6 ed altri …

Upload: others

Post on 27-May-2020

17 views

Category:

Documents


0 download

TRANSCRIPT

9/25/17

1

Andro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

1

Prof.RobertoDePrisco

(exBDSIR)

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

perfavore… 2

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

Scrivere unappchemetteil silenzioso il lun 14:00-16:00emer 09:00-11:00

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Infocorso

• Prof.Roberto DePrisco– studio:4° piano,studio58

• numerazione Dip.diInformatica– [email protected]

• Orariolezioni– Lunedì 15:00-17:00 AulaF8– Giovedì 14:00-16:00 AulaF8

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

3Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Vendite perOS 4

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Vendite perOS 5Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Telefoni androidprodotti da 6

ed altri …

9/25/17

2

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Venditepermarca 7Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Altremotivazioni

• Ambiente disviluppo (AndroidStudio)– faciledaistallare–molti toolsperlosviluppodiapp

• Istallazioni delle app– facile– nonrichiede nessuna registrazione

• Moltissime risorse online

8

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Cosa faremo nel corso

Impareremo ascrivere appperAndroid!!!

9Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Cosa faremo nel corso 10

Vedremo tutto ciò che serveperscrivere app…

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Argomenti

• Piattaforma Android• AndroidStudio• Emulatore

11

• Layout• Listener• Intent• Permessi• Alarms• Frammenti• Networking• Grafica• Sensori• Multimedia• Datastorage

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Risorsedidattiche

• Lezioni!!!!• Google– http://developer.android.com– http://developer.android.com/guide– http://developer.android.com/training

• Books– BigNerd Ranch(ininglese)– http://www.bignerdranch.com/

• Cursera– ottimo videocorso (ininglese)– https://www.coursera.org/course/android

• Googling!

12

9/25/17

3

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Sito epiattaforma S3 13

• Sito– Informazioni– Annunci– Codice app

• S3– Esami– Risultati

http://www.di-srv.unisa.it/~robdep/MP/

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Contest

• Lamigliore appsviluppata DURANTEilcorso verrà premiata conundispositivoAndroid!– Perpartecipare occorre

• frequentare il corso• sviluppare ingruppi di2persone max• consegnare l’app una settimana primadell’ultimalezione delcorso

• appdiuna certa complessità

• Sponsorizzato daeTuitus– www.etuitus.it– commissione:docente, eTuitus

14

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Contest– albod’oro

• 2016:Fabricio Madaio• Bizarre 3DPong

• 2015:RaffaeleD’Arco– ShootTheFruits

• 2014:CarmeloOrlando– AIROrariLinee

15Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Esame

• L’app sviluppata peril contestverrà valutata perl’esame– nonsostituisce laprova dilaboratorio

• Esame– Scritto– Laboratorio

• vengono ammessi gli studenti che superano loscritto

– Orale adiscrezione deldocente• svolto incaso didubbi sulla autenticità delle proveprecedenti

16

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Comecontattare il docente

• Finelezione(onellapausa)• Orariodiricevimentostudenti–Mer 11:00-13:00– Ven 11:00-13:00

• Email– Rispostanongarantita,dipendedalladomanda!– Condizionenecessaria:ilmessaggiodevecontenereilnomedelmittente

– Appuntamento

• NON telefonare

17Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Domande? 18

9/25/17

4

Andro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

19

LapiattaformaAndroid

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

LapiattaformaAndroid

• Sistema softwarepertelefonini etablet– OSkernel– Librerie disistema– Frameworkperleapplicazioni– Applicazioni dibase

• SDKperlosviluppo dinuove applicazioni– librerie– tooldisviluppo– documentazione

• manuali• esempi

20

http://developer.android.com/tra ining

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

L’architettura Android 21

SibasasuunkernelLinux

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

LinuxkernelLayer

– filesystem– gestione della memoria edei processsi– gestione dell’interfaccia direte– drivers per leperiferiche

• Servizi specifici perAndroid– gestione della batteria– gestione della memoria condivisa– lowmemorykiller– interprocess communicationealtre

22

• Fornisce i servizi dibasedelsistemaoperativo

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

HardwareAbstractionLayer

• HAL:HardwareAbstractionLayer– Interfacce standardperesporre lecapacità hardwareai servizi dilivello superiore• Audio• Bluetooth• Fotocamera• Sensori• …

23Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Java

• AppAndroidsono scritte inJava• Lalibreria fornisce molte classi pronte perl’uso:– classi dibase:java.*,javax.*– classi perleapp:android.*– Internet/webservices:org.*– Unittesting:junit.*

24

9/25/17

5

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Filedex eART

• App:– Scritte inJava– Compilate infileJavaBytecode– Untool,DX,trasforma i filebytecode inunsingolofileDex Bytecode (classes.dex)

– Ilfileclasses.dex contiene anche tutte i filedidatinecessari eviene istallato sulla targetdevice

– ARTVirtualMachineesegue il fileDex

25Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Androidruntime:ARTeDalvik VM

• ART:AndroidRuntimeè unaVMspecifica persistemi Android– CPUmeno veloci (rispetto adunPC)– Meno RAM– Batteria condurata limitata

• ART:da5.0APIlevel21• Dalvik:APIlevel<21• Appche funzionano benesu ARTdovrebberofunzionarebeneanche su Dalvik– Ilcontrario no

26

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Librerienative

• MoltecomponentiAndroid necessitanodilibrerie native–Webkit– Libc– openGL ES– …

27Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Applicationframework

• Tutte lefunzionalità dels.o.Androidvengono esposte tramiteunAPI– ViewSystem

• fornisce gli elementidibaseperle interfacce utente– icone,testo,bottoni,ecc.

– ContentProviders• Peraccedere adatidialtre app,peres.aicontattidella rubrica

– Packagemanager• gestisce l’istallazione delle appsul dispositivo mobile

– ActivityManager• gestisce il ciclodivitadelle applicazioni• permette dipassare daun’applicazione all’altra

28

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Applicazioni (app)

• Applicazioni già presenti nel sistema– Home:Mainscreen– Contatti– Telefono– Browser– Emailclient– Mediaplayer– …altre

• Ovviamente … sipossonoscriverenuoveapp!

29Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Versioni 30

API Nome Verisone %10 Gingerbread 2.3 0.8%15 Ice cream Sandwich 4.0 0.8%16 Jelly Bean 4.1 3.1%17 4.2 4.4%18 4.3 1.3%19 KitKat 4.4 18.1%21 Lollipop 5.0 8.2%22 5.1 22.6%23 Marshmallow 6.0 31.2%24 Nougat 7.0 8.9%25 7.1 0.6%

100%

0%

Datiaggiornatialuglio2017

Versione8.0?Annunciataperfine2017

9/25/17

6

Andro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

31

AndroidDeveloper

Tools

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

AndroidStudio

• Istallare l’ADT

• L’interfaccia

• L’emulatore Android

• Strumenti peril debug

• Altri strumenti

32

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

IstallazioneADT

http://developer.android.com/sdk

33

è necessario avere Java8istallatoeperl’emulatoreIntelHAXM

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

AndroidStudio2.3

• Richiede:– Java8– IntelHardwareAcceleratedExecutionManagerHAXM(perl’emulatore)

• Offre– Piattaforma Android– AndroidSDKTools

• sviluppo• debug

– Gradle– Emulatore Android

34

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Modalità sviluppatore

• Modalitàsviluppatore– Infodispositivo,Versionebuild

• Click7volte

• CompariràilmenuOpzioniSviluppatore

• Debug USB– Attivare– Dareilconsensoperl’accesso

35Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Listeners

• GlioggettidellaclasseView hannodeimetodi“listeners”– sonoin“ascolto”perentrareinazionequandosiverificauneventospecifico

• Adesempio– unpulsantehailmetodoonClickchevieneeseguitoquandol’utentepremeilpulsante

36

9/25/17

7

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Primaapp:CiaoMondo

• Visualizza unsaluto almondo!

37

• Vediamo– il codice

• Scriviamo l’app!– Tour diAndroidStudio

CiaoMondo

Icona:New→Image AssetCreator

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

CiaoMondo

• Manifesto– informazionigenerali sull’app

• permessi,attività, icona,…

• Java– filesorgenti

• res,risorse– drawable– layout– values–menu–mipmap

38

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

CiaoMondo

• Gradle– buildsystem

• Informazioni– dipendenze daaltro codice

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

}

– altre informazioni su comecompilare

buildTypes {release {

minifyEnabled falseproguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

}}

39Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

SDK

• AndroidSDKManager

40

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

SDK 41

• Occorre istallare leversioni perlequali si vuolesviluppare

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

EmulatoreAndroid

• AndroidVirtualDeviceManager

42

9/25/17

8

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Emulatore vs.realdevice

• Realdeviceveloce,facilegestire l’input (es.rotazioni display)l’esecuzione è reale

• Emulatorelento(avoltemolto),alcune operazioni sonodifficoltoseè comunque un“simulatore”possonoesserci dei bugFacilecreare situazioni particolari:• batteria scarica• arrivo diunmessaggio

43

Attivaremodalità sviluppatoreedebugUSB!!!7clicksu Infodispositivo→Versione build

Poiattivare USBdebuginopzionisviluppatore

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Emulatore 44

• telnet

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Emulatore 45

“numeroditelefono”:5556 “numeroditelefono”:5554

• Comunicazione fra dueemulatori

Nonè possibile lanciare dueistanze della stessa AVD:occorre creare dueAVDdiverseelanciare un’istanza diognuna.

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

46

Layouts

Layout

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Layouts

• Layout– Definiscono l’aspetto grafico dell’interfaccia utente

• Sipossono definire induemodi– ConunfileXML– Inmodo programmatico*

• Nonsonomutuamente esclusivi– si possonousare insinergia

*programmaticamente,nelgergoAndroid,significa attraversodelle istruzioninelprogramma (eseguite aruntime),quindisonoutilipergestire layoutdinamici

47Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Layouts

• XML– vantaggi

• faciledaspecificare• separa inmodo netto ladefinizione dell’UI dalcodicedell’applicazione (facile fare modifiche)

– svantaggi• elementi statici

• Programmatico– vantaggi

• dinamico,si può facilmente adattare– svantaggi

• dobbiamo gestire il layoutnel codice dell’applicazione

48

9/25/17

9

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Layout– elementi base (esempi)

• TextView

• Button

49

<TextView android:id="@+id/text"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text=”Ciao, sono unTextView" />

<Button android:id="@+id/button"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text=”Ciao, sono unPulsante"android:background=”#00FF00” />

Ciao,sonounTextView

Ciao,sonounPulsante

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Layout- ViewGroup

• Gruppi dialtri elementi– sia dibaseche altri gruppi

• LinearLayout– orizzontali everticali

• RelativeLayout• GridLayout(griglia)• Frame(contenitore)

50

LinearLayoutorizzontale

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Layout- XML

<?xmlversion="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/andro id"

android:layout_width="fill_parent"android:layout_height="fill_parent"android:orientation="vertical" >

<TextView android:id="@+id/text"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Hello, I amaTextView" />

<Buttonandroid:id="@+id/button"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Hello, I amaButton"/>

</LinearLayout>

51Unsoloelemento“radice”inogni fileXML

Elementiarbitraricontenutinell’elemento

radice

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Layout- XML- attributi

• Ogni elemento (ViewoViewGroup)supportadegli attributi– specificano l’aspetto grafico– specificano dovevisualizzare l’elemento– forniscono informazioni

• Es.TextView– textSize

• Alcuni attributi sono comuni atutti gli elementi– altri sono specifici

52

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Layout- XML- attributi

• ID (creazione)android:id="@+id/text"@:il resto della stringa deve essere interpretato

• android:layout_width="30px"– senonc’è@ il valore è quello letterale

+: specifica che stiamocreando (aggiungendo)unnuovo identificatore (id)il cuinome è text

• ID(riferimento)android:id="@id/text"senza il +è unriferimento adunIDesistente

53Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Layout- XML- attributi

• Layoutparameters– layout_something

• Ogni Viewhadei parametri dilayout– appropriati peril ViewGroupacuilaViewappartiene– alcuni sono comuni atutti i tipidiView

• layout_width• layout_height

– altri hanno significato soloperalcuni tipi• layout_alignParentTop

54

9/25/17

10

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Layout–posizioneegrandezza

• Una viewè unrettangolo– posizione:angolo inaltoasinistra– dimensione:larghezza ed altezza

• Posizione (relativa alparent)– determinata dallayout

• Dimensione– android:layout_width="30px"– android:layout_heigth="12px"– android:layout_width="match_parent"– android:layout_heigth="wrap_content"

55

(0,0)

40px

30px

50px

12px

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Layout–paddingemargini 56

android:layout_padding="10px"

android:layout_margin="10px"

android:layout_padding="10px"android:layout_margin="10px"

android:background="#CCDDEE"

UnButtonperdefaulthaun’altezzaminimadi48dp

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Misure pixel:px vs.dp

• Screensize– grandezza reale deldisplay(es.4’’)

• Screendensity– Quanti pixelcisono nell’unità diarea

• raggrupppati in:low,medium,high eextra high• es 240dpi=240dot-per-inch

• px =pixel reali– es.240dpix4’’=>960pixel

• dp (dip)=densityindependentpixels– dimensione calcolata su una densità di160dpi

• un“dp”haledimensioni diun“px”a160dpi– ladimensione nondipenderà dalla densità reale

57Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Misure Pixel 58

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Alternativeperi “drawable”

• Una buona appdovrebbe fornire alternative perglioggetti dadisegnare (drawable)

• Esempio: l’icona dell’applicazione dovrebbe esserefornita in4versioni:– 36x36pixelperdisplaycondensità low– 48x48pixelperdisplaycondensità medium– 72x72pixelperdisplaycondensità high– 96x96pixelperdisplaycondensità extrahigh

• Tutte le immagini in4versioni– DaAndroid4.3,directorymipmap

• MIP,Multum InParvo (moltoinpoco)

59Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Unitàdimisura

• dp,density-independent pixels• sp,scale-independent pixels– scalatoinbaseallepreferenzedell’utentesullagrandezzadelfont

• pt,points (1/72diinch)• px,real pixels• mm,millimetri• in,inches

60

9/25/17

11

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Layouts– LinearLayout

• Posiziona gli elementi uno dopo l’altro(linearmente)

• Orientazione:– android:orientation="vertical"– android:orientation="horizontal"

• Inogni figlio:android:layout_weight– pesoche determina quanto spazio il singoloelemento prende nel LinearLayout

61Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Layouts– LinearLayout 62

<?xml version="1.0"encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width=”match_parent"android:layout_height=”match_parent"android:paddingLeft="16dp"android:paddingRight="16dp"android:orientation="vertical" ><EditTextandroid:layout_width=”match_parent"android:layout_height="wrap_content"android:hint="@string/to"/>

<EditTextandroid:layout_width=”match_parent"android:layout_height="wrap_content"android:hint="@string/subject"/>

<EditTextandroid:layout_width=”match_parent"android:layout_height="0dp"android:layout_weight="1"android:gravity="top"android:hint="@string/message"/>

<Buttonandroid:layout_width="100dp"android:layout_height="wrap_content"android:layout_gravity="right"android:text="@string/send"/>

</LinearLayout>

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Layouts– LinearLayout

• LLincuii figli si dividono equamente lospazio:– verticalmente:

android:layout_height="0dp"android:layout_weight="1”

– orizzontalmente:android:layout_width="0dp"android:layout_weight="1”

• Nonviene lasciato spazio vuoto– Selosi vuole si devono inserire degli elementi fittizi– Es.Framevuoti

63Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Layouts– RelativeLayout

• Laposizione degli elementi è “relativa”– allayoutpadre– agli altri elementi dellayout

• Esempi– android:layout_alignParentTop=”true"– android:layout_centerVertical=”true"– android:layout_below=”@id/other_object"– android:layout_toRightOf=”@id/other_object”

64

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Layouts– RelativeLayout 65

<?xml version="1.0"encoding="utf-8"?><RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent” ><TextViewandroid:id="@+id/textView1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerHorizontal="true"android:layout_centerVertical="true"android:text="Alcentro” />

<Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_below="@id/textView1"android:layout_centerHorizontal="true"android:text="Button1"/>

<Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentRight="true"android:layout_alignParentTop="true"android:text="Button2"/>

</RelativeLayout>

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Layouts– GridView

• Visualizza uninsieme dielementi– numero totale variabile– visibile solouna parte– scroll

• Adapter– fornisce gli elementi dainserire nel GridView

• lovedremo inseguito

66

9/25/17

12

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Layouts– GridLayout 67

<GridLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:background="#abcdef"android:columnCount="3"android:rowCount="3” >

<Buttonandroid:background="#aa55ee"android:id="@+id/button1"android:text="Button 1" />

<Buttonandroid:id="@+id/button2"android:text="Button 2" />

<Buttonandroid:id="@+id/button3"android:layout_column="2"android:layout_row="2"android:text="Button 3" />

<Buttonandroid:id="@+id/button4"android:text="Button 4" />

</GridLayout>

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Layouts– ListView

• Visualizza uninsieme dielementi organizzati inuna lista– numero totale variabile– visibile solouna parte– scroll

• Adapter– fornisce gli elementi dainserire nel ListView

• lovedremo inseguito

68

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Layouts-widget

• TextView• Button• TextEdit• ImageView• CheckBox• RadioButton• …emolti altri– es.Orologio

69

Layouts

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

70

Lanostraprima

(vera)app

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Primaapp

• Calcolatrice– Una sola“Activity”– Pulsanti

• Listeners

– TextView

71

Calcolatrice

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

72

AndroidStudioDebugger

9/25/17

13

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Copiareuninteroprogetto 73

• Fareunacopiadelladirectory– RinominarlaconNuovoNome

• AprireNuovoNome inAndroid Studio• Rinominarepackageedirectories– Right-clicksulpackage,Refactor>Rename

• Rinominadirectory• Nel filebuild.gradle– RinominareApplicationId (vecchionome->nuovonome)

• Nelmanifesto– Rinominarepackage(vecchionome->nuovonome)

• Nel filestrings.xml– <string name="app_name">NuovoNome</string>

• Clean,Rebuild

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Android StudioDebugger

• Permette– Eseguireun’app inmodalità“debug”

• Siaconl’emulatore checonunadevice reale

– Inseriredei“breakpoints”• Esaminare ilvaloredellevariabili

– Esecuzione“passo-passo”

• LLDB– Sec’ècodiceC/C++vieneusatoancheildebuggerLLDB

– Useremosoloildebugger Java

74

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Android StudioDebugger

• Build variant– Deveessere“debuggable”

• Build>Select Build Variant

• Perlanciarel’app inmodalitàdebug– Run>Debug (CTRL-ALT-D)– icona

• Selezionareladevice

75Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Android StudioDebugger

• Siaprelafinestradidebug– CMD-5

76

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Breakpoints

• Perinserire/eliminarebreakpoints– Clickadestradelnumerodiriga

• L’esecuzionesifermeràadognibreakpoint– Possiamocontrollarelostatodellamemoria– Continuarel’esecuzionepasso-passo,etc.

77Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Comandidebugger

• Valutaunaespressone

• Esecuzionediunasingolaistruzione

• Entraall’interno diunafunzione

• Escidallafunzione

• Riprendi l’esecuzionefinoalprossimobreakpoint

78

9/25/17

14

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Debugger

• Ispezione– Frames,stack dellechiamate– Variables,valorimemoria–Wacthes

79Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Messaggi dilog:Log.X

• privatestatic final String TAG="MyActivity”;

• Log.x(TAG,“messaggio”);

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

80

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Monitor

• Logcat–Messaggidilog

• Monitors– Usomemoria,CPU,reteeGPU

81

Screenshot

Videocapture

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Logcat

• Crash:stack trace– Favedere

• lalineadicodicechehacausatol’errore• lostack dellechiamate

82

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

83

Widgets

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Widgets 84

Widgets

9/25/17

15

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

ListView

• Widget specificoperle liste– dividel’areadisponibileinvarieposizione

• ilnumerodipendedall’areadisponibileedallagrandezzadiognielemento

• Glielementi vengonomemorizzati inunarray– solitamentesonodipiùrispettoalleposizionidisponibilinelwidget

– Sipuò“scorrere”lalista

• Adapter– fornisceglielementidavisualizzareinbasealloscorrimentoeffettuatodall’utente

85Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

ListView• Listasemplice

<ListViewandroid:id="@+id/mylistview”android:layout_width="wrap_content"android:layout_width="wrap_content”

</ListView>

• Filexmlperilsingoloelementodellalista

86

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="match_parent” android:layout_height="match_parent”><TextView

android:id="@+id/textViewList"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="" android:padding="10dp"android:textSize="22dp"/>

</LinearLayout>

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

ListView

• Definirel’arrayconglielementi– String [] array = {"Pasquale","Maria","Michele","Antonella", "Vincenzo",

"Teresa", "Roberto", "Rossella", "Antonio", "Luca", "Liliana", "Stefania","Francesca", "Andrea", "Marco", "Elisa", "Anna", "Lorenzo"};

• Definireunadapter– ArrayAdapter<String> arrayAdapter =

new ArrayAdapter<String>(context, R.layout.list_element, R.id.textViewList, array);

• Individuareilwidget listview– listView = (ListView)findViewById(R.id.mylistview);

• Associarel’adapter alwidget– listView.setAdapter(arrayAdapter);

87Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

ListView

• Definireunlistener periclicksuglielementi

listView.setOnItemClickListener(new OnItemClickListener() {

@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position, long id) {

String str = listView.getItemAtPosition(position).toString();// Fai qualcosa con l’elemento

…}

});

88

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

ListView

• ListView semplice– Ognielementoèunastringa

• ListView personalizzato– Ognielementohaunpropriolayoutcondeisottoelementi• es.nome,cognome,telefono,foto

– Ilclickèperòsututtol’elemento

• ListView personalizzatoconclickmultiplo– sipossonocliccareisingolielementi

89Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

ListView

• Perpersonalizzareglielementi– ilfiledilayout!– CustomAdapter

• Perilclickmultiplo– nonpossiamopiùusareillistener dellistview

• funzionapertutto l’elemento

– listeners ad-hocperognielemento• problema:nonsappiamopiùinqualeposizionedell’arraysiamo!!!

• trucchetto perrisolverlo: setTag, getTag

90

9/25/17

16

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

ListView 91

ListaSemplice

ListaCustom

ListaCustomMClick

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

92

Ciclo divita

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Ciclo divitadelle attività

• Ogni “Activity”haunciclo divita

Attivitànonesiste1. onCreate()2. onStart()3. onResume()Attivitàinesecuzione

4. onPause()5. onStop()6. onDestroy()Attivitànonesiste

• Eseguiti secondoundeterminato schema

93Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Ciclo divitadelle attività 94

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Ciclo divitadelle attività 95Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Ciclo divitadelle attività

• Quando l’utente preme il pulsante “Home”– vengono chiamate

• onPause()• onStop()

• Quando si ritorna all’attività– vengono chiamate

• onRestart()• onStart()• onResume()

96

9/25/17

17

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Ciclo divitadelle attività

• Quando l’utente ruota il dispositivo– l’attività viene primaeliminata:

• onPause()• onStop()• onDestroy()

– epoiricreata:• onCreate()• onStart()• onResume()

• onDestroy():perdita dello stato!!!!

97Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

onSaveInstanceState

• Sisalva lostato inonSaveInstanceState()

98

@Overridepublicvoid onSaveInstanceState(BundlesavedInstanceState) {

//Salvare lostato dell’appsavedInstanceState.putStringArrayList("LISTA_STRINGHE",array_di_stringhe);savedInstanceState.putInt("CONTATORE",counter) ;//Alwayscall thesuperclasssoitcansavetheviewhierarchystatesuper.onSaveInstanceState(savedInstanceState) ;

}

@Overrideprotectedvoid onCreate(BundlesavedInstanceState) {

…if (savedInstanceState!=null) {

array_di_stringhe= savedInstanceState.getStringArrayList("LISTA_STRINGHE");counter=savedInstanceState.getInt("CONTATORE");

}}

• Losi recupera inonCreate()

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Mainactivity 99

<activity android:name=".MainActivity"android:label="@string/app_name"><intent-f ilter><action android:name="android.intent.action.MAIN"/><category android:name="android.intent.category.LAUNCHER"/>

</intent-f ilter></activity>

ActivityLifeCycle

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Ciclo divitadelle attività

• AppCalcolatrice– Cosa succede seruotiamo il dispositivo?

100

Correggere l’errore nell’appCalcolatrice

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Backstack

• Un’app normalmente è fatta dipiù activity– ogni activityhauno specifico compito

• modularità

• Es.un’app perlaposta elettronica– un’attività perlascrittura delmessaggio– un’attività perspedire il messaggio– un’attività pervedere una lista dei messaggi– un’attività pervedere il contenuto diunmessaggio– ecc.

101Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Backstack

• Un’attività può lanciare un’altra attività– anche attività che appartengono adaltre app

• Class“Intent”– servealanciare una nuova attività e“passare”i datiall’attività che si lancia

– lavedremo fra poco

• Task– è uninsieme diattività concuil’utente interagisce

102

9/25/17

18

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Backstack

• Più attività possono coesistere,vengonoorganizzate inunbackstack

• Solitamente untaskpartedall’Home screen– l’utente clicca un’icona elancia un’attività– l’applicazione vienemostrata sulla schermo

• gergo tecnico: viene portata in“foreground”

• Sevengono lanciate nuove attività– l’attività corrente vienemessa nel backstack– l’utente cipuò tornare conil pulsante Back

103Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Backstack

• Continuando apremere Back si ritorna all’Home screen

104

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Foregroundebackground

• Untaskconlesueattività può essere spostato in“background”– quando l’utente inizia unnuovo taskoppure preme ilpulsante Home

– Leattività vengono messe instato distop,mail lorobackstack rimane intatto

105Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Istanze multiple

• Seun’attività può essere lanciata dapiù diun’altra attività si possono avere istanze multiple

106

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

MultiActivity

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

VisualizzaMappa

• Un’app che usa attività dialtre app– permette diinserire unindirizzo

• L’indirizzo può essere preso dallarubrica– sfrutta un’attività della rubrica– permesso perleggere larubrica!!!

• Visualizza lamappa– sfrutta un’attività dell’appGoogleMaps

107

VisualizzaMappa

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

108

Intent

9/25/17

19

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Classe Intent

• Intent– è una descrizione (astratta)diun’operazione dasvolgere

• Permette di– startActivity:lanciare una nuova attività– broadcastIntent:spedire l’intent inbroadcast

• verrà ricevuto dai BroadcastReceiver interessati

– startService obindService:comunicare conunservizio dibackground

109Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Intent

• Parti principale diunoggetto Intent– Action:l’azione dasvolgere

• es.ACTION_VIEW,ACTION_EDIT,ACTION_MAIN– Data:i dati su cuioperare espressi comeURI

• UniformResourseIdentifier:<schema>:<partespecifica>– “http://www.di.unisa.it/”– “mailto:[email protected]”– “geo:0,0?via+Posidonia+Salerno+Italy”– “tel:+391112223456”– “content://com.android.contacts/contacts”

• Esempi dicoppie (azione,dati):– ACTION_VIEW,content://contacts/people/1– ACTION_DIAL,content://contacts/people/1– ACTION_DIAL,tel:1112233

110

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Intent

• Altre parti diunintent– Category

• informazioni aggiuntive sull’azione daeseguire– es.CATEGORY_BROWSABLE significa che si può usare unbrowsercomeComponent

– Type• specifica inmodo esplicito il tipo (MIME)dei dati.Normalmente il tipo viene dedotto automaticamente

– Component• Specifica inmodo esplicito l’attività daeseguire (chealtrimenti verrebbe dedotta dalle altre informazioni)

– Extras• unbundlediinformazioni addizionali (dati specifici perl’attività).

111Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Intent

• Risoluzione esplicita– specifichiamo inmodo esplicito l’attività (Component)che vogliamo lanciare

• Risoluzione implicita– Component nonè specificata– Androidsceglie un’attività appropriata,inbasea

• Action• Type• URI• Category

– Leattività dichiarano leactionche possono soddisfarenel manifesto

112

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Intent

• Azione:ACTION_PICK– Chiede diselezionare unitem

• Data:– ContactsContract.Contacts.CONTENT_URI– “content://com.android.contacts/contacts”

• startActivityForResult– lancia l’attività chiedendo unrisultato– REQUEST_CODEserveadidentificare larichiesta

113

Intenti;i =newIntent(Intent.ACTION_PICK,ContactsContract.Contacts.CONTENT_URI);startActivityForResult(i, REQUEST_CODE);

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Intent

• onActivityResult– viene chiamato quando si ritorna all’attività dipartenza

– permette dicontrollare il risultato restituito• controlliamo il REQUEST_CODE• inquesto caso anche unflagdiOK• gestiamo i dati restituiti

114

@OverrideprotectedvoidonActivityResult(int request, int result, Intentdata) {

if (request==REQUEST_CODE &&result==Activity.RESULT_OK){…

9/25/17

20

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

IntentExtras

• Informazioni “extra”– coppie chiave-valore

• putExtra• getExtra

115

intent.putExtra(“CONTATORE”,c );intent.putExtra(“STRINGA”,”Ciao”);intent.putExtras(bundle); //Inserisce tutti i dati delBundlebundle

c=intent.getExtra(“CONTATORE”);stringa =intent.getExtra(“STRINGA”);Bundleb=intent.getExtras();

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

IntentFlags

• Informazione su comel’intent dovrebbe esseretrattato– Esempi:

• FLAG_ACTIVITY_NO_HISTORY– nonmemorizzare l’attività nello stackdelle attività

• FLAG_DEBUG_LOG_R ESOLUTION– stampa informazioni addizionali quando l’intent viene eseguito– moltoutile in fase didebugse l’intent che vogliamo fareseguirenonviene eseguito

116

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

IntentComponent

• Permette dispecificare l’attività “target”– dausare quandoc’è una solaspecifica attività(componente)che deve ricevere l’intent

117

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

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

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Intent 118

Quiz

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Quiz

• Cosa succede seruotiamo loschermo?– Unutente puòbarare sfruttandoquesto fatto

119

Correggere l’errore dovutoalle rotazioninell’appQuiz

Individuare ecorreggere glierroriecolmare leomissioni

• L’app Quizcontiene (volutamente)alcuni errorieomissioni

Andro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

120

Permessi

9/25/17

21

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Permessi

• Androidprotegge risorse edati conunmeccanismo dipermessi diaccesso

• Servono alimitare l’accesso a– informazionidell’utente (e.g.i contatti della rubrica)– servizi concosti (e.g.,invio SMS,chiamate tel.,accesso aInternet)

– Risorse disistema (e.g.,fotocamera,GPS)

121Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Permessi

• Vengono rappresentati dastringhe

• Ogni appdeve dichiarare nel manifestoi“permessi”che intende utilizzare

• L’utente deve accettare i permessi almomentodell’istallazione

122

<uses-permission android:name =“android.permission.CAMERA”/><uses-permission android:name =

“android.permission.INTERNET”/><uses-permission android:name =

“android.permission.ACCESS_FINE_LOCATION”/>

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Permessi

• Ipermessisonodivisi indueclassi– Normalie“pericolosi”

• Ipermessinormalivengonoconcessisenzachiederenullaall’utente

• Ipermessi“pericolosi” devonoessereapprovatidall’utente– quandosiistallal’app (API<23)– aruntime (API>=23)

123Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Permessinormali(API23,6.0)• ACCESS_LOCATION_EXTRA_COMMANDS• ACCESS_NETWORK_STATE• ACCESS_NOTIFICATION_POLICY• ACCESS_WIFI_STATE• BLUETOOTH• BLUETOOTH_ADMIN• BROADCAST_STICKY• CHANGE_NETWORK_STATE• CHANGE_WIFI_MULTICAST_STATE• CHANGE_WIFI_STATE• DISABLE_KEYGUARD• EXPAND_STATUS_BAR• FLASHLIGHT• GET_PACKAGE_SIZE• INTERNET• KILL_BACKGROUND_PROCESSES• MODIFY_AUDIO_SETTINGS

• NFC• READ_SYNC_SETTINGS• READ_SYNC_STATS• RECEIVE_BOOT_COMPLETED• REORDER_TASKS• REQUEST_INSTALL_PACKAGES• SET_TIME_ZONE• SET_WALLPAPER• SET_WALLPAPER_HINTS• TRANSMIT_IR• USE_FINGERPRINT• VIBRATE• WAKE_LOCK• WRITE_SYNC_SETTINGS• SET_ALARM• INSTALL_SHORTCUT• UNINSTALL_SHORTCUT

124

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Permessipericolosi(API23,6.0) 125

Gruppo Permesso

CALENDAR READ_CALENDAR

WRITE_CALENDAR

CAMERA CAMERA

CONTACTS READ_CONTACS

WRITE_CONTACTS

GET_ACCOUNTS

LOCATION ACCESS_FINE_LOCATION

ACCESS_COARSE_LOCATION

MICROPHONE RECORD_AUDIO

PHONE READ_PHONE_STATE

CALL_PHONE

READ_CALL_LOG

WRITE_CALL_LOG

ADD_VOICEMAIL

USE_SIP

PROCESS_OUTGOING_CALLS

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Permessipericolosi(API23,6.0) 126

Gruppo Permesso

SENSORS BODY_SENSORS

SMS SEND_SMS

RECEIVE_SMS

READ_SMS

RECEIVE_WAP_PUSH

RECEIVE_MMS

STORAGE READ_EXTERNAL_STORAGE

WRITE_EXTERNAL_STORAGE

• Quandol’app richiede unpermessopericoloso– sehagiàunpermessoperlostessogruppovieneconcessoautomaticamente

– altrimentivienerichiestoall’utente(dialog box)ilpermessoperilGRUPPO

9/25/17

22

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Threads

• Computazione parallela all’interno diunprocesso– Ogni threadhail proprio programcountered il propriostack

– condivide congli altri threaddelprocesso l’heap elamemoria statica

127

CPU1

t1

p1

t2

t3

t4

p2

t5

...

CPU2

p3

t6

t7

t8

p4

t9

...

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

128

Threads

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

JavaThreads

• Oggetti java.lang.thread• Implementano l’interfaccia runnable– devono averil metodovoidrun()

• Metodi che useremo– voidstart()– voidsleep(longtime)– voidwait()

• aspetta che unaltro oggetto chiami notify()su questooggetto

– voidnotify()

129Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Threads

• Perusare unthread:– Creare unoggetto Thread– Chiamare il metodo start()delthread

• che chiamerà il metodo run()

130

new

start()run()

APP(mainthread) Thread

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Threads 131

ThreadNo

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Threads

• Androidnonpermette ai threadinbackgrounddiinteragire conl’interfaccia utente

• Soloil mainthreadpuò farlo– Nonpossiamo aggiornare l’immagine nel threadcreato percaricare l’immagine

• Metodi– boolean View.post(Runnableaction)– voidActivity.runOnUiThread(Runnableaction)

132

9/25/17

23

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Threads 133

ThreadSi

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Async task

• Facilitano l’interazione fra backgroundthreademainthread

• Backgroundthread– esegue il task– notifica sullo statodiavanzamento

• Main(UI)thread– setupiniziale– displaydello statodiavanzamento– usa i risultati (es.mostrandoli sul display)

134

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

AsyncTask

• Classe JavagenericaclassAsyncTask<Params,Progress,Result>{…}

• Parametri– Params:tipo (didati)peril lavoro che deve svolgere

il backgroundthread– Progress:tipo (didati)usato perlostatodi

avanzamento– Result:tipo (didati)peril risultato deltask

135Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

AsyncTask.execute()

• voidonPreExecute()– eseguito nel mainthreadprimadidoInBackground()

• ResultdoInBackground(Params…params)– viene eseguito

• lista variabile diparametri• restituisce unoggetto ditipo Result

– può chiamare• voidpublishProgress(Progress…values)

• voidonProgressUpdate(Progress…values)– nel mainthreadinrisposta apublishProgress

• voidonPostExecute(Resultresult)– nel mainthreadDOPOdoInBackground() conil risultatodidoInBackground come parametro

136

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

AsyncTask 137

ThreadAsyncTask

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

138

Fragments

9/25/17

24

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Fragments

• Frammento– rappresenta una“porzione” dell’UI

• Unactivitypuò“ospitare”variframmenti– Iframmentipossono essereinseriti erimossidurante l’esecuzione

• SipossonocreareUIconmoltiframmenti– ancheinfunzione dellagrandezzadelloschermo

139Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Fragments

• Unframmentoèsempre“ospitato”daun’activity

• Unframmentoèunasortadisub-activity– hailsuociclodivita– cheèstrettamentelegatoaquellodell’activity

• es.sel’activity è inpausa(stato“paused”delciclodivita)losonoanchetuttiisuoiframmenti

• sel’activity è inesecuzione(stato“resumed”) allora iframmenti possonoessere gestiti

140

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Fragments

• LaporzionediUIoccupatadal frammentodeveesserespecificatanel layout– puòesseredefinitadinamicamente

141

Appuser Interface

Spazioperilframmento1

Spazioperilframmento2

Spazioperilframmento3

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Fragments

• Filosofiadiprogettazione– Interfacceutentedinamiche– inparticolarepersfruttareschermigrandi

• Esempiotipico– App chegestisceunelencodielementi

• es.titolidiarticolidiungiornale

– Ognielementopuòesserecliccatoperessereesaminato• es.visualizzazionedell’articolo

142

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Fragments

• Sipuòusare– unframmentoperl’elenco– unframmentoperlavisualizzazione

• Seloschermoèpiccolo– saràvisibilesolounodeiframmenti

• cliccandountitolosipasseràdalframmentotitolialframmento visualizzazione

• Seloschermoègrande– sarannovisualizzatientrambiiframmenti

143Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Fragments 144

9/25/17

25

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Creareframmenti

• IstanziareunoggettoFragment– laclasseFragment èsimileallaclasseActivity– propriociclodivita

145Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Creareframmenti

• Normalmentedovremoimplementarealmeno– onCreate()

• Inizializzazionecomeinunactivity• NONdefiniamoillayout

– onCreateView()• definiamoillayout.Ilmetododeverestituire unaView• facciamol’inflate diunfiledilayout

– onPause()• ilprimometodochiamatoquandoilframmentovieneeliminato(sidovrebbero rendere permanenti eventualicambiamenti altrimentisiperdono)

146

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Creareframmenti 147

public static class ExampleFragment extends Fragment {@OverridepublicView onCreateView(LayoutInflater inflater, ViewGroup view,

Bundle savedInstanceState){// Inflatethe layout forthis fragmentView v=inflater.inflate(R.layout.example_fragment, container, false);return v;

}}

• èl’equivalentedisetContentView nellaactivityhost– view èunoggettocheserveaspecificareiparametridilayout

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Fragments 148

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Creareframmenti• Unframmentopuòessereinseritostaticamentenellayout

149

<?xmlversion="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/andro id"android:orientation="horizontal"android:layout_width="match_parent"android:layout_height="match_parent"><fragment android:name=”com.example.news.ArticleListFragment"

android:id="@+id/list"android:layout_weight="1"android:layout_width="0dp"android:layout_height="match_parent" />

<fragment android:name="com.example.news.ArticleReaderFragment"android:id="@+id/viewer"android:layout_weight="2"android:layout_width="0dp"android:layout_height="match_parent" />

</LinearLayout>

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Creareframmenti

• Oppuredinamicamentearuntime

150

FragmentManager fm=getFragmentManager();FragmentTransaction ft =fragmentManager.b eginTransac tion();ExampleFragment fragment = newExampleFragment();ft.add(R.id.fragment_container, fragment);ft.commit();

• R.id.fragment_container– èunViewGroup nellayoutdell’activity cheindividualaporzionedelloschermodadedicareaquestoframmento

9/25/17

26

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Gestireiframmenti

• UsiamoilFragmentManager

151

FragmentManager fm=getFragmentManager();

• IniziamounatransazioneFragmentTransaction ft =fragmentManager.b eginTransac tion();

• Effettuiamoleoperazioni– inserireunframmento(giàvista)– rimuovereunframmento– sostituireunframmento

• Commitft.commit();

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Gestireiframmenti

• addToBackStack()– perinserireicambiamentinelbackstack

• Ilbackstack considerasololeactivity– dobbiamogestiremanualmenteiframmenti

• SenonchiamiamoaddToBackStack– quandopremiamoback“salteremo”icambiamentifatticoniframmenti

– nonèquellochel’utentesiaspetta

152

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Esempi 153

FragmentsLifecycle

FragmentsLifeCycleDyn

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Comunicareconl’activity

• Puòessereutilecomunicareconl’activity– Crearedeimetodidicallback

• Ades.ilframmentopuòdefinireuninterfaccia

154

publicstatic class MyFragment extends Fragment {...//ContainerActivitymustimplement this interfacepublicinterface OnArticleSelectedListener {

publicvoid onArticleSelected(int index);}...

}

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Comunicareconl’activity

• App– lista– dettaglielementi

• Frammento lista– devecomunicarel’elementoselezionato

• Frammentodettagli– devericeverel’informazione

• Evitare lacomunicazionediretta fraiframmenti– diminuisce lariusabilità

155Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Comunicareconl’activity 156

FrammentoA FrammentoBMainActivity

Portrait Activity

InterfacciaCommunicatorvoid respond

ImplementaCommunicator

setCommunicator {communicator =MainActivity

}

onCreate {A.setCommunicator(this )}

onItemClick{MainActivity.respond(index)}

respond(index){if (landscape){B.dettaglio(index)

}else{Newactivity(index)

}}

dettaglio(index){mostradettagliindex

}

9/25/17

27

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Frammentiebackstack

• Nuovaactivity perlamodalitàportrait– facilitalagestionedelbackstack– perleactivity èautomatica

• Frammentiebackstack– iframmentinonvengonoinseritinelbackstack– quandopremiamoilpulsanteback

• siritornaallaprecedente activity• saltandoeventuali cambiamenti dell’UIdovutiall’usodeiframmenti

– sesivuoleoccorregestireilbackstack manualmente

157Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Esempi 158

FragmentsCitazioni

FrammentiBackstack

FragmentCartelle

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Frammenti

• Esercizio(avanzato)

• L’app FragmentCartelle utilizzaunlayoutpredefinitodi12cartelle– quindipuògestirealmassimo12cartelle

• Scrivereunanuovaversioneincuiil layoutvienecostruito dinamicamente– crearenuoveview (LinearLayout,Frame,etc)– LayoutParameters– view.add()

159

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

160

Networking

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Networking

• Socket– Java.net

• HTTP– org.apache

• HttpRequest• Httpresponse

• Dataformats– JSON,XML

161Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Networking

• Classe InetAddress– permette digestire gli indirizzi IP

• InetAddress.getByName(“www.server.com”);• InetAddress.getByName(“11.22.33.44”);

• Restituisce l’indirizzo IP– stringa di32bitperIPv4– stringa di128bitperIPv6

162

9/25/17

28

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Networking

• classe Socket– crea il canale dicomunicazione conil server

• Socket(InetAddress addr,int port)– socket=newSocket(serverAddr,port);

• Perleggere escrivere– getInputStream(socket)– getOutputStream(socket)

163Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Networking

• Scrivere nell socket

• PrintWriter out=newPrintWriter(

newBufferedWriter(newOutputStreamWriter(

socket.getOutputStream())),true);//Autoflush

• out.println(strToSend);

164

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Networking

• Leggere dalsocket

• BufferedReader in=newBufferedReader(

new InputStreamReader(socket.getInputStream()));

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

165Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Networking 166

SocketRaw

SocketRawProgressBar

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

URLeHTTP

• Iltrasferimento dipagine webè l’operazione piùcomune– esistono delle classi apposite

• HttpURLConnection– openConnection()– getInputStream()

• epoisi procede comeprimaleggendo i datidallo stream

167Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

HTTP

• classe AndroidHttpClient

• classe HttpGet

• classe responseHandler

• cipermettono facilmente di– stabilire una connessione HTTP– inviare una richiesta GET– leggere larisposta

168

9/25/17

29

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Networking 169

SocketURL

SocketHTTP

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Documenti HTML

• Dati indocumenti HTML– difficile estrarli

• Esistono delle librerie che implementano ilparsingdidocumentl HTML– es.JSOUP

• Perutilizzare una libreria– procurarci il file.jar(es.jsoup-1-1.7.3.jar)–memorizzarlo nella cartella libdelprogetto– Aggiungere il filejarnella lista delle librerie

• Progetto -> Proprietà -> Java BuildPath->Librerie

170

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

JSoup

• Laclasse Jsoup permette– parsingdidocumenti HTML– estrarre singoli parti deldocumento

• Esempi:– Document doc=Jsoup.connect("http://en.wikipedia.org/").get();

– Element e=doc.getElementById(“id”);– Elements e =doc.select(“[class=id”);

171Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Networking 172

SocketJSoup

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

173

DataStorage

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

DataStorage

• Shared Preferences–datiprivati,coppiechiave-valore

• File–Fileprivatidell’app–Filepubblici(accessibilidaaltreapp)

• DatabaseSQLite–Datistrutturatiindatabaseprivati

174

9/25/17

30

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

SharedPreferences

• ClasseSharedPreferences– permettedisalvareerecuperaredatiusandocoppiedichiave-valore

• 2metodidellaclasseActivity– getSharedPreferences(“filename”)

• quandosivoglionousarepiùfiledi“preferenze”(dati)– getDefaultSharedPreferences()

• quandobastaunsolofile– restituisconounoggettoSharedPreferences

175

Attenzione anonusare getPreferences(senza “Shared”),che serveperpreferenze noncondivise conaltre activitydell’app.

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

SharedPreferences

• SharedPreferences obj;

• Leggereidati:is usa“get”– Boolean v = obj.getBoolean("KEY");

• Scrivereidati:serveun“editor”– losiottieneconilmetodoedit– SharedPreferences.Editor editor = obj.edit();

• Conl’editor sipuòusare“put”:– editor.putBoolean("KEY", bool_value);– editor.commit();

176

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

File

• Perogniapp ilsistemaoperativoprevedeunadirectoryprivata– solol’app puòaccedereaquestadirectory– sel’app vienedisinstallata,ladirectoryvienecancellata

• Percreareescrivereunfile1. ChiamareopenFileOutput(fileName, mode)• restituisce unFileOutputStream

2. Scriverenelfile(write())3. Chiuderelostream (close())

177Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

File 178

String FILENAME="hello_file";String string ="hello world!";

FileOutputStream fos=openFileOutput(FILENAME, Context.MODE_PRIVATE);fos.write(string.getBytes());fos.close();

• Lamodalitàpuòessere–MODE_PRIVATE(fileaccessibilesoloall’app)–MODE_APPEND–MODE_WORLD_READABLE(leggibiledatutti)–MODE_WORLD_WRITABLE(scrivibiledatutti)

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

File

• Perleggereunfile1. ChiamareopenFileInput(fileName)• restituisce unFileInputStream

2. Leggeredalfile(read())3. Chiuderelostream (close())

179

È possibile usare un file “statico” mettendolo nella directory“res/raw” dell’applicazione. Lo si può leggere usandoopenRawResource passando come argom ento l’identificatoreR.raw.<filename>. Il metodo openRawR esource res tituisce unInputStream che può essere usato per leggere il file.

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

File

• getFilesDir()– Restitusice ladirectoryprivatadell’app (dovevengonosalvatiifile)

• getDir()– Crea(oapreseesiste)unadirectoryall’internodellospazioprivatodell’app

• deleteFile()– cancellailfilenellospazioprivato

• filelist()– Restituisceunarraydifile,quellipresentinellospazioprivato

180

9/25/17

31

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Filetemporanei

• Perifiletemporaneisipuòusareunadirectorycache– Android cancelleràifileinquestadirectorySEnecessario(quandomancaspazio)

• getCacheDir()– restituisceladirectorycache– ècomunqueresponsabilitàdell’app cancellareifile– nonsidovrebbeusareladirectorycacheperfilegrandi(grandezzamassimaraccomandata1MB)

181Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

FilesuExternal Storage

• Android permette l’utilizzodiunamemoriaesterna– tipicamenteunaSDcard

• Filenellamemoria esternasonopubblici(world-readable)

• Occorrerichiedere ilpermessodilettura/scrittura

• Lamemoria esternapuòessere rimossa– quindinonsipuòassumereche ifilesianosempredisponibili

182

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

External Storage

• PermessoWriteincludeilpermessoRead

183

<manifest .. .><uses-permission

android:name="android.permission.WRITE_EXTERNAL_STORAGE”android:maxSdkVersion="18"

/>…

</manifest>

<manifest .. .><uses-permission

android:name="android.permission.READ_EXTERNAL_STORAGE”/>…

</manifest>

Apartire da Android4.4,per lo spazioprivatonon c’è bisognodipermessi.

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

External Storage 184

/*Checks if external storage is available forread andwrite */publicboolean isExternalStorageWritable() {

String state =Environment.getExternal StorageState();if (Environment.MEDIA_MOUNTED.equals(state)) {

returntrue;}returnfalse;

}/*Checksifexternal storage isavailabletoatleast read */publicboolean isExternalStorageReadable() {

String state =Environment.getExternal StorageState();if (Environment.MEDIA_MOUNTED.equals(state) ||

Environment.MEDIA_MOUNTED_READ_ONLY.equ als(state)) {returntrue;

}returnfalse;

}

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Condividerefileconaltreapp

• getExternalStoragePublicDirectory(type)– type:DIRECTORY_PICTURES, DIRECTORY_MUSIC ,DIRECTORY_RINGTONES, …

• Esempio:metodochecreaunanuovadirperdellefotonelladirpubblicadelleimmagini

185

public File getAlbumStorageDir(String albumName){//Get thedirectoryfor theuser's publicpictures directory.File file=new File(Environment.getExternalStoragePublicDirectory(

Environment.DIRECTORY_PICTURES),albumName);if (!file.mkdirs()) {Log.e(LOG_TAG,"Directorynotcreated");

}return file;

}

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

SQL– Quick tutorial

• Android fornisce supporto perdatabase SQL– Structured Query Language– Illinguaggiostandardper database relazionali

• Tavole– ognirigaèunelemento– ognicolonnarappresenta uncampo

186

ID Nome Cognome Esame Voto1356251 Giuseppe Verdi MP 301367288 Attilio Bianchi Algoritmi 255267712 Valentino Rossi MotoGP 307126714 Giuseppe Verdi Sicurezza 221562689 Marco Arancione MP 30

9/25/17

32

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

SQL– Quick tutorial

• Tavole– CREATE

• creaunanuovatavola (oanchealtro,es.view)– ALTER

• Modificauna tavola(oaltro)– DROP

• Cancellauna tavola• Contenuto

– SELECT• leggeunoopiù record (righe)diunatavola (oview)

– INSERT• Inserisceun record

– UPDATE• Modificaunoopiù record

– DELETE• Cancellaunoopiù record

187Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

SQL– Quick tutorial

• Chiaveprincipale– unacolonna(opiùcolonne)cheservedaidentificatoreunivocoperognirecord

• Esempiocreazionetavola:

188

SQL> CREATE TABLE CUSTOMERS (ID INT NOT NULL,NAME VARCHAR (20) NOT NULL,AGE INT NOT NULL,ADDRESS CHAR (25) ,SALARY DECIMAL (18, 2), PRIMARY KEY (ID)

);

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

SQL– Quick tutorial

• Esempidiinserimento

189

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', 1500.00 );

INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY) VALUES (3, ’Carla', 23, ’Palermo', 2000.00 );

INSERT INTO CUSTOMERS VALUES (4, ’Maria', 25, ’Roma', 6500.00 );

INSERT INTO CUSTOMERS VALUES (5, ’Pasquale', 27, ’Firenze', 8500.00 );

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

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

SQL– Quick tutorial

• Tavolaprodotta

190

ID NAME AGE ADDRESS SALARY1 Marco 32 Napoli 20002 Adele 25 Milano 15003 Carla 23 Palermo 20004 Maria 25 Roma 65005 Pasquale 27 Firenze 85006 Renato 22 Venezia 4500

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

SQL– Quick tutorial

• Esempidiselect

191

SELECT NAME, SALARY FROM CUSTOMERS;SELECT NAME, SALARY FROM CUSTOMERS WHERE SALARY > 5000;SELECT NAME, SALARY FROM CUSTOMERS WHERE SALARY > 5000 AND AGE < 26;SELECT NAME, SALARY FROM CUSTOMERS WHERE NAME LIKE ’M%’;SELECT NAME FROM CUSTOMERS ORDER BY NAME ASC;SELECT * FROM CUSTOMERS ORDER BY NAME, SALARY DESC;

SELECT ID, NAME, AGE, ADDRESS, SALARY FROM CUSTOMERS;

+----+----------+-----+---------+---------+| ID | NAME | AGE | ADDRESS | SALARY |+----+----------+-----+---------+---------+| 1 | Marco | 32 | Napoli | 2000.00 || 2 | Adele | 25 | Milano | 1500.00 || 3 | Carlo | 23 | Palermo | 2000.00 || 4 | Maria | 25 | Roma | 6500.00 || 5 | Pasquale | 27 | Firenze | 8500.00 || 6 | Renato | 22 | Veneia | 4500.00 |+----+----------+-----+---------+---------+

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

SQL– Quick tutorial• Esempidiupdate

192

UPDATE CUSTOMERS SET ADDRESS = ‘Salerno’ WHERE ID = 5

ID NAME AGE ADDRESS SALARY

1 Marco 32 Napoli 2000

2 Adele 25 Milano 1500

3 Carla 23 Palermo 2000

4 Maria 25 Roma 6500

5 Pasquale 27 Salerno 8500

6 Renato 22 Venez ia 4500

UPDATE CUSTOMERS SET SALARY = 1000.00;

ID NAME AGE ADDRESS SALARY

1 Marco 32 Napoli 1000

2 Adele 25 Milano 1000

3 Carla 23 Palermo 1000

4 Maria 25 Roma 1000

5 Pasquale 27 Salerno 1000

6 Renato 22 Venez ia 1000

9/25/17

33

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Database

• Android forniscesupportoperdatabaseSQL– soloall’internodell’app

• Perusareundatabase– CreareunasottoclassediSQLiteOpenHelper– sovrascrivereilmetodoonCreate()

• QuindisicreaunnuovoHelper:– dbHelper =new DatabaseOpenHelper(this);

• Dalquale siricavaundatabase– SQLiteDatabase db =dbHelper.getWritableDatabase();

193Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Database

• SuldatabasesipossonoapplicarecomandistandardSQL

• Ildatabase(tavola)vienecreato(comandoCREATE)nelmetodoonCreate()dellasottoclasseDatabaseOpenHelper

• Nell’app vengonousati:– db.insert()– db.delete()– db.update()

194

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Database 195

public class MyOpenHelper extends SQLiteOpenHelper {privatestatic final int DATABASE_VERSION=1;privatestatic final String TABLE_NAME="dictionary";privatestatic final String CREATE_CMD=

"CREATETABLE"+DICTIONARY_TABLE_NAME+" (" +KEY_WORD+"TEXT, "+KEY_DEFINITION+"TEXT);”;

MyOpenHelper(Context context){super(context,TABLE_NAME, null, DATABASE_VERSION);

}@Overridepublicvoid onCreate(SQLiteDatabase db) {db.execSQL(CREATE_CMD);

}@Overridepublicvoid onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {//override necessario

}}

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

DataStorage 196

DataStoragePreferences

DataStorageIntFile

DataStorage

DataStorageSQL

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

197

Grafica

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Grafica

• Un’immagine può essere disegnata in– unoggetto View

• grafica semplice,senza necessità dicambiamenti– unoggeto Canvas

• grafica complessa,aggiornamenti frequenti

• Classe Drawable– rappresenta unoggetto che puòessere disegnato

• un’immagine,maanche uncolore,una forma,etc• ShapeDrawable – una forma• BitmapDrawable – una matrice dipixels• ColorDrawable – uncolore (uniforme)

198

9/25/17

34

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Grafica

• L’oggetto Drawable deve essere inseritonell’oggetto View– direttamente nel fileXML– inmodo programmatico

• View.setImageDrawable()

199

GraficaSimpleImg

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Animazioni

• Androidpermette didefinire delle animazioni daapplicare alle immagini

• Descritte confileXML– rotazione– traslazione– scaling(dimensione)– trasparenza– concontrollo divari parametri

• es.,punto dipivot,velocità,etc.

200

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Animazioni

• ClassAnimation

• permette di– leggere leanimazioni dai fileXML– applicarle alle ImageView

201

GraficaImgAnim

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

CustomViews

• Androidhamolti widget– Pulsanti,Liste,ImageView,etc,etc.

• Peresigenze particolare possiamo definire deiwidgetpersonalizzati

• Permettono unmaggiore controllo sulla grafica– ovviamente sono più complicati dausare

202

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

AlberodelleView 203

LinearLayout

ImageViewLinearLayout

Button Button

Frame

RelativeLayout

Button ImageView

EditText

public class View {…

publicvoid onMeasure(…)publicvoid onLayout(…)…

}

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Meccanismodilayout

• “ContainerViews”– RelativeLayout– LinearLayout

• Ilmeccanismodilayoutiniziaquandovienechiamato ilmetodorequestLayout suunaViewdell’albero– solitamenteunwidget chiamarequestLayout quando

habisognodialtrospazio

• requestLayout mette uneventonellacodadeglieventiUI– Quando l’eventovieneprocessato,ognicontainerview

halapossibilitàdiinteragireconifigli

204

9/25/17

35

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Meccanismodilayout

• Ilprocessohaduefasi1. misuradelleviews contenutenelcontainer2. posizionamentodelleviews all’internodel

container

• Tutteleview devonoimplementarelafase1

• Soleleview containerdevonoavereanchelafase2

205Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Misura

• Lafasedimisuraoffrelapossibilitàalleviews dichiederelospaziodicuihannobisogno

• Android iniziailprocessochiamandoilmetodomeasure sullaradicedell’albero– apartiredallaradiceognicontainerview chiedeaifiglilospaziodicuihannobisogno

– larichiestasipropagaricorsivamente

• Measure èunmetodo“final”chenonpuòessereriscritto– onMeasure invecesì,vienechiamatodameasure

206

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

onMeasure() 207

public class MyView extends Views{MyView(Context context){super(context);

}…@Overridepublicvoid onMeasure(int widthMeasureSpec, int heightMeasureSpec) {setMeasuredDimension(

getSuggestedMinimumWidth(),getSuggestedMinimumHeigh());

}….

}

• onMeasure potrebbe essere chiamata varievolte!

• gli “int” contengono anche dei bitaddizionali

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

MeasureSpec

• width eheigth– inpixels

• widthMode eheigthMode–MeasureSpec.EXACTLY–MeasureSpec.AT_MOST–MeasureSpec.UNSPECIFIED

208

int widthMode =MeasureSpec.getMode(widthMeasureSpec);int width =MeasureSpec.getSize(widthMeasureSpec);int heightMode =MeasureSpec.getMode(heightMeasureSpec);int height =MeasureSpec.getSize(heightMeasureSpec);}

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Layout

• NellafasediLayoutleview containercomunicanolaposizioneeffettivaadogniviewfiglio

209

public class MyView extends Views{…@Overridepublicvoid onLayout (int x1, int y1,int x2, int y2){

Log.d("DEBUG","onLayout”);Log.d("DEBUG","coordinate x1="+x1+"y1="+y1+" x2="+x2+" y2="+y2);int smw =getSuggestedMinimumWidth();int smh =getSuggestedMinimumHeight();Log.d("DEBUG","onLayout smw="+smw+" smh="+smh);setMeasuredDimension(smw,smh); }

….}

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Disegnarenelcanvas

• Quandolaview èstataposizionataverràdisegnata–metodoonDraw

• OggettoPaintemetodidell’oggettoCanvas

210

public class MyView extends Views{…@Overridepublicvoid onDraw (Canvas canvas){//Codice perdisegnare laview

}….

}

9/25/17

36

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Esempi 211

GraficaCustomWidget GraficaCanvas

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Multitouch

• MotionEvent– rappresenta unmovimento registrato daunaperiferica• penna,trackball, mouse• dita sul display

• Ilmovimento è rappresentato con– ACTION_CODE

• cambiamento avvenuto

– ACTION_VALUES• Posizione epropietà delmovimento

– tempo, sorgente, pressione e altro

212

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Multitouch• Focalizziamo l’attenzionesul Multitouch

• Multitouch display– Permettono il rilevamento diuno opiù tocchi

• “Pointer”– il singolo evento (es.undito che tocca loschermo)

• UnMotionEvent rappresenta– unsingolo pointer– avoltepiù diunpointer

• inquesto caso possiamo accedere ai singolo pointerusando unindice

• Ogni pointerhaunIDunico pertutto il tempoincuiesiste– L’indice diunMotionEven multiplo NONè il pointer ID

• il pointerIDè costante• l’indice può cambiare per eventi successivi

213Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Multitouch

• MotionEvents ACTION_CODES:– ACTION_DOWN

• undito tocca loschermo ed è il primo

– ACTION_POINTER_DOWN• undito tocca loschermo manonè il primo

– ACTION_MOVE• undito che è sullo schermo si muovo

– ACTION_POINTER_UP• undito che è sullo schermo nonlotocca più

– ACTION_UP• l’ultimo dito sullo schermo viene alzato

214

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Multitouch 215

Remark Action IDPrimodito ACTION_DOWN 0

ACTION_MOVE 0Secondodito ACTION_POINTER_DOWN 1

ACTION_MOVE 0,1Primodito ACTION_POINTER_UP 0

ACTION_MOVE 1Secondodito ACTION_UP 1

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Multitouch 216

Remark Action IDPrimodito ACTION_DOWN 0

ACTION_MOVE 0Secondodito ACTION_POINTER_DOWN 1

ACTION_MOVE 0,1Secondodito ACTION_POINTER_UP 1

ACTION_MOVE 0Primodito ACTION_UP 0

9/25/17

37

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Multitouch 217

Remark Action IDPrimodito ACTION_DOWN 0Secondodito ACTION_POINTER_DOWN 1Terzodito ACTION_POINTER_DOWN 2

ACTION_MOVE 0,1,2Secondodito ACTION_POINTER_UP 1Primodito ACTION_POINTER_UP 0Terzodito ACTION_UP 2

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Multitouch

• Pergestire i MotionEvent:– getActionMasked()

• Restituisce l’Action Codedell’evento

– getPointerCount()• Numero dipointercoinvolti

– getActionIndex()• indice diunpointer

– getPointerID(intpointerIndex)– getX(int pinterIndex)– getY(int pointerIndex)– findPointerIndex(intpointerId)

218

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Multitouch

• Androidnotifica l’oggetto View– View.onTouchEvent(MotionEvent e)

• onTouchEvent()– deve restituire unBoolean

• true, sel’evento è stato consumato• false,altrimenti

• Oggetti che vogliono ricevere lanotifica– View.onTouchListener– View.setOnTouchListener()

219Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Multitouch

• onTouch– verrà invocata quanto c’è unevento

• finger down,upomovimento

• onTouch viene chiamata primache laViewvenga notificata dell’evento– anche onTouchdeve restituire unBoolean

• true, sel’evento è stato consumato• false,altrimenti

220

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Multitouch

• Spesso si halanecessità digestire unacombinazione dieventi

• Es.Ildoppio “click”equivale a– ACTION_DOWN– ACTION_UP– ACTION_DOWN– ACTION_UP– inrapida successione

221Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Multitouch 222

MultitouchExample

Fareinmodoche nonsipossa “uscire”dallo schermo.

Fareinmodoche icerchinonpossano sovrapporsi,segnalandoche duecerchisi sono toccaticambiano il loro colore.

9/25/17

38

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

GestureDetector

• Classe GestureDetector– permette diriconoscere dei gesti fatti sul display

• Alcuni gesti riconosciuti:– pressione semplice– doppia pressione (double“click”)– fling(scorrimento)

223

ADVANCEDTOPIC:è possibile anche definire deigestipersonalizzatiattraversounapposito tooldiAndroidepoi riconoscerli tramite ilGestureDetector

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

GestureDetector

• Bisogna creare unGestureDetector– che implementa l’interfaccia– GestureDetector.OnGestureListener interface

• Riscrivere (override)il metodo onTouchEvent– che viene chiamato inrisposta adungesto– questo metododelega il riconoscimentodelgesto almetodo GestureDetector.OnGestureListener

224

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

ViewAnimator eViewFlipper

• View Animator– classeperuncontenitoreditipoFrameLayout– animazionecambiamentofraview

• SimpleViewAnimator– sottoclassediViewAnimator– creaanimazionefra2opiùview delcontenitore– Solounaview pervoltavienevisualizzata– Puòanchecambiareviews adintervalliregolari

• metodi– showNext()– showPrevious()

225Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

GestureDetector 226

GestureFlip

Implementare ancheil flingperildecremento

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

227

Mediaplayer

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

MediaPlayer

• AudioManager– controlla lesorgenti audioel’output

• volume

• MediaPlayer– Playdiaudioevideo

• Sorgente dati– Risorse locali– URI(interni)– URL

228

9/25/17

39

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

MediaPlayer

• Playdiunfileinres/raw

229

MediaPlayer mediaPlayer =MediaPlayer.create(context,R.raw.sound_file);mediaPlayer.start(); //noneed tocallprepare();create()does that foryou

• PlaydiunfiledaURLString url ="http://.. . . . . . .";//yourURLhereMediaPlayer mediaPlayer =new MediaPlayer();mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);mediaPlayer.setDataSource(url);mediaPlayer.prepare(); //might takelong! (forbuffering, etc)mediaPlayer.start();

setDataSource()richiede lagestionediIOExceptionodiI llegalArgumentException

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

MediaPlayer 230

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

MediaPlayer 231

• Rilasciare larisorsa

mediaPlayer.release();mediaPlayer =null;

• mediaPlayer.start();• mediaPlayer.pause();• mediaPlayer.stop();

• Attenzione all’uso asincrono (prepareAsynch)– necessario per nonappesantire l’app– richiede più attenzione

• Playdafarein/dopo onPrepareListener.onPrepared()

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

MediaPlayer

• Audiofocus

• Poichè c’è unsolocanale dioutput– l’utilizzo dapartedipiù applicazioni può essere unproblema• es.sestiamo ascoltandomusica potremmo nonsentire l’arrivodiunmessaggio

• È possibile gestire l’accesso contemporaneo usandol’audio focus– un’app richiede l’audio focus perusare l’audio– seloperde deve osmettere disuonare oabbassare ilproprio volume

232

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

MediaPlayer 233

MusicPlayer

Inserire altribraninelMusicPlayer

Implementare lalista deibraniconunListView

Andro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

234

Sensori

9/25/17

40

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Sensori

• Molti smartphones,tablethanno sensori– dimovimento

• forze diaccelerazione edirotazione– accelerometri,bussola, giroscopio

– diambiente• temperatura, pressione,umidità

– termometri, barometri

– diposizione• posizione fisica

– magnetometro,bussola, giroscopio

• Forniscono dati “grezzi”– accuratezza dipende dalla qualità

235Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Sensori

• SensorManager cidice– sensori disponibili– caratteristiche delsingolo sensore

• range massimo• accuratezza• etc.

• cipermette di– leggere i dati grezzi delsensore– usare Listenerssuicambiamenti dei dati

236

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Sensori

• Pochi devicehanno tutti i tipidisensori– avoltepiù diunsensore dello stesso tipo– ecco unelenco parziale:

237

Sensore Tipo Descrizione

TYPE_ACCELEROMETER Hw Misura leforze inm/s2applicatealladevice( inclusa lagravità) nelle 3direzioni (x,y,z)

TYPE_AMBIENT_TEMPERATURE Hw Misura la temperaturadell’ambienteingradicentigradi

TYPE_GRAVITY Hw oSw Misura leforzedigravità sui 3assi (x,y,z)

TYPE_GYROSCOPE Hw Misura lavelocità dirotazioneinrad/snelle3direzioni (x,y,z)

TYPE_MAGNETIC_FIELD Hw Misura il campomagnetico suitreassi

TYPE_ORIENTATION Sw Misura larotazioneriferitaai 3assi

TYPE_RELATIVE_HUMIDITY Hw Misura la%diumiditàdell’ambiente

TYPE_LIGHT Hw Misura laluminositàdell’ambiente

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Sensori

• Coordinatefisse:seladeviceruota– il sistema diriferimento rimane fermo– cambieranno i valori letti sugli assi

238

y

x

z

y

x

z

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Sensori 239

public classSensorActivity extendsActivity implementsSensorEventListener{.. .

}

private SensorManagermSensorManager;.. .mSensorManager =(SensorManager)getSystemService(Context.SENSOR_SERVICE);if (mSensorManager.getDefaultSensor(Sensor.TYPE_LIGHT)!=null){

//Success!There'sanambientlightsensor.}else {

//Failure!Nolightsensor}

• L’attività deve implementare SensorEvenListener

• Poisi deve controllare seil sensore esiste

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Sensori 240

@OverrideprotectedvoidonResume(){super.onResume() ;mSensorManager.registerListener(this,mLight,SensorManager.SENSOR_DELAY_NORMAL);

}

@OverrideprotectedvoidonPause() {super.onPause() ;mSensorManager.unregisterListener(this) ;

}

• Velocità dicampionamento– SENSOR_DELAY_NORMAL(0,2sec)– SENSOR_DELAY_GAME(0,02sec)– SENSOR_DELAY_UI(0,06sec)– SENSOR_FASTEST(0sec)

• Registrazione erilascio inonResume eonPause– per evitare diconsumare labatteria

9/25/17

41

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Sensori 241

@Overridepublic f inalvoid onCreate(BundlesavedInstanceState) {….mSensorManager =(SensorManager) getSystemService(Context.SENSOR_SERVICE);mLight = mSensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);

}

@Overridepublicf inalvoid onAccuracyChanged(Sensorsensor,int accuracy) {//Dosomethinghereif sensoraccuracychanges.

}

@Overridepublicf inalvoidonSensorChanged(SensorEvent event) {//The lightsensorreturnsasinglevalue,Manysensorsreturn3values,oneforeachaxis.f loat lux=event.values[0];…

}

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Sensori 242

Accelerometro

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

243

Notifiche

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Notifications

• Notifiche:informazioniall’utentealdifuoridell’interfaccia graficadell’app– Toast– Dialog– NotificationArea(StatusBar)

244

Notifications

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

245

Alarms

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Alarms

• Permettono dieseguire intentinfunzione dispecifici eventi

• Un’applicazione che usa unalarmriesce adeseguire porzioni dicodice anche sel’applicazione è terminata

• Unalarmè attivo anche seil telefono va inmodalità disleep– l’alarm può causare laripresa dell’attività– oppure potrà essere gestito quando l’utente rimetteil telefono inmodalità normale

246

9/25/17

42

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Alarms

• Gli alarmsrimangono attivi fino aquando– vengono cancellati– laperiferica viene spenta

• Esempi dialarms– apppergli MMS:usa alarmpercontrollareperiodicamente i messaggi nonspediti (retryscheduler)

– Settings:usa unalarmperrendere laperiferica nonvisibile viaBluetoothdopo undeterminato tempo

247Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Alarms

• Perusare gli alarminun’app– AlarmManager

• Ottenere unriferimento all’AlarmManager:– getSystemService(Context.ALARM_SERVICE)

• Creare alarms– voidset(int type,longtriggerAtTime,PendingIntent i)– voidsetRepeating(…)

248

Apartire dall’API level19(KitKat) glialarmnonsono “esatti”:ilSOoperativopuòmodificare i triggerTime perminimizzarewakeupsel’usodella batteria

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

249

ContentProviders,Broadcast,Services

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

OltreleActivity

• 4 componentifondamentalidiAndroid– Activity– Broadcasts– ContentProviders– Services

• Finoraabbiamoparlatodelleactivity– servonoperlosviluppodelleapp!– Lealtrecomponentisonodiausilioeservonoincasiparticolari,mainalcunicasisonoestremamenteutili

• Nelleprossimeslidecisonodeicenni

250

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Broadcasts 251Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Contentproviders 252

9/25/17

43

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Services 253Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Broadcastedeventi

• Parleremo– dellaclasseBroadcastReceiver– dicomeun“ricevitoredibroadcast”deveessere“registrato”

– deimodiincuiglieventipossonoessereinviatiairicevitoridibroadcast

– dicomeiricevitoriricevonounanotificadiunevento

– dicomeiricevitorigestisconolanotifica

254

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

BroadcastReceiver

• serveperriceveree“reagire”adeventi– eventisonorappresentatidaIntents

• un“ricevitore”deve“registrarsi”dichiarandoglieventiaiqualièinteressato– es.esisteunBroadcastReceiver chehailcompitodispediremessaggiMMS

• Quandoun’altra componentecreaunMMSinviaunevento(Intent)– l’Intent vienemandatoinbroadcastalsistema– Ilricevitorelointercettaespedisceilmessaggio

255Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

BroadcastReceiver

• Ilricevitorericevel’Intent tramiteilmetodo– onReceive(Context c, Intent i)

• Riassumendo1. Il“ricevitore”si“registra”usandoregisterReceiver()

(disponibilenelLocalBroadcastManager o nelContext)2. L’eventovienecreato(daqualchealtra

componentedelsistema)3. Android notificailricevitorechiamandoonReceive()

256

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

RegistrazioneBroadcastReceiver

• Losipuòfare– staticamentenelManifestodell’app– dinamicamenteusandoregisterReceiver()

257

<?xmlversion="1.0"encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"…

<application…

<receiverandroid:name=”.My_Receiver"android:exported="false”<intent-filter>

<actionandroid:name=”it.unisa.mp.MY_ACTION"/></intent-filter>

</receiver></application>

</manifest>

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

RegistrazioneBroadcastReceiver

• Selaregistrazioneèstatica– ilricevitorevieneregistratoduranteilBootdelsistema(oppurequandol’app vieneistallata)

• Selaregistrazioneèdinamica– ilricevitorevieneregistratoquandosichiama

• LocalBroadcastManager.registerReceiver( )– per ibroadcastlocali all’app

• Context.registerReceiver()– per ibroadcastsystem-wide

• èpossibileancherevocarelaregistrazioneusandounregisterReceiver()

258

9/25/17

44

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Spedizionebroadcast

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

• Sesispecificaancheunastringadipermessol’intent verràconsegnatosoloairicevitori chehannoilpermesso– ilpermessolodeveaverel’appnelManifesto

259

sendBroadcast(Intent i) è disponibile sia nelLocalBroadcastManager che nelContext.Chiaramente si utilizza il primo per messaggi locali all’app ed il secondo permessaggi system-wide. sendBroadcast(Intent i, String permission) è disponibile solo nelContext.

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Esempi 260

BCastLocalBCastGlobal

• ACTION_TIME_CLICK– Intent inviatoogniminuto

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

BroadcastReceiver

• Esempidialtrieventiglobali.:– android.intent.action.AIRPLANE_MODE– android.intent.action.BATTERY_LOW– android.intent.action.DATA_SMS_RECEIVED– android.intent.action.DATE_CHANGED– android.intent.action.DEVICE_STORAGE_LOW– android.intent.action.TIMEZONE_CHANGED– android.intent.action.TIME_TICK– android.intent.action.USER_PRESENT– android.intent.action.WALLPAPER_CHANGED– …

261

Lista completa:sdk/platforms/android-19/data/broadcast_actions.txt

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

ContentProvider

• RappresentanoContenitori Dati– progettatipercondividereleinformazionifraleapplicazioni

• PeraccedereadunContentProvider siutilizzaunContentResolver– interfacciasimileaquelladiundatabase– comandiSQL-like

• QUERY, INSERT, UPDATE, DELETE, etc

– inpiù,notifichesucambiamentideidati

262

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

ContentProvider

• Perusareilresolver occorrerecuperareunsuoriferimentochiamando– Context.getContentResolver()

• ContentProviders standard– Browser(infosubookmarks,history)– CallLog(infosullechiamate)– Contact (infosuicontattipresentiinrubrica)–Media(listadeifilemultimedialiutilizzabili)– UserDictionary (listadelleparoladigitate)– …moltialtri

263Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

ContentProvider

• Idaticontenuti inunprovidersonomemorizzatiintabelle

• GliutentipossonofarriferimentoadunospecificoContentProvider usandounURI

• URI: content://authority/path/id– authority:specificailcontent provider– path:specificalatabella– id:specificaunparticolarerecord

264

9/25/17

45

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

ContentProvider

• EsempidiURI– content://com.android.contacts/contacts/

• Authorityècom.android.contacts

• Latabellarichiestaè“contacts”

• Nonc’ènessunID,quindil’URIidentifical’interatabelladeicontatti

265Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

ContentProvider

• Perottenereidatiusiamounaquery edunCursor

• ContentResolver.query()Cursor query(Uriuri,

String[]projection \\ colonneString selection \\ SQLselectionString[]args \\ SQLargsString sortOrder) \\ ordinamento

• RestituisceunCursor checipermettediiteraresull’insiemedirecordrestituiti dallaquery

266

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

ContentProvider 267

ContentProvider

• Esempio:leggerelarubrica<uses-permissionandroid:name="android.permission.READ_CONTACTS”/>

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Services

• Servonoaeseguireoperazionicomplessechepossonorichiederemoltotempo– es.scaricareunfiledInternet,sincronizzareinformazionilocaliconunserver

• Vedremo– LaclasseServices– comeusaredeiServicesesistenti– comedefiniredeinuoviServices

268

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Services

• Servicesnoninteragisconoconl’utente– nonc’èunaUI

• Servonopereseguiredelleoperazioniinbackground

• L’app interagisceconilservizio

• LaprimacosadafareèfarpartireilService– Context.startService(Intent i)

269Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Services

• Unavoltapartito,ilService puòcontinuarelasuaesecuzionefinoache ladevice èaccesa– potrebbeancheessereinterrottoseoccorronolerisorsecheessousa

– potrebbeancheterminarevolontariamente

• Nell’utilizzotipicounService fattopartiredaun’apptermina lapropriaesecuzionedopoavereseguitol’operazione richiesta

• perdefault,il Servicegiranelmain thread dell’appcheloha fattopartire– inalcunicasideveessereesplicitamentefattogiraresuunthread separato

270

9/25/17

46

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Services

• Lecomponenti chevogliono interagireconun Servicedevono effettuareun “bind”– Context.bindService(Intent service,

ServiceConnection conn,int flags);

• Ilbinding permettedi– inviare richieste– ricevere riposte

• Sealmomento dellerichiesta dibind ilServicenon èancora attivo– viene fatto partire– rimane attivofinoaquandoc’èalmenounclientconnesso

271Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Services 272

<?xmlversion="1.0"encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"…

<application…

<serviceandroid:name=”MyService”

</servicer></application>

</manifest>

• OccorredichiarareilServicenelManifesto:

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Services 273

ServiceSimple

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

Services

• Nell’esempio vistoilservizioènellastessaappdelclient

• Perapprofondire iService:

274

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

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

275

Finedelcorso!

Slide

And ro id Mobi leP rogramming– P ro f.R .DeP risco Un iversi tàd i Salerno - a.a.2 0 1 7 -2 01 8

BuonNatale! 276