Sistemi Embedded per il Mobile Multimedia La piattaforma Android [email protected] [email protected] Bibliografia Free ● http://developer.android.com/ ● http://punto-informatico.it/PILibri/Dettaglio.aspx?id=238 Books ● Android Guida per lo Sviluppatore, APOGEO ● Beginning Android 3, APRESS ● Advanced Android Development, MURPHY Agenda ● ● ● ● Introduzione ad Android: contesto, storia e confronto con altre piattaforme, caratteristiche Architettura: Applicazioni, Application Framework, Librerie, Android Runtime, ... Dalvik Virtual Machine: confronto con JVM, gestione della memoria, bytecode Strumenti di Sviluppo: SDK, Emulator SISTEMI EMBEDDED Lezione n. 1: Introduzione ad Android La rivoluzione dei dispositivi mobili 1/2 Il dispositivo che fino a qualche anno fa chiamavamo cellulare oggi è a tutti gli effetti un Personal Computer. La vera rivoluzione dal punto di vista degli utenti consiste nel fatto che uno smartphone è molto più Personal di un PC perché ci segue ovunque. Gli sviluppatori possono finalmente creare applicazioni che non devono fare più i conti con il concetto di "risorse limitate". 5 La rivoluzione dei dispositivi mobili 2/2 Dal punto di vista dei produttori la rivoluzione consiste nel fatto che in passato ogni produttore di dispositivi mobili ha realizzato un proprio sistema operativo, ambiente di sviluppo, linguaggio, tool: nessuno si è affermato come standard. Il progetto Android nasce quindi da una esigenza di standardizzazione su iniziativa di Google. http://www.android.com/ 6s Cosa è Android? Android è la prima piattaforma software open per dispositivi mobile Android è uno stack software per dispositivi mobili ed include un sistema operativo, un middleware ed un insieme di applicazioni chiave. Android è stato sviluppato da Google Inc. e da un consorzio di aziende chiamato Open Handset Alliance 7 Perchè Open? E' open perchè: ● ● Utilizza tecnologie open (linux kernel) Le librerie e le API utilizzate per realizzare Android sono le stesse che possiamo usare per le nostre applicazioni Il kernel linux è rilasciato sotto GNU General Personal Licence (GPL). La piattaforma Android è rilasciata sotto Open Source Apache Software Licence 2.0 (ASL). 8 Open Handset Alliance http://www.openhandsetalliance.com ● Operatori mobili: Telecom, Vodafone, T-Mobile... ● Produttori di chip: Arm, Intel, NVIDIA... ● ● ● Produttori di telefonini: Toshiba, HTC, Acer, Sony,... Aziende sviluppatrici di software: Google, eBay, Omron, ... Aziende di commercializzazione: Accenture, Aplix... 9 Un po' di storia 10 G1 T-Mobile Processor Qualcomm® MSM7201A™, 528 MHz RAM: 192 MB Storage: Flash Memory 256 MB Display 3.2'' Supporto 3G UMTS/HSDPA a 7,2 Mbps 11 Platforms 1/2 12 Platforms 2/2 Fonte: developer.android.com Aggiornato al 01/10/2012 13 Requisiti Minimi 1/2 I requisiti minimi di ogni versione rilasciata, sono definiti mediante l'Android Compatibility Program che consiste di tre componenti chiave: Il codice sorgente dello stack software Android ● Il “Compatilbility Definition Document”, che descrive le specifiche di compatibilità ● La “Compatilbility Test Suite”, che rappresenta il "meccanismo" di compatibilità ● I più recenti ACP si riferiscono alla 4.0.3 e alla 2.3 ● 14 Requisiti Minimi 2/2 Per Android 2.2 alcuni dei requisiti minimi sono: Memoria >= 128MB (kernel) + 150MB (/data) + 1GB (Application/SD Card) FotoCamera >= 2 megapixel Display >= 2,5'' Per Android 4.0 alcuni dei requisiti minimi sono: Memoria >= 340MB (kernel) + 350MB (/data) + 1GB (Application/SD Card) FotoCamera >= 2 megapixel Display >= 2,5'' 15 Codice Sorgente di Android ● ● ● Il codice sorgente di Android può essere scaricato seguendo le indicazioni descritte in http://source.android.com/source/downloading.html Le ultime versioni di Android per le quali è disponibile il codice sorgente sono la 4.0 (API level 14) e la 2.3 (API level 9) 16 Caratteristiche principali 1/3 ● ● ● ● Android include un ”application framework” che permette il riutilizzo dei componenti sviluppati. La Dalvik Virtual Machine è ottimizzata per l'esecuzione su dispositivi mobili. Il browser web integrato è basato sul software open-source ”WebKit”. La grafica 2D è basata su una libreria appositamente sviluppata. 17 Caratteristiche principali (2/3) ● ● ● ● La grafica 3D è basata sulla specifica OpenGL ES 1.0 e l'accelerazione hardware è opzionale. Per l'immagazzinamento strutturato di dati si usa SQLite. Sono supportati i più comuni formati audio e video (MPEG4, H.264, MP3, AAC, AMR, JPG, PNG, GIF). Supporta la telefonia GSM. 18 Caratteristiche principali (3/3) ● ● ● A seconda dell'hardware può supportare anche EDGE (2.5G), UMTS (3G), Bluetooth e Wi-Fi. Prevede anche il supporto per fotocamera, GPS, bussola e accelerometro. Fornisce un ricco ambiente integrato di sviluppo che include un emulatore, strumenti per il debugging e per il profiling di memoria e prestazioni, ed un plugin per l'IDE Eclipse per sviluppare applicazioni in linguaggio Java. 19 Architettura di Android 20 Componenti del sistema I componenti mostrati nel precedente schema dell'architettura verranno ora analizzati uno ad uno: ● Applicazioni ● Application Framework ● Librerie ● Android Runtime ● Kernel Linux 21 Applicazioni Android dispone di base di un insieme di applicazioni che includono un client email, un programma per la gestione degli SMS, agenda, rubrica, mappe, un browser web e altre. Tutte le applicazioni vengono scritte utilizzando il linguaggio di programmazione Java. 22 Application Framework ● ● ● ● Gli sviluppatori hanno pieno accesso alle stesse API del framework che vengono utilizzate dalle applicazioni di base. L'architettura delle applicazioni è progettata per semplificare il riutilizzo dei componenti. Ogni applicazione può pubblicare le sue capabilities e le altre possono farne uso. Questo stesso meccanismo fa sì che l'utente possa rimpiazzare alcuni componenti. 23 Servizi dell'Application Framework (1/2) L'Application Framework fornisce alle applicazioni i seguenti servizi: ● ● Un insieme di Views completo ed estensibile che include liste, griglie, text-box, pulsanti e perfino un browser web integrato nell'applicazione. I Content Provider permettono alle applicazioni di accedere ai dati di altre applicazioni (es. la rubrica) o di mettere in condivisione i loro stessi dati. 24 Servizi dell'Application Framework (2/2) ● ● ● Un Resource Manager che fornisce l'accesso alle risorse esterne al codice, come stringhe localizzate, grafici e file di layout. Un Notification Manager permette a tutte le applicazioni di mostrare avvisi personalizzati sulla barra di stato. Un Activity Manager che gestisce il ciclo di vita delle applicazioni. 25 Librerie Native (1/4) ● ● ● Sono librerie scritte in C/C++ che rappresentano il core di Android e sono usate dai vari componenti del sistema. Le capabilities di queste librerie sono esposte agli sviluppatori sempre attraverso l'Application Framework. La libreria più importante è senz'altro la Standard C Library (libc) derivata dalla sua implementazione BSD e ottimizzata per l'esecuzione su dispositivi embedded. 26 Librerie Native (2/4) ● ● Il Media Framework (librerie multimediali) sono basate su OpenCORE di PacketVideo e supportano la riproduzione e la registrazione di vari formati audio/video. Il Surface Manager gestisce l'accesso al sottosistema di visualizzazione su schermo e senza sforzo da parte del programmatore compone livelli di grafica 2D e 3D provenienti da varie applicazioni. 27 Librerie Native (3/4) ● ● ● WebKit (LibWebCore) è il motore di browser alla base sia del browser principale di Android che delle web view integrate nelle applicazioni. SGL è l'engine grafico 2D. Le librerie 3D implementano la API OpenGL ES 1.0 e 2.0 e possono utilizzare sia l'accelerazione hardware (se disponibile) sia una implementazione software ottimizzata. 28 Librerie Native (4/4) ● ● ● La liberia FreeType fornisce il rendering per i font bitmap e vettoriali SQLite è un potente e leggero motore di database relazionale disponibile per tutte le applicazioni, per la memorizzazione di qualsiasi tipo di dato strutturato SSL è la libreria per la gestione dei Secure Socket Layer. 29 Android Runtime ● ● ● L'Android Runtime si compone delle Core Libraries e della Dalvik Virtual Machine. Le Core Libraries forniscono molte delle funzionalità delle analoghe librerie disponibili per il linguaggio di programmazione Java. Ogni applicazione Android gira in un suo proprio processo, con la sua istanza della Dalvik Virtual Machine (VM). 30 Core Libraries ● ● Rappresentano un insieme di librerie molto ”vicine” alla Dalvik Virtual Machine ed estratte in parte dal progetto Apache Harmony (2007) ed in parte appositamente adattate Sono distribuite in tre categorie: ● DalvikVM specific libraries (System Info, Debugging) ● Java Compatibility libraries (Base and utility classes) ● Thirty Part Libraries (Apache HttpClient 4.0) 31 Dalvik VM (1/2) ● ● ● La Dalvik VM è stata ottimizzata in modo che uno stesso dispositivo embedded sia in grado di eseguirne più istanze in modo efficiente. La Dalvik VM esegue un bytecode incompatibile con quello della Java VM e che viene detto Dalvik Executable (.dex), ottimizzato per avere una occupazione di memoria minima. La Dalvik VM è register-based (mentre la Java VM è stack-based). 32 Dalvik VM (2/2) Il ciclo di sviluppo prevede che una applicazione venga dapprima sviluppata in Java, e successivamente un tool (dx) converte i file .class, ottenuti dalla normale compilazione java, in file ottimizzati .dex 33 Kernel Linux ● ● Android si basa sul kernel Linux (la versione 4.1 è basata sul kernel 3.1.10) per i servizi di base come la sicurezza, la gestione della memoria, la gestione dei processi, lo stack di rete e il modello dei driver. Il kernel funge anche da livello di astrazione tra l'hardware e il resto dello stack software. In questo livello avviene la gestione dei driver dell'hardware (videocamera, display, memoria flash, la scheda wireless...) 34 Conclusioni In questa lezione abbiamo visto una prima panoramica di Android, le sue caratteristiche principali e le varie parti che compongono la sua architettura. 35 Sistemi Embedded - Android Lezione n. 2: Piattaforme per Dispositivi Mobili Piattaforme per dispositivi mobili (Passato) Fino ai primi anni 90 non si può parlare di piattaforme ma di Sistemi Embedded ● 1996 ● ● ● Palm OS ● Windows CE 2000 ● Symbian ● Windows Pocket PC 2006 ● Java ME 37 Piattaforme per dispositivi mobili (Presente) Attualmente le più diffuse piattaforme per dispositivi mobili sono: ● Windows Phone 7 ● iOS 6 ● Blackberry (Java ME + API BlackBerry) ● Android 38 Mercato USA Gen-Mar 2012 fonte: comscore.com 39 Previsione Mercato USA 2015 fonte: gartner's 40 Previsione mondiale 2011-2015 fonte: idc.com 41 Blackberry ● ● ● I telefoni Blackberry di RIM (Research-InMotion) sono prodotti diffusi da anni nell'ambito enterprise. Sono specializzati nella gestione della posta elettronica in modalità ”push”. Sebbene siano sempre considerati prodotti all'avanguardia, sono sempre stati utilizzati solo nell'ambito aziendale e non hanno quindi avuto una grande diffusione nel mercato consumer che garantisce i volumi più elevati. 42 Sistemi Operativi per Smartphone ● ● ● Di conseguenza nei prossimi anni la vera lotta tra i sistemi operativi per smartphone avverrà fra quattro grandi concorrenti: Windows Phone, iOS e Android. Dietro questi sistemi operativi si celano i colossi del mondo IT, ovvero Microsoft, Apple, Google, Nokia(?), Samsung . Seguendo l'esempio di Google anche Nokia ha dichiarato che ben presto anche Symbian diventerà open-source (come conseguenza all'allenza con Microsoft). 43 Confronto tra SO:strumenti di sviluppo ● ● Per tutte le piattaforme prese in considerazione l'SDK che permette lo sviluppo di applicazioni è liberamenente disponibile. Riguardo ai linguaggi di programmazione da adoperare, per Windows Mobile è possibile utilizzare indifferentemente C++, C# e VB.NET. ● Per Symbian si usa C++. ● Per iOS si usa Objective-C. ● Per Android e BlackBerry si usa Java. 44 Confronto tra SO: distribuzione applicazioni ● ● Tutte le piattaforme provedono: un App Store ufficiale (Apple-iTunes App Store, Android Market, Nokia-Ovi Store, Windows Phone MarketPlace e BlackBerry-App World) dal quale è possibile scaricare programmi gratuiti o a pagamento. L'installazione tramite PC è prevista da Windows mediante il WMDC, Nokia con il Nokia OVI Suite, Android Platform per Android e BlackBerry mediante il Desktop Manager . 45 Piattaforme Mobile in arrivo ● Open Source – Linux based ● Open Source – Linux based ● Closed Source, Cloud based – Android Fork 46 Conclusioni In questa lezione abbiamo elencato le principali piattaforme alternative per lo sviluppo di applicazioni per terminali mobili. 47 Sistemi Embedded - Android Lezione n. 3: Android VS Java Introduzione In questa lezione vedremo quali sono le differenze principali tra Android e le varie versioni di Java. Linguaggio Java e VM ● ● Quando si parla di Java bisogna subito chiarire se ci si riferisce al linguaggio di programmazione oppure alle varie versioni di librerie e Virtual Machine. Dal punto di vista del linguaggio di programmazione, Android si basa al 100% sul linguaggio di programmazione Java ed in particolare richiede la presenza del JDK 5 o 6 per permettere lo sviluppo con Eclipse o altri IDE. Versioni di Java 1/2 JAVA EE Enterprise Edition JAVA SE Standard Edition JAVA ME Connected JAVA ME Limited (CDC) (CLDC) per la creazione di servlet per il mondo dei web service per la creazione di applet e applicazioni per il mondo desktop per la creazione di Xlet per dipositivi mobile sempre connessi per la creazione di Midlet per dispositivi mobile limitatamente connessi CDC = Connected Device Configuration CLDC = Connected Limited Device Configuration Non solo Java Google fornisce agli sviluppatori due ulteriori strumenti per lo sviluppo di applicazioni: ● ● Scripting Layer for Android (SL4A): supporto ai più diffusi linguaggi di script (JavaScript, Python, Perl, JRuby, Lua) per lo sviluppo di applicazioni Android Native Development Kit (NDK): sviluppo di applicazioni in codice nativo (C/C++) Versioni di Java 2/2 Processori da 32bit Memoria da 2MB + 2,5MB JVM KVM JAVA JAVAME MECDC CDC JAVA JAVAME MECLDC CLDC >= 512 KB >= 128 KB Memoria java >= 256 KB >= 32 KB Memoria runtime JAVA JAVAEE EE Enterprise Enterprise Edition Edition JAVA JAVASE SE Standard Standard Edition Edition Processori da 16bit Memoria da 40Kb + 20Kb API Java Java EE Java SE Java ME CDC Java ME CLDC CDC e CLDC possono supportare API Java esterne a Java SE. Come conseguenza si potrebbe avere un programma Java che viene eseguito correttamente su Desktop, ma non vi sono garanzie che sia eseguito anche su dispositivi che supportano solo ME JavaME e Android 1/3 ● ● Configurazioni: JavaME supporta due classi di micro-dispositivi e offre soluzioni standardizzate per ognuna di esse . Android supporta una sola classe e non è possibile eseguirlo su dispositivi ”limitati” Comprensibilità: Android è pensato per un unico modello di dispositivo e quindi utilizza una UI ”adattabile”. JavaMe dispone di modelli di UI differenti per device: MIDlets, Xlets, AWT e Swing: include più di 20 JSR (Java Specification Request) JavaME e Android 2/3 ● ● Reattività: La DVM è maggiormente ottimizzata e più reattiva se paragonata alla JVM su uno stesso dispositivo. In realità dovremmo paragonare la DVM alla KVM ma ciò non è possibile perchè questa è pensata per dispositivi di basso profilo. Compatibilità con JAVA: a causa della DVM, Android esegue solo bytecode .dex e non java: è sempre possibile compilare il codice Java in standard Java Class, pur non essendo possibile eseguirne direttamente il bytecode. JavaME e Android 3/3 ● ● Scelta: JavaME è ampliamente supportato in quanto diffuso su moltissimi dispositivi mobili, ma l'uniformità, il costo e la facilità nello sviluppo fanno migrare ogni giorno molti programmatori Java verso Android. Supporto JavaSE: se paragonato al supporto di JAVAME-CDC, il supporto di Android a JavaSE è più completo, fatta eccezione per AWT e Swing. Android e Dalvik VM ● ● Google ha quindi preso un sottoinsieme delle librerie JAVA, (poi delle Apache Harmony 2007), ha aggiunto alcuni propri package specifici per l'utilizzo in dispositivi mobili e ha definito un proprio formato bytecode ottimizzato per ridurre al minimo l'occupazione di memoria. La macchina virtuale in grado di eseguire questo bytecode come detto si chiama Dalvik VM, e non essendo una macchina virtuale Java ME non è previsto il pagamento di nessuna royalty. Confronto tra le API ● ● ● Cercheremo adesso di fare un rapido confronto tra le API di Java SE e quelle di Android. Elencheremo prima quelle supportate anche in Android che possono essere quindi utilizzate senza modificare eventuale codice già scritto in linguaggio Java. Successivamente elencheremo quelle che sono state rimosse e magari sostituite da altre ritenute migliori. API estese di Java SE supportate in Android ● javax.crypto ● javax.net ● javax.security ● javax.sound ● javax.sql ● javax.xml.parsers ● org.w3c.dom (tranne i sotto-package) ● org.xml.sax API di Java SE NON supportate in Android 1/2 ● java.applet ● java.awt ● java.beans ● java.lang.management ● java.rmi API estese di Java SE NON supportate in Android (1/2) ● javax.accessibility ● javax.activity ● javax.imageio ● javax.management ● javax.naming ● javax.print ● javax.rmi ● javax.security.auth.kerberos ● javax.security.auth.spi ● javax.security.sasl API estese di Java SE NON supportate in Android (2/2) ● javax.swing ● javax.transaction ● javax.xml (tranne javax.xml.parsers) ● org.ietf.* ● org.omg.* ● org.w3c.dom.* (i sotto-package) Java ME ● ● ● Java ME viene attualmente considerato quasi obsoleto, in quanto presenta potenzialità molto ridotte e non supporta molte delle tecnologie che sono state sviluppate negli ultimi anni. Sebbene sia stato sviluppato da Sun Microsystems con molte ambizioni, non è mai riuscito ad uscire dalla nicchia dei videogiochi. Non viene considerato un sistema operativo per ”smartphone”, ovvero telefoni con funzionalità simili a quelle di un PC. Conclusioni In questa lezione abbiamo visto le differenze principali le API di Java e quelle di Android. Sistemi Embedded - Android Lezione n. 4: La macchina virtuale Dalvik SEMM2013 Introduzione In questa lezione tratteremo della macchina virtuale Dalvik, ottimizzata da Google per l'esecuzione su dispositivi mobili. SEMM2013 Perché una VM? ● ● ● Quando nacque Java venne coniato lo slogan ”Write once, run everywhere”, ovvero ”scrivi il programma una volta e poi lo esegui su qualunque dispositivo”. Questo avviene perché la macchina virtuale è uno strato software che astrae l'hardware sottostante, mettendo a disposizione del bytecode una macchina sempre uguale. Android, come anticipato usa un approccio simile, e la sua VM si chiama Dalvik. SEMM2013 Requisiti per Dalvik ● ● La Dalvik VM è stata progettata da Dan Bornstein, ingegnere di Google originario della città di Dalvik in Islanda. I requisiti che a Dan Bornstein sono stati imposti per la progettazione di questa Virtual Machine sono stati la capacità di girare su un sistema con una CPU lenta, con poca memoria, con un sistema operativo senza area di swap e il tutto alimentato solo da una batteria ed un application runtime di tipo “sandbox”. SEMM2013 Il problema della memoria ● ● ● Inizialmente, nella progettazione della DVM, si è supposto di avere a disposizione un tipico smartphone con soli 64 MByte di memoria. Questo spazio dopo l'avvio del kernel Linux si riduce a 40 MByte, che diventano 20 dopo l'avvio dei servizi di alto livello. Si è visto inoltre che la libreria C standard (libc) è molto vasta e occupa circa 10 Mbyte. SEMM2013 Java versus Dalvik fonte: oreilly.com SEMM2013 Dalvik Executable ● Un primo lavoro che è stato fatto è stato quello di specificare un formato (dex o Dalvik Executable) in grado di risparmiare spazio rispetto al bytecode di Java: SEMM2013 Confronto tra bytecode ● ● ● Utilizzando questo nuovo formato si ottengono già dimensioni del bytecode molto ridotte. Ad esempio le librerie di sistema, rispetto al 100% originario, diventano grandi il 50% quando compresse da Java in formato JAR e 48% in formato dex non compresso (non richiede decompressione). L'applicazione browser passa invece dal 100% originario e 49% compresso in JAR a solo il 44% in formato dex non compresso. SEMM2013 Separazione della memoria ● ● ● ● Un altro accorgimento adottato in Dalvik rispetto a Java è la separazione della memoria nel momento in cui avviene una chiamata di sistema fork(). A differenza di quanto accade in Java, ogni applicazione Android ha un proprio processo ed una propria istanza della DVM. La DVM è stato progettata in modo tale che un dispositivo possa eseguire molte VM in maniera efficiente. Anche il meccanismo di Garbage Collector di ogni applicazione deve essere indipendente. SEMM2013 Efficienza ● ● ● Per quanto riguarda la CPU si è supposta una frequenza compresa fra i 250 e i 500 MHz, con un bus di sistema a 100 MHz e una cache dati di 16 o 32 KByte. Inizialmente (fino alla 2.1) la DVM non supportava la compilazione Just-In-Time (JIT) perché si pensava non necessaria poiché per i calcoli più impegnativi (grafica e codec audio/video) erano presenti dei coprocessori ed in ultima istanza si poteva ricorrere alla JNI (Java Native Interface). Dalla versione 2.2 di Android la DVM possiede un Just-In-Time (JIT) compiler. SEMM2013 Installazione Nel momento in cui si installa nel sistema una nuova applicazione Android vengono eseguite le seguenti operazioni: ● ● Per sicurezza si effettua la verifica che tutti gli indici interni ai file dex siano corretti. Anche se non si utilizzano tecniche JIT il codice viene ottimizzato ad esempio spostando i dati dove conviene averli e ricopiando alcune funzioni che conviene avere ”inline”. SEMM2013 VM basata su stack o su registri? ● ● ● ● La Java VM è stack-based, ovvero tutte le operazioni agiscono sugli operandi che stanno sulla cima dello stack. La Dalvik VM è invece stata progettata registerbased, ovvero le operazioni agiscono su alcuni registri virtuali. Le statistiche di Google dicono che in questo modo si esegue il 30% di istruzioni in meno. Anche il numero di accessi in memoria si riduce. SEMM2013 Sicurezza ● ● Un'applicazione, per default, non ha il permesso di eseguire alcuna operazione che può avere impatto negativo su altre su altre applicazioni, sul sistema operativo o sull'utente. Ciò comprende la lettura e la scrittura di dati privati dell'utente (contatti, e-mail, ...), leggere o scrivere i file relativi al altre applicazioni, accedere alla rete, mantenere il dispositivo attivo, etc. SEMM2013 Il processo Zygote 1/2 In fase di inizializzazione del sitema viene creato un processo denominato Zygote. Esso si occupa di: ● ● ● Caricare le Core system libraries dex-files ● Inizializzare la Dalvik VM Nel momento in cui viene avviata una Activity il processo Zygote subisce una fork e successivamente: Sono caricati i dex files specifici dell'Applicazione Vengono condivise le Core System Libraries SEMM2013 Il processo Zygote 2/2 Il processo Zygote rimane in esecuzione in background. All'avvio di una nuova applicazione, il processo esegue una fork: ●uno dei due processi creati rimane in esecuzione in background ●l'altro inizializza un nuovo esemplare di DVM. Se durante l'esecuzione di questa applicazione deve essere lanciata una ulteriore applicazione, il processo in background esegue una secondo fork. In ogni momento è quindi disponibile un processo Zygote per l'inizializzazione di una nuova DVM. SEMM2013 Conclusioni Anche se all'apparenza la macchina virtuale usata da Android può sembrare un clone di quella Java, ovvero uno stratagemma usato da Google per non pagare royalties a Sun Microsystems, in realtà è stato fatto un accurato lavoro di ottimizzazione per permettere che le applicazioni Android possano essere eseguite abbastanza velocemente anche su telefoni con risorse limitate, in particolare con poca RAM. SEMM2013 Sistemi Embedded - Android Lezione n. 5 Installare l'SDK Introduzione Per sviluppare una applicazione per Android è necessario scaricare l'SDK dal sito ufficiale. SDK sta per Software Development Kit e contiene una serie di tool ed un emulatore per testare le applicazioni create direttamente sul proprio PC. 83 Prerequisiti ● ● ● ● 10/2012 Android può essere installato su Windows (XP,Vista, 7), Linux (Ubuntu dalla 8.04) e Mac OS X (dalla 10.5.8/x86). Bisogna avere installato il Java Development Kit (JDK) versione 6 (non è sufficiente il runtime-environment JRE) L'IDE ”fortemente” consigliato è Eclipse (dalla 3.6.2 Helios o successivo) insieme al JDT plugin Infine, è necessario installare l'ADT (Android Development Tools) plugin 84 Download 10/2012 Il sito di riferimento per gli sviluppatori Android è http://developer.android.com/ Partendo dalla home page bisogna: ● andare alla sezione ”SDK”, ● cliccare su ”Download the SDK”, ● accettare le condizioni di licenza e scaricare il file ZIP relativo al proprio sistema operativo. L'ultima versione corrente è: Android SDK r20 (API Level 16) 85 Installare l'SDK 1/2 ● ● ● In realtà l'SDK non prevede una installazione vera e propria: è sufficiente scompattare il file ZIP in una cartella, il cui path sarà utilizzato in Eclipse. Per es.: ● Windows: C:\apps\android-sdk-windows ● Linux: /home/username/androidsdk_linux_86 ● Mac OS X: /Users/username/android_sdk_86 Per Windows è disponibile un installer. A questo punto è possibile già sviluppare, debuggare, interagire con l'emulatore da riga di comando. 86 Installare l'SDK 2/2 ● Se si vuole lavorare a riga di comando è necessario aggiungere alla variabile di ambiente PATH il percorso completo della sottodirectory ”tools” e ”platform-tools” 87 Installare l'SDK ● ● ● (MAC OS X) 1/2 Il file in cui indicare il path è ~/.bash_profile Per verificare se esiste è sufficiente aprire un Terminale nella home e digitare ls -a Se esiste editarlo con il comando: open -a TextEdit .bash_profile ● Aggiungendo le seguenti righe: export PATH=$PATH:<sdk>/platform-tools export PATH=$PATH:<sdk>/tools 88 Installare l'SDK ● (MAC OS X) 2/2 Altrimenti, se non esiste, nella home digitare: echo 'export PATH=<sdk>/plaftom-tools:$PATH' >> ~/.bash_profile echo 'export PATH=<sdk>/tools:$PATH' >> ~/.bash_profile 89 Installare il plugin ADT Se invece si preferisce lavorare all'interno di un ambiente integrato di sviluppo è possibile installare il plugin ADT (Android Development Tools) all'interno dell'IDE Eclipse. Per fare ciò all'interno di Eclipse bisogna selezionare ”Help | Install New Software...” ed aggiungere il seguente sito: https://dl-ssl.google.com/android/eclipse/ 90 Configurare il plugin L'unica configurazione richiesta dal plugin ADT per funzionare correttamente all'interno di Eclipse consiste nel fornirgli il percorso completo all'interno del quale è stato scompattato l'SDK. Per fare ciò in Eclipse bisogna selezionare: MAC: ”Eclipse > Preferences..” Altri: ”Window > Preferences... ” E poi ”Browse...” e selezionare la cartella dell'SDK utilizzata al passo precedente per la scompattazione. 91 Aggiornare il plugin Periodicamente potrebbero essere rilasciati aggiornamenti del plugin ADT per Eclipse. Si suggerisce pertanto di controllare di tanto in tanto selezionando ”Help | Software Updates” e provando ad aggiornare il plugin di Android. 92 Aggiornare l'SDK Mediante l'Android SDK Manager (che può essere richiamato sia dall'ambiente Eclipse, sia da riga di comando (Android) è possibile seguire gli aggiornamenti dell'SDK, nonchè installare esempi, documentazione e le importanti Google API. Inoltre l'emulatore deve essere lanciato almeno una volta a riga di comando con l'opzione ”-wipedata” in modo da cancellare i dati relativi alle esecuzioni precedenti. 93 Test installazione 1/2 Tramite riga di comando digitiamo il comando: android Sarà visualizzato l' Android SDK Manager. Avremmo ottenuto lo stesso risultato utilizzando Eclipse mendiante la voce di menu: Window>Android SDK Manager oppure sulla relativa icona. Nota: le Google API 94 Test installazione 2/2 Tramite riga di comando digitiamo il comando: android avd Sarà visualizzato l' Android Virtual Devices Manager (AVD Manager). Avremmo ottenuto lo stesso risultato utilizzando Eclipse mendiante la voce di menu: Window>Android AVD Manager oppure sulla relativa icona. 95 Conclusioni In questa lezione abbiamo visto come installare, configurare ed aggiornare il Software Development Kit (SDK) di Android ed il relativo plugin per l'IDE Eclipse. 96 Sistemi Embedded - Android Lezione n. 6: Strumenti di sviluppo 97 Introduzione In questa lezione verranno elencati e descritti brevemente i principali strumenti di sviluppo forniti con l'SDK di Android, in modo da prendere dimestichezza con ognuno di essi. 98 Emulatore Android ● ● L'SDK include l'emulatore di un dispositivo mobile in grado di girare su un comune PC. L'emulatore permette di testare le applicazioni sviluppate senza disporre del dispositivo fisico. 99 Caratteristiche dell'emulatore ● ● L'emulatore emula il comportamento hardware e software di un tipico smartphone, con la sola eccezione di non essere in grado di effettuare vere telefonate. In compenso le sue capacità di debugging fanno sì che tramite una console testuale sia possibile leggere il log del kernel e simulare l'arrivo di interruzioni (come ad esempio la ricezione di un SMS). 100 Funzionamento interno L'emulatore Android è basato su QEMU (un noto emulatore open-source) e fornisce l'emulazione di: ● una CPU ARMv5 e la corrispondente MMU (Memory Managment Unit) ● un display LCD con 64K colori ● una o più tastiere ● un chip audio con input e output ● l'accesso a partizioni sulla memoria Flash ● un modem GSM, inclusa una SIM simulata ● una video-camera, utilizzando la webcam del pc http://developer.android.com/guide/developing/devices/emulator.html 101 Screen Configuration Low density (120), ldpi Medium density (160), mdpi High density (240), hdpi 480x640 Extra high density (320), xhdpi Normal scree WQVGA400 n (240x400) WQVGA432 (240x432) HVGA (320x480) WVGA800 (480x800) WVGA854 (480x854) 600x1024 640x960 Large screen WVGA800 (480x800) WVGA854 (480x854) WVGA800 (480x800) WVGA854 (480x854) 600x1024 Extra Large screen 1024x600 WXGA (1280x800) 1024x768 1280x768 1536x1152 1920x1152 1920x1200 2048x1536 2560x1536 2560x1600 Small screen QVGA (240x320) 102 Emulator Keyboard Key Menu (left softkey) F2 or Page-up button Star (right softkey) Shift-F2 or Page Down Back ESC Call/dial button F3 Hangup/end call F4 button Switch to next layout KEYPAD_9, Ctrl-F12 orientation (for example, portrait, landscape) Toggle cell networking on/off F8 Toggle code profiling F9 (only with trace startup option) Toggle fullscreen mode Alt-Enter KEYPAD_PLUS, Ctrl-5 Toggle trackball mode F6 Audio volume down button KEYPAD_MINUS, Ctrl-F6 Enter trackball mode Delete temporarily (while key is pressed) Camera button Ctrl-KEYPAD_5, Ctrl-F3 Switch to previous layout orientation (for example, portrait, landscape) KEYPAD_7, Ctrl-F11 Search F5 Power button F7 Audio volume up button DPad left/up/right/down KEYPAD_4/8/6/2 DPad center click KEYPAD_5 Onion alpha increase/decrease KEYPAD_MULTIPLY(*) / KEYPAD_DIVIDE(/) 103 Attività 1/2 ● Creare un nuovo AVD (es. Android2.3.3) ● Avviarlo (da Eclipse e riga di comando) emulator @Android2.3.3 ● Descrivere le principali caratteristiche ● Utilizzare le keyboard Key ● Chiusura ● Individuare l'immagine e i file di configurazione dell'AVD creato 104 Attività 2/2 ● Interagire con l'AVD utilizzando ad es.: ● Chiamata ● SMS ● Batteria ● Tramite DDMS ● Tramite riga di comando: telnet localhost 5554 gsm call 12345678 power status full sms send 12345678 Ciao! 105 L'Android Debug Bridge (o ADB) ● ● Permette inoltre di accedere a riga di comando al dispositivo virtuale e reale e di metterlo in collegamento con un debugger standard. Permette di installare i file .apk di una applicazione sull'emulatore o sul dispositivo. 106 Attività 1/2 ● Visualizzare gli AVD o dispositivi reali connessi: adb devices ● Aprire una shell direttamente sull'emulatore adb shell ● ● adb push nome_file_da_mandare <percorso-inemulatore>/nome_file_destinazione adb pull <percorso-in-emulatore>/nome_file nome_file_destinazione ● adb kill-server ● adb start-server 107 DDMS ● ● Il Dalvik Debug Monitor Service (o DDMS) permette di gestire i processi in esecuzione sull'emulatore o sul dispositivo reale. E' possibile killare i processi, selezionare uno specifico processo da debuggare, generare informazioni di trace, visualizzare le informazioni relative allo heap ed ai thread, catturare screenshot dell'emulatore o del dispositivo, etc. 108 Hierarchy Viewer ● ● ● Lo Hierarchy Viewer permette di debuggare e ottimizzare l'interfaccia utente. La Layout View fornisce una rappresentazione visuale della gerarchia di View dell'applicazione. La Pixel Perfect View fornisce invece una vista ingrandita del display emulato. 109 Layout View 110 Pixel Perfect View 111 Draw 9-patch 1/3 ● ● E' uno strumento WYSIWYG che permette di creare cornici 9-patch. Si tratta di bitmap ridimensionabili divise in 9 sezioni: i 4 angoli non vengono mai scalati, i lati della cornice vengono scalati solo in una dimensione e il solo centro dell'immagine viene scalato in entrambe le dimensioni. 112 Draw 9-patch 2/3 113 Draw 9-patch 2/3 114 AAPT ● ● L'Android Asset Packaging Tool (o AAPT) è lo strumento che permette di creare i file .apk contenenti i binari e le risorse delle applicazioni Android. E' lo strumento che viene automaticamente chiamato da Eclipse per svolgere questo lavoro, ma può anche essere invocato a riga di comando. 115 Traceview ● ● ● Traceview fornisce una rappresentazione grafica dei log di esecuzione salvati dall'applicazione. Il Timeline Panel mostra in quale momento ogni thread o metodo è stato avviato e fermato. Il Profile Panel fornisce un riepilogo di cosa è avvenuto all'interno di un metodo. 116 Timeline Panel 117 Profile Panel 118 mksdcard ● ● ● mksdcard è uno script che facilita il compito di creare una immagine di disco che possa essere usata nell'emulatore. Simula la presenza di una scheda di memoria esterna (ad esempio SD-Card). L'immagine di disco viene creata in formato FAT32. 119 The Monkey ● ● Il cosiddetto ”UI/Application Exerciser Monkey” (letteralmente ”la scimmia che esercita l'interfaccia grafica e l'applicazione”) è un programma che gira sull'emulatore o sul dispositivo reale sequenze pseudo-casuali di eventi (come i click e vari tocchi dello schermo) come pure vari tipi di eventi di sistema. The Monkey è usato per stressare l'applicazione che si sta sviluppando, in maniera casuale ma ripetibile. 120 Conclusioni In questa lezione abbiamo descritto gli strumenti messi a disposizione dall'SDK che possono essere particolamente utili per risolvere specifici problemi. 121 Sistemi Embedded - Android Lezione n. 7: Sviluppo di una applicazione Introduzione ● ● ● Questa lezione mostra il ciclo di sviluppo tipico di una applicazione per Android. Verrà mostrato come creare e compilare un nuovo progetto, e come eseguirlo nell'emulatore. Verrà mostrato il procedimento da usare con Eclipse o su riga di comando. 123 Creare un progetto Eclipse passo 1 ● ● Per iniziare lo sviluppo di una nuova applicazione per Android bisogna creare un progetto e una configurazione di lancio. Per creare il progetto bisogna ovviamente disporre di Eclipse e del plugin ADT installato correttamente. 124 Creare un progetto Eclipse passo 2 ● ● Il progetto si crea selezionando nell'ordine ”File | New | Project | Android | Android Project”. Successivamente dovranno essere definiti il project name, il target, l'activity name, application name ed il package name 125 Creare un progetto Eclipse passo 3 126 Creare un progetto Eclipse passo 4 127 Creare un progetto Eclipse passo 5 128 Creare un Android Virtual Device ● ● Per poter eseguire la nostra applicazione è necessario disporre di un Android Virtual Device (AVD) Per crearne uno tramite Eclipse andare su Window | Android Sdk and AVD Manager, oppure richiamando il tool Emulator senza argomenti da prompt dei comandi 129 Creare la configurazione di lancio ● ● Bisogna creare una configurazione di lancio in Eclipse selezionando il menu ”Run” e poi uno dei quattro tra ”Open Run Dialog”, ”Open Debug Dialog”, ”Run Configurations” oppure ”Debug Configurations”. Dopo avere assegnato un nome alla configurazione specificare il nome del progetto, l'Activity da lanciare ed eventuali parametri da passare all'emulatore. 130 Eseguire e debuggare l'applicazione ● ● ● Adesso è possibile avviare l'applicazione selezionando ”Run | Run” oppure ”Run | Debug” a seconda di quello che si intende fare. Questa azione farà riferimento alla configurazione di lancio usata più di recente. I passi che adesso verranno eseguiti saranno nell'ordine l'avvio dell'emulatore, la compilazione del progetto (solo in caso di modifiche) e l'installazione dell'applicazione nell'emulatore. 131 Sviluppo con altri IDE ● ● ● ● L'ambiente di sviluppo raccomandato per sviluppare una applicazione Android è Eclipse con il plugin ADT installato, ma è possibile utilizzare altri metodi. A partire dalla versione 9 l'IDE IntelliJ IDEA di JetBrains integra un supporto all'Android SDK. E' possibile utilizzare l'IDE Eclipse senza avere installato il plugin ADT. In tutti i casi i tool contenuti nell'SDK forniscono gli strumenti per configurare, compilare e debuggare una applicazione. 132 Creare un progetto da riga di comando ● Per creare un nuovo progetto da riga di comando si utilizza sempre il tool android: android create project -t <target_ID> -n <your_project_name> -p path/to/your/project -a <your_activity_name> -k <your_package_namespace> ● android create project -t 8 -n prova -p c:\prova -a ActivityDemo -k it.corso.activitydemo Assicurarsi di avere inserito le directory platform-tools/ e tools/ tra le directory della variabile d'ambiente PATH 133 File ottenuti 1/3 L'esecuzione del precedente comando produce in output i seguenti file: ● ● ● ● AndroidManifest.xml è il file di manifesto contenente le informazioni relative al progetto build.xml è un file Ant che può essere usato per compilare l'applicazione a riga di comando src/it/corso/ActivityDemo.java è il file sorgente che conterrà l'activity specificata. proguard.cfg è utilizzato dal tool proguard che offusca ed ottimizza il codice producendo un .apk di dimensioni ridotte. 134 File ottenuti 2/3 ● ● default.properties descrive la configurazione del progetto compreso il build target. Non dovrebbe essere editato manualmente. build.properties può essere editato per sovrascrivere le impostazioni di build usate da Ant. Se si usa Eclipse questo file viene ignorato. 135 File ottenuti 3/3 ● ● ● ● gen/ contiene i file .Java generati dall'ADT come per es. R.java. res/ contiene le risorse dell'applicazione (immagini, stringhe, layout) assets/ inizialmente vuota contiene altri file di risorse come texture o dati cui e non sono associati alle costanti della classe R. libs/ contiene le library utilizzate dall'applicazione 136 Directory ottenute Vengono inoltre create le seguenti cartelle: ● src/ conterrà i sorgenti ● res/ per le risorse esterne ● bin/ contiene il file .apk e le altre risorse compilate ● jni/ contiene il codice nativo sviluppato mediante l'Android NDK In realtà tutte le directory anche in seguito possono essere spostate dove si vuole, mentre non è possibile spostare l'SDK perché gli script di build fanno riferimento ad esso. 137 Settare l'ambiente per la compilazione ● ● Per compilare il progetto a riga di comando è necessario avere installato Apache Ant 1.8 o successivo. Bisogna inoltre settare la variabile d'ambiente JAVA_HOME per puntare correttamente al percorso in cui è installato il JDK; sotto Windows tale percorso NON può contenere spazi, quindi ad esempio non è possibile installare il JDK nella directory predefinita ”Program Files”: set JAVA_HOME=c:\Programmi\Java\ 138 Compilare a riga di comando ● ● Dopo avere settato la variabile d'ambiente JAVA_HOME è sufficiente spostarsi nella directory che contiene il file build.xml ed eseguire semplicemente ”ant”. Ovviamente ogni volta che si cambia un file sorgente o una risorsa bisogna ricompilare tutto rieseguendo il comando ”ant”. 139 Avviare l'emulatore a riga di comando ● ● Per eseguire la propria applicazione bisogna innanzitutto caricarla all'interno del file-system del sistema emulato. Per prima cosa bisogna avviare l'emulatore con il comando: emulator @avd_name ● Per conoscere gli AVD disponibili (prec. creati): android list ● Nell'interfaccia grafica dell'emulatore la vecchia versione della propria applicazione non deve essere in primo piano, quindi conviene spostarsi alla pagina principale premendo il pulsante ”Home”. 140 Attività 1/2 ● ● ● ● Per installare la propria applicazione da riga di comando si può utilizzare il comando ADB (con un AVD avviato). La sintassi da usare è adb install bin/<nome_applicazione>.apk Questo comando ricopia il file APK all'interno della directory /data/app dell'emulatore. Accedendo all'emulatore la nostra applicazione apparirà tra quelle installate. 141 Attività 2/2 Rimuovere l'applicazione installata ● Tramite l'emulatore ● Utilizzando l'ADB adb uninstall it.dominio.nomepackage Es: adb uninstall it.corso.helloandroid ● Verificare l'avvenuta rimozione dell'app 142 Conclusioni In questa lezione abbiamo visto come creare un nuovo progetto Eclipse e come eseguire la nostra applicazione all'interno dell'emulatore. Abbiamo inoltre visto come sia possibile effettuare le stesse operazioni anche senza Eclipse, utilizzando solo gli strumenti a riga di comando forniti con l'SDK di Android. 143 Sistemi Embedded - Android Lezione n. 8: Anatomia di una applicazione Elementi di base Gli elementi di base per costruire una applicazione Android sono cinque: ● Activity ● Intent ● Broadcast Receiver ● Service ● Content Provider 145 Activity (1/3) ● ● ● ● Le Activity sono l'elemento di base più comune. Rappresentano blocchi logici dell'applicazione ed interagiscono con l'utente mediante i dispositivi di input dello smartphone. Serve una Activity per ogni schermata dell'applicazione (es. una per comporre un messaggio, una per consultare la rubrica e una per le configurazioni). Vengono derivate dalla classe base android.app.Activity. 146 Activity (2/3) ● ● ● ● La propria Activity derivata mostrerà una interfaccia utente composta da View e risponderà ad eventi. Spostarsi da una schermata all'altra fa avviare una nuova Activity. In certi casi l'Activity chiamata restituirà un valore all'Activity chiamante (ad esempio una schermata che permette di selezionare una foto restituirà al chiamate la foto scelta). Quando si apre una nuova schermata, quella precedente è messa in pausa e inserita in una pila (activity stack). 147 Activity (3/3) ● ● ● L'utente può quindi navigare avanti e indietro tra le schermate aperte nell'activity stack. Per alcune schermate può essere inappropriato rimanere nell'activity stack, e in questo caso è possibile rimuoverle. Android mantiene un activity stack per ogni applicazione lanciata dalla schermata Home. 148 Activity - Fragment ● ● Con Android 3.0 sono stati introdotti i Fragment. Un Fragment costituisce una porzione di UI di una data Activity con le seguenti proprietà: ● E' caratterizzata da un proprio ciclo di vita ● Possiede un proprio input ● ● Può essere aggiunto e rimosso mentre l'Activity è in esecuzione Per es., una Activity potrebbe includere molti Fragment quando il display è abbastanza ampio, oppure solo alcuni in caso contrario. 149 Intent 1/4 ● ● ● ● L'Intent rappresenta un messaggio in grado di attivare i tre componenti-base di una applicazione: Activity, Service e Broadcast Receiver Un Intent descrive cosa una applicazione vuole che venga fatto. La struttura dati dell'Intent si compone dell'azione da effettuare e dei dati su cui agire. Valori tipici per l'azione sono MAIN (la schermata principale dell'applicazione), VIEW, PICK, EDIT etc. 150 Intent 2/4 Un Intent può essere Esplicito o Implicito: ● ● Esplicito: all'interno del costruttore dell'Intent specifichiamo la classe da eseguire (tipicamente una Activity). Nell'esempio seguente è istanziato un Intent in cui è dichiarata una Activity da eseguire. Intent intent = new Intent(this, SubActivity.class); startActivity(intent); 151 Intent 3/4 ● ● Implicito: rappresenta l'essenza della filosofia Android. Un Intent implicito dichiarata l'azione da eseguire pur senza sapere chi la eseguirà. Nel seguente esempio è dichiarato un Intent mediante cui avviare una Activity che visualizzerà il sito definito nell'URI Uri uri = Uri.parse("http://www.google.com"); Intent it = new Intent(Intent.ACTION_VIEW,uri); startActivity(it); 152 Intent 4/4 ● ● In generale, potrebbe essere necessario richiedere specifici ”permission” per eseguire un particolare Intent Tali permessi devono essere dichiarati nel manifest.xml, ad esempio: <uses-permission android:name="android.permission.INTERNET" /> 153 IntentFilter 1/2 ● ● ● ● Una classe correlata si chiama IntentFilter. Una Activity che è in grado di mostrare le informazioni di contatto per una persona pubblicherà un IntentFilter nel quale dirà che sa come gestire l'azione VIEW quando essa è applicata a dati che rappresentano una persona. Le Activity pubblicano i loro IntentFilter nel file AndroidManifest.xml. La navigazione da una schermata all'altra viene effettuata risolvendo gli Intent. 154 IntentFilter Un IntentFilter sempre presente nella nostra applicazione è il seguente: <activity android:name=".IntentSample" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> ● ● La action dichiara che si tratta di un entry point, mentre la category indica che questo entry point può essere listato nell'Application Launcher Ovvero, la nostra Activity si rende disponibile nella home per essere eseguita mediante click/tap sull'icona relativa 155 Intent - Navigazione Per navigare avanti una Activity chiama startActivity(myIntent); Il sistema guarda quindi gli IntentFilter per tutte le applicazioni installate e sceglie l'Activity il cui IntentFilter è più appropriato per myIntent. La nuova Activity è informata dell'Intent, e viene quindi lanciata. 156 Intent - Esecuzione a run-time Il fatto di risolvere gli Intent al tempo di esecuzione solo quando startActivity() viene chiamata comporta almeno due benefici principali: ● ● Le Activity possono riutilizzare funzionalità di altri componenti semplicemente facendo una richiesta sotto forma di un Intent. Le Activity possono essere sostituite in ogni momento da una nuova Activity con un IntentFilter equivalente. Rif: http://developer.android.com/reference/android/ content/Intent.html 157 BroadcastReceiver 1/2 ● ● ● Il secondo elemento di base di una applicazione è la classe BroadcastReceiver definita all'interno del package android.content. Viene utilizzato quando si vuole che parte del codice della propria applicazione venga eseguito in risposta ad un evento esterno (es. il telefono squilla, o una connessione dati diventa disponibile, oppure quando è mezzanotte). Affinché un BroadcastReceiver venga chiamato non è necessario che la relativa applicazione sia in esecuzione. 158 BroadcastReceiver 2/2 ● ● ● I BroadcastReceiver non hanno interfaccia grafica, ma possono usare il NotificationManager per avvisare l'utente che è successo qualcosa di interessante. Anche i BroadcastReceiver come gli IntentFilter sono registrati nel file AndroidManifest.xml, ma possono essere anche registrati dal sorgente usando la chiamata Context.registerReceiver(). Le applicazioni possono lanciare i broadcast alle altre con Context.sendBroadcast(). 159 Service ● ● Un altro elemento di base delle applicazioni Android è il Service, ovvero del codice senza interfaccia grafica e sono definiti all'interno del package android.app. Un buon esempio è la riproduzione di un brano musicale: poiché si vuole che la riproduzione continui anche dopo che l'utente ha cambiato schermata, non la si può lasciare eseguire ad una Activity ma bisogna chiamare Context.startService() per eseguirla in background. 160 Cosa non è un service ● ● Un Service non è un processo separato: in altre parole l'applicazione e il suo servizio sono eseguiti all'interno dello stesso processo (se non altrimenti specificato) Non è un thread: non è uno strumento mediante cui fare eseguire delle attività al di fuori del thread principale 161 Cosa è un service ● ● Un Service è uno strumento mediante cui l'applicazione vuol comunicare al sistema che una data operazione deve essere eseguita in background anche quando l'utente non sta interagendo direttamente con essa. Uno strumento mediante il quale l'applicazione mette a disposizione di altre applicazioni alcune delle proprie funzionalità. Ciò può essere realizzato invocando una Context.bindService() mediante la quale viene stabilita una connessione tra l'applicazione richiedente ed il servizio richiesto. 162 Content Provider ● ● ● L'ultimo elemento di base è il Content Provider, definito all'interno della classe Android.Content Solitamente le applicazioni memorizzano i loro dati all'interno del file-system oppure in un database SQLite, ma se i dati di una applicazione devono essere condivisi con le altre bisogna usare la classe ContentProvider. Un ContentProvider è una classe che implementa un insieme standard di metodi per permettere alle altre applicazioni di salvare e recuperare dati. 163 Conclusioni In questa lezione abbiamo visto brevemente le quattro classi alla base di ogni applicazione Android: Activity, Intent, BroadcastReceiver, Service e ContentProvider. 164 Sistemi Embedded - Android Lezione n. 9: Ciclo di vita di Activity, Service e Processi Activity 1/3 ● ● Pur essendo possibile avviare più applicazioni contemporaneamente soltanto una può occupare il display, mentre le altre saranno ”nascoste” in background Questo è il motivo per cui, il concetto di chiusura è secondario e normalmente non troveremo il punsante ”Esci” 166 Activity 2/3 ● ● ● ● ● OnCreate(Bundle): e' invocato quando l'activity viene avviata per la prima volta. Il Bundle savedInstanceState serve per riportare l'Activity nello stesso stato in cui si trovava la precedente istanza dell'Activity terminata. OnStart(): è invocato quando l'activity sta per essere visualizzata onResume(): è invocato non appena l'activity inizia ad "interagire" con l'utente onPause(): è invocato non appena l'activity sta per essere ”ibernata” (per es. e' stata avviata un'altra activity) onStop(): è invocato nel momento in cui l'activity non e' piu' visibile all'utente. 167 Activity 3/3 ● ● ● ● onRestart(): è invocato quando l'Activity sta per essere riavviata dopo essere stata precedentemente arrestata onDestroy(): è invocata poco prima che l'Activity sia distrutta onSaveInstanceState(Bundle): è invocata per salvare lo stato dell'Activity onRestoreInstanceState(Bundle): è invocata solo se in precedenza è stato salvato uno stato 168 Ciclo di vita di un Service ● ● Quando viene invocato il metodo startService() il sistema verifica se tale servizio è in escuzione altrimenti esegue onCreate() Successivamente è invocato il metodo onStartCommand() e il servizio è finalmente nello stato di esecuzione dove rimane fino a quando non sarà richiamato stopService() oppure stopSelf(). 169 Service 1/2 ● ● onCreate(): a differenza delle Activity non presenta alcun parametro. Creato il servizio viene invocato il metodo onStartCommand(). Viene invocato una sola volta. onStartCommand(): invocato questo metodo il servizio resterà in esecuzione e rimarrà in questo stato fino a quando non sarà invocato stopService() da parte dell'Activity che lo ha generato, oppure stopSelf() da parte del servizio stesso. Può essere invocato più volte in seguito all'esecuzione di onStartService() da parte dell'Activity. 170 Service 2/2 ● onDestroy(): l'invocazione di stopService() da parte dell'Activity produrrà la chiamata di questo metodo del Servizio. In seguito a questa chiamata il servizio sarà eliminato 171 Applicazioni e Processi ● ● ● Per ogni applicazione che viene eseguita, Android avvia un nuovo processo Linux Di default, tutti i componenti di una data applicazione (per es. Activity + Service) sono eseguiti all'interno dello stesso processo Se al momento di avviare una applicazione esiste già un processo assegnato ad essa perchè un suo componente è stato eseguito in precedenza, allora tale applicazione sarà eseguita all'interno di questo processo 172 Applicazioni e Processi ● ● ● Nel caso in cui la momoria a disposizione per eseguire una applicazione in foreground (visibile all'utente) ovvero per eseguire un importante processo non sia disponibile, allora il sistema può decidere di eliminare uno o più processi in background secondo una logica ben definita Ad ogni processo viene assegnata una sorta di importanza gerarchica in base ai suoi componenti in esecuzione ed al loro stato Ovviamente i processi di minore importanza saranno i primi ad essere eliminati per liberare memoria 173 Applicazioni e Processi Sono state definite 5 tipologie di processi ordinate per importanza decrescente: ● Foreground Process ● Visible Process ● Service Process ● Background Process ● Empty Process 174 Foreground Process I processi Foreground sono quelli che eseguono componenti di interazione con l'utente: ● Activity in cima allo Stack ● Azioni di un BroadCastReceiver (OnReceive()) ● Metodi di callback nella gestione di un servizio come Start(), Create() o Destroy() Normalmente il numero di questo tipo di processi è limitato. Android potrà decidere di eliminarne uno come ultima chance per risolvere il problema di memoria 175 Visible Process Sono processi che pur non essendo direttamente visibili all'utente (non possiedono componenti in Foreground, si trovano in uno stato in cui possono comunque avere effetto su quello che l'utente vede visualizzato. ● ● Activity non in Foreground che esegue OnPause() Service connesso ad un'Activity in Foreground. 176 Service Process ● ● ● Sono processi che eseguono Service Pur non interagendo direttamente con l'utente, Android li ritiene più importanti delle Activity in Background L'esempio classico è la riproduzione di un file audio: pur non interagendo direttamente con l'utente, questo accetterà malvolentieri l'interruzione dell'ascolto del brano. Pertanto Android proverà ad eliminare uno o più processi meno importanti prima di eliminare un Service Process 177 Background Process ● ● ● ● Sono processi che si occupano di eseguire Activity non più in Foreground per i quali è stato invocato il metodo OnStop() Il loro numero è in genere superiore a quello delle altre categorie L'eliminazione all'interno di questa categoria tiene in considerazione il criterio di Least Recent Used (LRU) Per questi processi è comunque definito un meccanismo di salvataggio e ripristino 178 Empty Process ● Sono i processi candidati per l'eliminazione. ● Non eseguono alcun componente ● ● Il motivo per cui non vengono eliminati nel momento in cui sono svuotati dai componenti che eseguivano è legato a strategie di caching Gli empty Process più vecchi saranno velocemente eliminati, mentre per quelli più recenti è più probabile che l'utente richiami un suo componente precedentemente visualizzato 179 Sistemi Embedded - Android Lezione n. 10: Hello, Android! Introduzione In questa lezione vedremo come applicare i concetti acquisiti nella lezione precedente e creeremo la nostra prima applicazione per Android. Come tradizione la prima applicazione sviluppata in un nuovo linguaggio si chiama ”Hello World” (nel nostro caso ”Hello Android”) e si limita a visualizzare sullo schermo un messaggio di saluto. Creare il progetto ● Per creare il progetto Eclipse bisogna selezionare ”File | New | Project | Android Project”: Dettagli del progetto Nome progetto e Activity ● ● Il nome del progetto e il nome dell'Activity possono coincidere o meno: nell'esempio il progetto è ”HelloAndroid” e l'activity è ”HelloAndroidActivity”. La differenza è che il progetto dà il nome alla directory che lo conterrà, mentre il nome dell'Activity è il nome della classe che deriveremo dalla classe Activity di Android e che sarà la classe principale dell'applicazione. Nome del package Bisogna specificare il namespace sotto il quale si vuole che risieda il nostro codice sorgente, seguendo le stesse regole del linguaggio Java. Poiché è importante che nel sistema il nome del package sia unico rispetto a tutti quelli installati nel sistema, si usa un nome di package in stile ”nome di dominio”. Nell'esempio è stato utilizzato ”it.corso”. Nome dell'applicazione L'ultimo dettaglio da specificare al momento della creazione del progetto è l'Application Name: questo è il nome dell'applicazione che apparirà sia come descrizione nell'elenco di applicazioni installate che sulla barra del titolo quando la nostra applicazione sarà in esecuzione, quindi è importante che si tratti di un nome facilmente comprensibile: nel nostro caso ”HelloAndroid”. Può contenere spazi e punteggiatura. AndroidManifest.xml <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="it.corso.helloandroid" android:versionCode="1" android:versionName="1.0"> <uses-sdk android:minSdkVersion="8" /> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".HelloAndroidActivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest> Codice autogenerato Dopo avere cliccato su ”Finish” il file HelloAndroidActivity.Java conterrà il seguente codice: package it.corso.helloandroid; import android.app.Activity; import android.os.Bundle; public class HelloAndroidActivity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } } Codice modificato package it.corso.helloandroid; import android.app.Activity; import android.os.Bundle; import android.widget.TextView; public class HelloAndroidActivity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); TextView tv = new TextView(this); tv.setText("Hello, Android!"); setContentView(tv); } } View e TextView ● ● ● In Android le interfacce utente sono composte da gerarchie di classi dette View. Una View è semplicemente un oggetto che può essere disegnato, come un radio button, una animazione o (come nel nostro caso) una etichetta di testo. Il nome della sottoclasse della classe View che permette di gestire il testo è semplicemente TextView. Creazione della TextView Per creare una TextView si procede come si fa di solito in Java invocando il costruttore: TextView tv = new TextView(this); L'argomento passato al costruttore deve essere una istanza del Context di Android, dove il Context è semplicemente un handle che ci permette di accedere al sistema (ad esempio per risolvere risorse, ottenere l'accesso a database e preferenze e così via). Metodi di TextView Poiché la classe HelloAndroid è derivata da Activity che a sua volta è derivata da Context, allora al costruttore di TextView possiamo passare ”this” ovvero la nostra istanza di HelloAndroid. Possiamo poi invocare un metodo di TextView per dirgli quale deve essere il testo da visualizzare: tv.setText("Hello, Android"); Collegamento al display Dopo avere creato la TextView e averle detto quale testo mostrare, l'ultimo passo consiste nel collegare questa TextView con lo schermo: setContentView(tv); Questo metodo di Activity indica al sistema quale View deve essere associata all'interfaccia grafica dell'Activity stessa (in questo caso una TextView). Se non viene mai invocato l'Activity mostrerà solo uno schermo vuoto. Eseguire Hello Android ● Per eseguire l'applicazione a seconda della versione di Eclipse bisogna selezionare ”Run | Open Run Dialog” oppure ”Run | Run Configurations”: Personalizzare la configurazione ● ● ● ● ● Selezionare dal menu ”Android Application | New_configuration”. Assegnare un nome significativo alla nuova configurazione, per esempio ”Hello, Android”. Selezionare il progetto ”HelloAndroid”. Selezionare l'Activity principale del progetto, ovvero ”com.android.hello.HelloAndroid”. Il modulo compilato sarà: Configurazione di lancio Esecuzione ● ● Infine premendo il pulsante ”Run” si otterrà: Durante l'avvio, la finestra console dell'IDE ci comunica passo passo le operazioni in corso: Commenti ● ● ● Come si vede nell'immagine precedente, la scritta ”Hello, Android” viene mostrata due volte. La scritta più in alto è il nome dell'applicazione mostrato sulla barra del titolo; è la stringa che abbiamo scelto come Application Name quando abbiamo creato il progetto. Invece la seconda scritta è il testo che abbiamo associato alla TextView. Conclusioni In questa lezione abbiamo visto come creare la nostra prima applicazione. Abbiamo messo in pratica quanto appreso alla lezione precedente riguardo allo sviluppo e all'esecuzione di una nuova applicazione per Android. Abbiamo inoltre iniziato a prendere dimestichezza con le classi Context, Activity, View e TextView. Sistemi Embedded - Android Lezione n. 11: Elenco dei package Introduzione In questa lezione vedremo l'elenco completo dei package Android che raggruppano le classi che è possibile utilizzare per sviluppare una applicazione utilizzando il linguaggio di programmazione Java. android ● ● ● Il package android di livello più alto contiene due classi relative alle risorse usate dalle applicazioni. Contiene la classe R relativa alle risorse. Contiene inoltre la classe Manifest relativa al file di manifesto dell'applicazione. android.app ● ● ● ● Il package android.app contiene molte classi usate per incapsulare il modello di applicazione di Android. Contiene ad esempio la classe Activity, usata più volte durante questo corso. Contiene inoltre la classe Dialog usata per le finestre di dialogo. Contiene anche la classe Service usata per i servizi eseguiti in background. android.content ● ● ● ● Il package android.content contiene le classi usate per accedere e pubblicare dati sul dispositivo. Contiene la classe Intent che è la descrizione astratta di una operazione da compiere. Contiene inoltre la classe di base BroadcastReceiver dalla quale si derivano le classi in grado di ricevere gli Intent. Contiene l'interfaccia Context per accedere le informazioni globali dell'applicazione. android.database ● ● ● Il package android.database contiene le classi usate per esplorare i dati restituiti da un ContentProvider. Il sottopackage android.database.sqlite contiene le classi che una applicazione può utilizzare per gestire il proprio database SQLite. Contiene ad esempio le classi SQLiteDatabase, SQLiteOpenHelper e SQLiteQuery. android.graphics ● ● ● Il package android.graphics fornisce strumenti per la grafica di basso livello usati per disegnare lo schermo direttamente. Contiene ad esempio le classi Bitmap, Canvas, Color, Matrix, NinePatch, Paint, Picture, Point, Rect e Region. Il sottopackage android.graphics.drawable fornisce la classe Drawable che contiene i generici metodi usati per disegnare un oggetto. android.hardware ● ● ● Il package android.hardware fornisce il supporto per l'hardware non necessariamente presente su tutti i dispositivi Android. Fornisce ad esempio la classe Camera usata per interagire con la fotocamera (opzionale sui dispositivi Android). Fornisce anche la classe SensorManager con la quale è possibile interagire coi sensori (accelerometro, giroscopio, etc.), anch'essi opzionali. android.location ● ● ● Il package android.location fornisce le classi che permettono di gestire i servizi basati sulla posizione. Fornisce ad esempio la classe Location che memorizza la posizione geografica in un certo momento. Fornisce anche la classe Address, ovvero una stringa che rappresenta un indirizzo. android.media ● ● ● ● Il package android.media fornisce le classi che permettono di gestire vari formati audio e video. Fornisce la classe MediaPlayer usata per riprodurre un file multimediale. Fornisce la classe MediaRecorder usata per registrare audio e video dal proprio dispositivo. La classe Ringtone permette di interagire con le suonerie presenti sul dispositivo. android.net ● ● ● ● ● Il package android.net permette di interagire con la rete in aggiunta alle normali API java.net. Fornisce ad esempio la classe DhcpInfo per leggere i risultati di una richiesta DHCP. La classe NeworkInfo descrive lo stato delle interfacce di rete. Il sotto-package android.net.http fornisce le classi per gestire i certificati SSL. Il sotto-package android.net.wifi fornisce le classi per gestire le funzioni Wi-Fi. android.opengl ● ● ● Il package android.opengl fornisce le classi per gestire la grafica OpenGL. La classe GLU contiene le ”GL Utilities”. La classe Matrix permette di gestire le matrici 4x4 usate da OpenGL. android.os ● ● ● ● Il package android.os fornisce i servizi di base di un sistema operativo, come il message passing e la Inter-Process Communication. Fornisce le classi BatteryManager e PowerManager per gestire il consumo. Fornisce la classe Handler in grado di gestire i messaggi ricevuti. Fornisce la classe Message che definisce il messaggio che può essere mandato a un Handler. android.preference ● ● ● Il package android.preference contiene le classi che gestiscono le preferenze di una applicazione e ne implementano l'interfaccia grafica. Fornisce infatti la classe di base Preference. Fornisce poi le varie classi CheckboxPreference, DialogPreference, EditTextPreference, ListPreference e RingtonePreference. android.provider 1/2 ● ● ● Il package android.provider fornisce le classi di utilità usate per accedere ai Content Provider forniti da Android. E' l'unico strumento a disposizione delle applicazione per condividere dati Non esiste un'area comune all'interno della quale i package possono leggere e/o scrivere i dati android.provider 2/2 ● ● ● Fornisce il Contacts provider che implementa la rubrica. Fornisce il MediaStore provider che contiene i meta-dati di tutti i file multimediali. A partire dalla versione 4.0 (API 14) è fornisce anche il Calendar provider android.sax ● ● ● Il package android.sax fornisce un framework che permette di scrivere gestori SAX robusti ed efficienti. Fornisce ad esempio la classe Element che descrive un singolo elemento XML. Fornisce la classe RootElement che descrive l'elemento XML radice. android.telephony ● ● Il package android.telephony fornisce le API per monitorare le informazioni di base del telefono, come il tipo di rete e lo stato della connessione, più alcune utilità usate per manipolare stringhe contenenti numeri di telefono. Il sottopackage android.telephony.gsm fornisce le API per utilizzare caratteristiche specifiche del servizio GSM, come i messaggi SMS. android.test ● ● Il package android.test è un framework per scrivere test case per Android. Altre classi utili per i test sono contenute nei sotto-package android.test.mock e android.test.suitebuilder. android.text ● ● ● ● Il package android.text contiene classi usate per la visualizzazione del testo sullo schermo. Fornisce la classe AutoText che accede un dizionario di frequenti errori di digitazione. Fornisce la classe Html che processa stringhe HTML e le trasforma in testo visualizzabile sullo schermo con lo stile corretto. Include anche diversi sotto-package (method, style e util). android.util ● ● ● Il package android.util fornisce diversi metodi di utilità, ad esempio metodi di conversione di stringhe e numeri. Fornisce la classe TimeUtils che permette di manipolare data e ora. Fornisce la classe Xml che contiene metodi di utilità per gestire file XML. android.view ● ● ● Il package android.view fornisce classi che espongono interfacce utente di base per disegnare sullo schermo e interagire con l'utente. Fornisce ad esempio le classi Menu, SubMenu e MenuItem usate per gestire i menu. Il sotto-package android.view.animation contiene classi usate per gestire semplici animazioni che possono essere poi applicate a View, superfici o altri oggetti. android.webkit ● ● ● ● Il package android.webkit fornisce gli strumenti per navigare in rete con un browser. Fornisce ad esempio la classe URLUtil che fornisce metodi di utilità per gestire gli URL. Fornisce la classe Plugin per la gestione dei plugin del browser. Fornisce la classe WebView che è un oggetto View incorporabile nella propria applicazione e capace di mostrare pagine web. android.widget ● ● Il package android.widget contiene molti elementi grafici che possono essere mostrati sullo schermo dell'applicazione. Fornisce ad esempio le classi Button, Checkbox, EditText, RadioButton, Scroller, AnalogClock e DigitalClock. Altri package di Java ● ● Come visto in precedenza, in Android sono anche supportati molti package appartenenti alla API di Java: java.awt.font, java.io, java.lang, java.math, java.net, java.nio, java.security, java.sql, java.text e java.util. Sono anche supportati alcuni package estesi di Java: javax.crypto, javax.microedition.khronos.egl, javax.microedition.khronos.opengles, javax.net, javax.security, javax.sql e javax.xml. Ulteriori package ● ● Android supporta inoltre ulteriori package disponibili per Java ma esterni alla piattaforma di Sun Microsystems. Ad esempio org.apache.http, org.json, org.w3c.dom, org.xml.sax, junit.framework e junit.runner. Conclusioni In questa lezione abbiamo elencato tutti i package che raggruppano le classi sviluppate appositamente per la piattaforma Android. Abbiamo inoltre visto brevemente altri package open-source che sono stati integrati nel progetto, provenienti principalmente da Java e dal progetto Apache. Sistemi Embedded - Android Lezione n. 12: Implementare una interfaccia utente Introduzione In questa lezione vedremo come implementare una interfaccia utente sullo schermo di Android. Vedremo gli elementi di base visualizzabili sullo schermo ed i layout che permettono di disporre i vari elementi dell'interfaccia grafica. 228 Gerarchia di elementi dello schermo ● ● ● Come visto più volte durante questo corso l'elemento di base di una applicazione sono gli oggetti della classe android.app.Activity. Una Activity può fare molte cose, ma di per sé non ha associata una schermata. Per assegnare ad una activity una interfaccia grafica si lavora con oggetti del tipo View e Viewgroup. 229 android.view.View ● ● ● La classe View è una struttura dati le cui proprietà memorizzano il layout e il contenuto di una specifica area rettangolare sullo schermo. L'oggetto View gestisce le dimensioni, il layout, il disegno, il focus, lo scorrimento, i tasti e i tocchi per lo schermo. La classe View serve come classe di base per diversi widget già implementati (Text, EditText, InputMethod, MovementMethod, Button, RadioButton, Checkbox e ScrollView). 230 android.view.ViewGroup ● ● ● Come il nome stesso suggerisce, un ViewGroup è un oggetto il cui compito è quello di contenere un insieme di altri View e ViewGroup. In tal modo schermate complesse possono essere gestite come se fossero una unica entità. La classe ViewGroup serve come classe di base per diversi tipi comuni di layout già implementati. 231 GUI strutturata ad albero ● ● L'interfaccia grafica di una Activity è costituita da un albero di View e ViewGroup. Per collegare l'albero allo schermo, l'Activity invoca la propria setContentView() passando come argomento il nodo radice. 232 Disegno dell'albero ● ● ● Una volta che Android ha il riferimento all'oggetto del nodo radice può lavorare direttamente con esso per invalidare, misurare e disegnare l'albero. Quando l'Activity diventa attiva e riceve il focus, il sistema lo notifica all'Activity che richiede quindi al nodo radice di misurare e disegnare l'albero. Il nodo radice richiede quindi ad ognuno dei nodi figli di disegnare se stessi, e così via. 233 Disegno dei figli ● ● Ogni ViewGroup ha la responsabilità di misurare lo spazio disponibile, disporre i suoi figli e invocare il metodo Draw() su ognuno dei figli per fare in modo che si disegnino. Il figlio può quindi richiedere una dimensione e una posizione nel genitore, ma la decisione finale su dove e quanto grande possa essere il figlio spetta all'oggetto genitore. 234 ViewGroup.LayoutParams ● ● Ogni classe ViewGroup usa una classe innestata che estende LayoutParams. Questa sottoclasse contiene le proprietà che definiscono dimensione e posizione dei figli. 235 Dimensioni ● ● Tutti i ViewGroup includono larghezza e altezza; molti includono anche margini e bordi. A volte potrebbe essere necessario impostare larghezza e altezza a un valore fisso, mentre nella maggior parte dei casi si potrebbe voler richiedere a un ViewGroup di assumere le dimensioni degli oggetti in essi contenuti oppure la dimensione massima possibile. 236 Tipi di layout comuni Alcuni tipi di layout molto comuni sono: ● FrameLayout ● LinearLayout ● TableLayout ● RelativeLayout ● GridLayout 237 FrameLayout ● ● ● ● FrameLayout è l'oggetto di layout più semplice. E' uno spazio vuoto riservato sullo schermo che può poi essere riempito con un singolo oggetto. Tutti gli oggetti figli vengono allineati all'angolo in alto a sinistra. I figli aggiunti successivamente andranno quindi a coprire (totalmente o parzialmente) i figli aggiunti in precedenza. 238 LinearLayout ● ● Un LinearLayout allinea tutti i suoi figli in una direzione, in orizzontale o verticale, a seconda di quale proprietà viene settata. Si possono definire gravità e peso in modo che un oggetto (es. Comments) si espanda. 239 TableLayout ● ● Il TableLayout dispone i figli in righe e colonne. E' formato da oggetti di tipo TableRow, formati da celle che a loro volta contengono una sola View. 240 RelativeLayout ● Il RelativeLayout permette ai figli di specificare la loro posizione relativa a quella di un altro, identificato tramite un ID. 241 GridLayout ● ● Il GridLayout (disponibile a partire dalla 4.0) consente di definire una griglia fatta di righe, colonne e celle all'interno delle quali inserire i widget. La differenza con il TableLayout è che gli oggetti all'interno delle celle si adattano alle variazioni nell'interfaccia (es. Dimensione dei font) e utilizza meno memoria. 242 Fragment ● Sono stati introdotti a partire dalla 3.0 ● La classe base per i Fragments è android.app.Fragment ● Facilitano il riuso di componenti in differenti layout: per es. , si può definire un layout di tipo single-pane per smartphone e multi-pane tablet. from: developer.android.com 243 Fragment DetailFragment fragment = (DetailFragment) getFragmentManager(). findFragmentById(R.id.detail_frag); if (fragment==null || ! fragment.isInLayout()) { // start new Activity } else { fragment.update(...); } Esistono fondamentalmente due approcci: ● ● Si utilizza una sola Activity che ad es. mostra due Fragment per i Tablet ed un fragment per gli Smartphone Facilitano il riuso di componenti in differenti layout: per es. , si può definire un layout di tipo single-pane per smartphone e multi-pane tablet. 244 Creazione della UI ● ● Mediante l'ADT è possibile creare l'intera UI della nostra applicazione, con i layout, i widget e le altre risorse, senza scrivere alcuna riga di codice Esistono anche altri tool di supporto tra i quali: ● DroidDraw per sviluppare la UI ● Android UI Utils composte da: UI Prototyping Stencils, per la prototipazione ● Android Asset Studio, per la generazione di Icone ● Android Icon Templates, raccolta di Icon Template in formato PhotoShop ● 245 Conclusioni In questa lezione abbiamo visto le caratteristiche di base della gestione dell'interfaccia utente da parte di Android. In particolare abbiamo visto l'organizzazione gerarchica degli oggetti e i 5 principali tipi di layout usati per disporre gli oggetti sullo schermo. 246 Sistemi Embedded - Android Lezione n. 13: Memorizzazione di dati Introduzione In questa lezione vedremo quali sono i metodi principali messi a disposizione da una applicazione Android per memorizzare dei dati in maniera permanente e successivamente recuperarli. Memorizzazione di dati ● ● ● Un tipico sistema operativo per PC fornisce un filesystem comune che ogni applicazione può usare per memorizzare e rileggere file che a seconda dei permessi possono essere anche letti da altre applicazioni. Android usa un approccio diverso: tutti i dati delle applicazioni, inclusi i file, sono privati di quella applicazione. Esistono dei meccanismi mediante i quali una applicazione può condividere i propri dati con le altre. Meccanismi di memorizzazione Android fornisce 6 meccanismi per memorizzare e recuperare dati. Il loro utilizzo dipende da tre da 2 aspetti fondamentali: ● ● I dati devono essere privati oppure possono essere accessibili da altre applicazioni I dati richiedono molto oppure poco spazio Meccanismi di memorizzazione Questi meccanismi sono: ● Shared Preferences (dati pubblici/privati) ● Internal Storage (dati privati) ● External Storage (dati pubblici) ● SQLite Database (dati strutturati privati) ● Rete (web service) ● Content Provider (dati privati accessibili) Preferences 1/3 ● ● ● Una applicazione può scrivere e leggere valori (detti ”Preferences”) condivisi con altre applicazioni dello stesso package (”shared preferences”) oppure privati dell'Activity. Per Preferences si intendono le informazioni di personalizzazione di una applicazione come per es. il colore di sfondo, i tipi di carattere, la suoneria predefinita... Tali Preferences possono essere definite tramite codice oppure mediante uno specifico file xml da salvare nella cartella res\xml Preferences 2/3 ● ● Per scrivere e leggere le shared preferences si usa il metodo getSharedPreferences(). Per scrivere e leggere le preferences private si usa il metodo getPreferences(). Preferences 3/3 E' possibile definire le seguenti preferences: ● CheckBoxPreferences ● DialogPreferences ● EditTextPreferences ● ListPreferences ● RingtonePreferences Preferences 4/4 <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" android:key="first_preferencescreen"> <CheckBoxPreference android:key="wifi enabled" android:title="WiFi" /> <PreferenceScreen android:key="second_preferencescreen" android:title="WiFi settings"> <CheckBoxPreference android:key="prefer wifi" android:title="Prefer WiFi" /> ... altre preferences ... </PreferenceScreen> </PreferenceScreen> Internal Storage 1/3 ● I file creati da un'applicazione sono salvati all'interno della directory data/data/<package>/ ● ● ● ● Soltanto l'app può scrivere all'interno di questa cartella. E' però possibile creare sottocartelle all'interno di essa nelle quali le altre applicazioni possono leggere e scrivere. Un'applicazione può scrivere e leggere file locali usando i metodi openFileOutput() e openFileInput() con nome locale e percorso. Internal Storage 2/3 ● Se ci sono file statici inseriti nel progetto sotto res/raw/, bisogna accedervi usando il metodo openRawResource(). Internal Storage 3/3 I parametri utilizzabili sono: ● ● ● ● MODE_PRIVATE – Nessun accesso dalle altre app MODE_WORLD_READABLE – Sola lettura pe le altre app MODE_WORLD_WRITABLE – Accesso in scrittura per le altre app MODE_WORLD_READABLE | MODE_WORLD_WRITABLE – Accesso in lettura / scrittura per le altre app External Storage 1/4 ● ● ● Un dispositivo Android dispone di un External Storage, tipicamente una SD card, rimovibile o meno Tutti i file e le directory salvate all'interno dalla SD sono accessibili da parte di tutte le app Per poter accedere in lettura non è necessario specificare alcun permission, mentre in scrittura è necessario specificare il permesso: android.permission.WRITE_EXTERNAL_STORAGE ● Per ottenere la root della memoria esterna: File sdcardDir = Environment.getExternalStorageDirectory(); External Storage 2/4 Prima di procedere nelle operazioni di lettura/scrittura sulla SD card è necessario verificarne l'accessibilità mediante un apposito controllo: boolean mExternalStorageAvailable = false; boolean mExternalStorageWriteable = false; String state = Environment.getExternalStorageState(); if (Environment.MEDIA_MOUNTED.equals(state)) { mExternalStorageAvailable = mExternalStorageWriteable = true; } else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) { mExternalStorageAvailable = true; mExternalStorageWriteable = false; } else { mExternalStorageAvailable = mExternalStorageWriteable = false; External Storage 3/4 ● Per accedere a file privati sulla SD card si utilizza: getExternalFilesDir() per API level ≥8 getExternalStorageDirectory() per API level < 8 ● Nel primo caso i file saranno creati all'interno della SD card nella directory: /Android/data/<package_name>/files/ ● I file così creati sono file privati dell'app ● ”Tipicamente” non dovrebbero essere visibili alle altre app. ● Non esiste alcuna garanzia di sicurezza per questi file ● Se l'app viene rimossa questi file saranno cancellati. External Storage 4/4 ● ● Sulla SD card possono essere disponibili delle aree condivise all'interno delle qualsi salvare file pubblici: DIRECTORY_MUSIC, DIRECTORY_PICTURES, DIRECTORY_RINGTONES... Per accedere a file condivisi sulla SD card si utilizza: getExternalStoragePublicDirectory() per API level ≥8 getExternalStorageDirectory() per API level < 8 ● Nel primo caso i file saranno creati all'interno della SD card nella directory predefinita per il tipo di file File path = Environment.getExternalStoragePublicDirectory( Environment.DIRECTORY_PICTURES); ● Nel secondo caso si dovrà esplicitare il path da usare. SQLite ● ● ● ● ● Android supporta il sistema di database SQLite. SQLite è open source, supporta le funzionalità standard dei database relazionali e richiede pochissima memoria a runtime (circa 250 KBytes) Supporta i tipi di dato TEXT, INTEGER e REAL Per utilizzare SQLite in Android non è necessario alcun tipo di installazione o configurazione. Un database SQLite è privato: pertanto se una app vuole esporne il contenuto dovrà farlo mediante i Content Provider SQLite ● ● ● ● Il package android.database contiene tutte le classi generali per operare con il database Il package android.database.sqlite contiene le classi specifiche di sqlite. Android include nell'SDK il tool sqlite3, che permette di visualizzare il contenuto delle tabelle, eseguire comandi SQL ed effettuare sui database SQL altri tipi di operazioni. Tutti i database sul dispositivo sono memorizzati nella directory /data/data/<NOME_PACKAGE>/databases SQLiteOpenHelper ● ● ● ● La classe che dovrà gestire il nostro database è ereditata da SQLiteOpenHelper Normalmente si sovrascrivono i metodi onCreate() per creare il database e onUpgrade() per aggiornare il database in caso di modifiche nel suo schema. Come primary key delle tabelle si utilizza ”_id”. Una buona pratica è quella di definire classe per ciascuna Tabella del database con almeno i due metodi onCreate() e onUpdate(). Cursor ● ● ● ● Il Cursor è l'oggetto restituito dall'esecuzione di una query e punta all'insieme dei risultati della query Per conoscere il numero degli elementi si utilizza il metodo count() Per navigare tra i risultati si usano i metodi moveToFirst(), moveToNext() e isAfterLast() Per accedere ai dati del Cursor si utilizzano i metodi getLong(indiceColonna) e getString(indiceColonna) SQLiteDatabase 1/ ● ● ● SQLiteDatabase è la classe base mediante la quale opereremo con il nostro database Fornisce i metodi insert(), update() e delete() Il metodo execSQL() ci permentte di eseguire direttamente del codice SQL (con dei limiti) db.execSQL("CREATE TABLE customer (_id INTEGER PRIMARY KEY NOT NULL, name TEXT NOT NULL, address TEXT);"); ● Il metodo rowQuery() esegue una query SQL e restituisce un oggetto Cursor Cursor mCursor = db.rawQuery(”SELECT * FROM customer WHERE _id = 1;”, null); SQLiteDatabase 2/ ● Il metodo query() restituisce un oggetto Cursor sull'insieme dei risultati Cursor query (String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit) Content Provider ● ● ● ● Se si vogliono rendere pubblici dei dati bisogna creare un Content Provider. Questo oggetto permette di memorizzare dati accessibili da tutte le applicazioni. E' l'unico modo attraverso il quale package diversi possono condividere dati. Android di serie fornisce Content Provider per i tipi di dati più comuni (es. contatti o file multimediali). Interrogare un Content Provider ● ● ● Il modo nel quale un Content Provider memorizza i dati è specifico dell'implementazione, ma tutti i Content Provider devono rispettare una convenzione comune per effettuare una query e restituire i risultati. Ogni Content Provider espone una stringa (URI, Uniform Resource Identifier) univoco. Un URI può indicare tutti gli oggetti di un certo tipo oppure uno specifico record. Sintassi dell'URI ● A: prefisso standard (sempre uguale) ● B: percorso completo della classe ● C: percorso completo del tipo di dato ● D: se presente è l'ID dello specifico record Esempi di URI è l'URI che restituisce la lista di tutti i contatti sul dispositivo. ● content://contacts/people/ ● content://contacts/people/23 ● content://media/internal/images/ ● content://media/external/images/ è l'URI che restituisce il contatto con ID=23 restituisce la lista delle immagini memorizzate nel dispositivo restituisce la lista delle immagini contenute nella scheda di memoria (es. SD-Card) Content Provider - Permission ● ● Il modello di sicurezza di Android richiede che un'applicazione non possa eseguire una data azione ”sensibile” senza aver richiesto ed ottenuto la relativa Permission Tale richiesta deve essere dichiarata all'interno dell' AndroidManifest.xml e viene gestita a runtime, ma è durante l'installazione che l'utente concede o non concede la Permission richiesta. <uses-permission android:name="android.permission.READ_CONTACTS"> </uses-permission> Content Provider - Esempio L'esempio seguente accede al Content ”Contatti” elencando il contenuto ContentResolver cr = getContentResolver(); Uri uri = Uri.parse("content://com.android.contacts/contacts"); ); Cursor cur = cr.query(uri, null, null, null, null); if (cur.getCount() > 0) { while (cur.moveToNext()) { String id = cur.getString( cur.getColumnIndex(ContactsContract.Contacts._ID)); String name = cur.getString( cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); } } cur.close(); Rete Infine non bisogna dimenticare che ovviamente i dati oltre che sul dispositivo possono essere memorizzati sulla rete. I package utili a questo scopo sono: java.net.* e android.net.* Conclusioni In questa lezione abbiamo visto gli strumenti messi a disposizione da Android per la memorizzazione permanente dei dati: le Preferences, i File, i Database, i Content Provider e ovviamente la rete. Sistemi Embedded - Android Lezione 14: Location, Maps, Servizi di Sistema Introduzione In questa lezione ci occuperemo di analizzare due casi d'uso che fanno uso dei servizi di localizzazione e della Google Maps LocationManager Project Nel primo caso d'uso svilupperemo un progetto che ci permette di analizzare le potenzialità del LocationManager di Android LocationManager 1/2 ● ● ● ● LocationManager è una classe che permette di accedere al system location service consentendo di ricevere notifiche sulla posizione del disposivo Permette ad una applicazione di ricevere aggiornamenti periodici della posizione del device Può invocare un Intent nel caso in cui il dispositivo si trova in una particolare posizione Per accedere a questo servizio si usa: public abstract getSystemService(String name) In cui name assume il valore Context.LOCATION_SERVICE LocationManager 2/2 ● ● ● ● Il LocationManager ottiene le informazioni della posizione mediante i LocationProvider disponibili all'interno del sistema: al momento esistono provider basati su GPS o sulla rete WIFI La scelta del provider dipende dai particolari criteri richiesti dalla nostra applicazione, per es. accuratezza, potenza, velocità, costo, altitudine. Per essere notificati sulla posizione è necessario definire una istanza dell'interfaccia LocationListener Location Manager e LocationListener sono definiti all'interno del package android.location Location Listener ● Per ricevere una notifica da parte del provider prescelto è necessario definire il seguente metodo: public void requestLocationUpdates(String provider, long minTime, float minDistance, LocationListener listener) ● LocationListener rappresenta una interfaccia che prevede la definizione di una serie di operazioni, tra cui: ● onLocationChanged() ● onProviderEnabled() ● onStatusChanged() ● onProviderDisabled() LocationManager Codice 1/2 LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); locationManager.requestLocationUpdates(LocationManager.GPS _PROVIDER, 0,0,listenerFine); ● ● ● Mediante questo codice il LocationManager consente di registrare il LocationListener listenerFine rispetto al GPS_PROVIDER Avremmo potuto registrarlo anche sul NETWORK_PROVIDER Avremmo potuto anche invocare la più generica locationManager.requestLocationUpdates( locationManager.getBestProvider(fineCriteria, true), 0, 0, listenerFine); LocationManager Codice 2/2 new LocationListener() { @Override public void onLocationChanged(Location location) {} @Override public void onProviderDisabled(String provider) {} @Override public void onProviderEnabled(String provider) {} @Override public void onStatusChanged(String provider, int status,Bundle extras) {} } AndroidManifest.xml ● Per poter usufruire dei servizi di notifica è necesserio richiedere il ”permesso” mediante il seguente codice: <uses-permission android:name= "android.permission.ACCESS_FINE_LOCATION" /> ● ● In questo caso stiamo richiedendo di accedere alle informazioni di localizzazione in maniera precisa (FINE), utilizzando quindi il GPS In alternativa avremmo potuto richiedere il permesso ACCESS_COARSE_LOCATION per accedere alle informazioni di localizzazione (meno precise) fornite dalla rete WIFI LocationManager e ADT ● Una caratteristica di questa applicazione è rappresentata dalla possibilità di interagire con il dispositivo virtuale mediante l' Emulator Control ● E' possibile inviare informazioni all'AVD anche nel formato GPX (GPS Exchange Format) e KML (Keyhole Markup Language) OnLocationChanged 1/3 @Override public void onLocationChanged(Location location) { Log.i(LOG_TAG,location.getLatitude() +":"+location.getLongitude()); Toast.makeText(LocationManagerTest.this,location.getLatitude() +":"+location.getLongitude(), Toast.LENGTH_SHORT).show(); } ● In questo caso onLocationChanged registra i valori relativi alla nuova Location mediante un Log e la visualizzazione di un Toast OnLocationChanged 2/3 onLocationChanged 3/3 ● ● ● Una seconda particolarità di questa applicazione è la costituita dal fatto che anche quando la nostra Activity non si trova nel ForeGround rimane comunque in ascolto della possibile variazione di posizione Ciò significa che l'Activity riceve comunque le notifiche da parte del LocationManager pur essendo in background Se questo comportamento non è richiesto da parte della nostra applicazione è conveniente intervenire evitando in tal modo il consumo della batteria removeUpdates ● Per interrompere le notifiche dovremo quindi richiamare removeUpdates in corrispondenza del metodo onPause() @Override protected void onPause() { locationManager.removeUpdates(locationListener); super.onPause(); } ● Per consentire alla nostra applicazione di ricevere nuovamente le notifiche non appena tornerà in ForeGround dovremo invocare locationManager.requestLocationUpdates all'interndo del metodo onResume() Google Maps API Project Nel second caso d'uso svilupperemo un progetto basato sulle Google Maps API mediante il quale effettueremo alcuni test sulla geolocalizzazione in Android Google Map API 1/3 ● ● ● Per sviluppare un progetto Android che interagisce con le Map di Google è necessario utilizzare le Google Maps API E' necessario creare un AVD ed un progetto che tengano conto del particolare target di riferimento (stiamo utilizzando librerie esterne ad Android standard Verifichiamo la disponibilità di queste librerie lanciando il tool ”Android SDK and AVD Manager” ed eventualmente provvediamo alla loro installazione Google Maps API 2/3 Google Maps API 3/3 ● Dopo aver installato le librerie necessarie i nuovi target saranno finalmente disponibili in fase di creazione di un nuovo progetto Android map key 1/4 ● ● ● ● Per poter utilizzare le Google Maps API è necessario disporre di una map-key Tale codice sarà associato al certificato che utilizziamo per firmare la nostra applicazione E' necessario disporre di una chiave per il certificato di debug ed una per il certificato di release Di seguito vedremo come ottenere il codice per il certificato di debug map key 2/4 ● ● Il primo passo consiste nell'individuare dove si trova il keystore Per far questo, in Eclipse, andiamo su Window| Preferences|Build map key 3/4 ● Facendo riferimento al keystore eseguiamo il seguente comando: keytool -list -alias androiddebugkey -keystore <keystore> -storepass android -keypass android ● Il risultato di questo comando sarà la visualizzazione dell'MD5 Tipo keystore: JKS Provider keystore: SUN Il keystore contiene 1 entry androiddebugkey, 11-mar-2011, PrivateKeyEntry, Impronta digitale certificato (MD5): 94:1E:43:49:87:73:BB:E6:A6:88:D7:20:F1:8E:B5:98 map key 4/4 ● Accedendo alla pagina: http://code.google.com/android/maps-api-signup.html ● Dopo aver copiato la stringa MD5 nell'apposito spazio ed accettato la licenza d'uso possiamo finalmente generare l'API key main.xml ● L'ultimo passo consiste nel creare e/o modificare il layout dell'applicazione inserendo una WebView come desritto di seguito: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> ●<com.google.android.maps.MapView spèiega android:id="@+id/mapView" android:layout_width="fill_parent" android:layout_height="fill_parent" android:apiKey="0Zn3QJYynsgECUjkilDgQwp91xUczVAWg0 vo4IA" /> </LinearLayout> AndroidManifest.xml <uses-library android:name="com.google.android.maps" /> <uses-permission android:name= "android.permission.INTERNET"></uses-permission> <uses-permission android:name= "android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name= "android.permission.ACCESS_FINE_LOCATION"/> ● Tra le definizioni più importanti presenti all'interno del file manifest ci sono i permessi e la libreria di google maps Google Maps demo requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.main); mapView = (MapView) findViewById(R.id.mapView); mapView.setClickable(true); mapView.setBuiltInZoomControls(true); mapView.getController().setZoom(21); mapView.setSatellite(true); LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); ● ● Il widget mapView è stato inserito in precedenza all'interno del layout main Non essendo stata definita alcuna posizione iniziale l'applicazione visualizzerà la mappa di default Google Maps demo ● La MapActivity richiede l'implementazione della seguente funzione: @Override protected boolean isRouteDisplayed() { return false; } ● ● Tale funzione permette di dichiarare se la nostra applicazione utilizzerà informazioni di routing o no Come richiesto dalla licenza d'uso di Google Maps non può essere omessa e la sua eventuale assenza ci sarà comunicata in fase di compilazione Google Maps demo new LocationListener() { @Override public void onLocationChanged(Location location) { } @Override public void onProviderDisabled(String provider) { } @Override public void onProviderEnabled(String provider) { } @Override public void onStatusChanged(String provider, int status,Bundle extras) { } }); ● Come nel caso precedente definiamo i metodi del LocationListener che intendiamo gestire Google Maps demo Esempio: quando il dispositivo si troverà in una nuova posizione ● Modificheremo il livello zoom ● Aggiorneremo la visualizzazione della mappa @Override public void onLocationChanged(Location location) { GeoPoint myGeoPoint = GeoPoint((int)(location.getLatitude()), (int)(location.getLongitude())); mapView.getController().setZoom(10); mapView.getController().animateTo(myGeoPoint); } ● Anche in questo caso possiamo utilizzare l'ADT per interagire con l'emulatore Google Maps demo - Codice ● Utilizziamo i seguenti valori ed inviamoli all'AVD ● Sarà visualizzata la seguente mappa: I servizi di Sistema ● ● Negli esempi proposti in precedenza si è fatto più volte uso dei servizi di sistema. Abbiamo sempre effettuato l'accesso con la chiamata: getSystemService() che ci ha consentito di utilizzare uno specifico Manager ● Oltre a quelli già analizzati, come il NotificationManager, l'AlarmManager I servizi di Sistema ● ● ● ● Power Service: per la gestione del risparmio energetico. Si accede mediante POWER_SERVICE Key Guard Service: per la gestione del lock della tastiera. Si accede mediante KEYGUARD_SERVICE Vibrator Service: per la gestione della vibrazione del dispositivo. Si accede mediante VIBRATOR_SERVICE Alarm Service: per la gestione degli allarmi. Si accede mediante ALARM_SERVICE I servizi di Sistema ● ● ● ● Audio Service: per la gestione delle risorse audio. Si accede mediante AUDIO_SERVICE Telephony Service: per la gestione di chiamate ed SMS. Si accede mediante TELEPHONY_SERVICE Connectivity Service: per la gestione della rete. Si accede mediante CONNECTIVITY_SERVICE WiFi Service: per la gestione della WIFI. Si accede mediante WIFI_SERVICE I servizi di Sistema ● ● ● Accessibility Service: per la gestione eventi GUI. Si accede mediante ACCESSIBILITY_SERVICE Input Method Service: per la gestione dell'interattività. Si accede mediante INPUT_METHOD_SERVICE ClipBoard Service: per la gestione degli appunti. Si accede mediante CLIPBOARD_SERVICE I Sensor Service 1/2 ● ● ● Rappresentano probabilmente i servizi più specifici di Android Si accede mediante SENSOR_SERVICE E' possibile accedere ad una lunga lista di sensori, tra cui l'accelerometro, il giroscopio e la bussola. I Sensor Service 1/2 TYPE_ACCELEROMETER Accelerometro. TYPE_ALL Tutti. TYPE_AMBIENT_TEMPERATURE Temperatura TYPE_GRAVITY Gravità. TYPE_GYROSCOPE Giroscopio TYPE_LIGHT Luminosità TYPE_LINEAR_ACCELERATION Accelerazione lineare. TYPE_MAGNETIC_FIELD Intensità campo magnetico TYPE_PRESSURE Pressione TYPE_PROXIMITY Prossimità I Sensor Service 2/2 TYPE_RELATIVE_HUMIDITY Umidità TYPE_ROTATION_VECTOR Rotazione vettoriale TYPE_ORIENTATION (Bussola) Deprecato I Sensor Service @Override protected void onResume() { super.onResume(); mSensorManager.registerListener(this, mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_FASTEST); mSensorManager.registerListener(this, mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD), SensorManager.SENSOR_DELAY_FASTEST); mSensorManager.registerListener(this, mSensorManager.getDefaultSensor(Sensor.TYPE_TEMPERATURE), SensorManager.SENSOR_DELAY_FASTEST); } @Override protected void onStop() { mSensorManager.unregisterListener(this); super.onStop(); } Sistemi Embedded per il Mobile Multimedia Ultime novità in Android Android 4.1 – Jelly Bean ● Maggiore reattività grazie all'integrazione del Project Butter (V-Sync ottimizzato e sincronizzato al tocco) ● Supporto al Multi-Tasking ● Crittografia delle app ● Aggiornamenti incrementali delle apk ● Offline voice typing ● Google Now ● Notifiche Android 4.1 – Jelly Bean ● ● ● ● Google Cloud Messaging (GCM) è un nuovo servizio che permette agli sviluppatori di inviare brevi messaggi alle loro applicazioni alle loro applicazioni Android GCM non garantisce la consegna dei messaggi Non è necessario che l'Applicazione sia attiva per ricevere il messaggio All'arrivo di un messaggio GCM l'App viene risvegliata mediante un Intent Broadcast http://developer.android.com/guide/google/gcm/gcm.html Android 4.1 – Jelly Bean Android 4.2 – Jelly Bean ● Gestione della Multi-utenza (al momento solo per Tablet)