slides2017 - unisarobdep/mp/slides/slides2017.pdfandroid mobile programming –prof. r. de prisco...
Post on 27-May-2020
18 Views
Preview:
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– robdep@unisa.it
• 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:robdep@unisa.it”– “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
top related