INTRODUZIONE ALLA PROGRAMMAZIONE ANDROID Giuseppe Marziale Bari, 27 Novembre 2013
About Me (Giuseppe Marziale) Sono Laureato in Ingegneria informatica specializzazione in sistema informativi e reti ( Ottobre 2007) Lavoro in exprivia con il ruolo di technical leader in ambito di sviluppo di applicazioni mobile Prevalentamente in ambito B2B Sviluppiamo su Android, Ios, blackberry, Windows Phone e in multipiattaforma Email : gmarziale83@gmail.com skype: giuseppe_marziale
Agenda Introduzione alla piattaforma Android Struttura di un applicazione Android e tool di sviluppo Laboratorio
Introduzione alla piattaforma Android 4
Perché sviluppare Mobile Fonte: comscore.com
Perché sviluppare Mobile La diffusione degli smartphone, è enorme ed in continua crescita. Gli utenti connessi sono milioni e le app scaricate hanno superato 10 miliardi di copie Fonte: pureoxygenmobile.com
Perché Android(OS Marketshare) Fonte: IDC Worldwide Mobile Phone Tracker, Agosto 2013
Perché Android(Trend Vendite) Fonte: Wikipedia
Perché Android Curva di apprendimento non è ripida ( a differenza dello sviluppo IOS) Android è open-source e i tool di sviluppo sono scaricabili gratuitamente I costi di pubblicazione di un app sul market store di android sono esigui ( 25 dollari una tantum) Installare un app android sul cellulare è un processo banale, le app android possono essere diffuse facilmente attraverso un sito web(time to market molto basso)
Android Manufacteres
ARCHITETTURA ANDROID Applicazioni Application Framework Librerie native + Android runtime Linux kernel 11
Cos è Android E uno stack software per dispositivi mobili 1.Sistema Operativo: open source appoggia al kernel Linux (>=2.6.27) driver per l hardware 2.Middleware: librerie, android runtime, application framework 3.Applicazioni: native o di terze parti.
Linux Kernel kernel Linux v2.6 Driver dei dispositivi fisici 13
Librerie e Runtime Le librerie native sono esposte attraverso l application framework; sono scritte in linguaggio nativo (C/C++) Android runtime è l ambiente di esecuzione delle applicazioni, scritte in Java, basato su Dalvik VM 14
Application Framework L application framework fornisce le API di alto livello che forniscono servizi evoluti Le applicazioni native Android e quelle di terze parti utilizzano le API suddette. 15
TIPOLOGIA MOBILE APP 16
Applicazioni native Android 1. Scritte in Java utilizzando la sdk ufficiale distribuita da google Non supporta tutte le librerie Java come ad esempio Swing & AWT 2. Il codice java è compilato in byte code Dalvik (.dex) Ottimizzati per i dispositivi mobili (migliore gestione della memoria e delle risorse, utilizzo della batteria, etc.) 3. La Dalvik virtual machine esegue i files.dex 17
Struttura di un app Android e ambiente di sviluppo 18
Componenti base di un app Activities Fragment View e ViewGroups Service Intent Broadcast Receiver Content Provider
Activities Componenti base di un applicazione android. Un activity è una singola schermata mostrata all utente. Un app android deve avere almeno un activity ma può averne più di una che si alternano durante l esecuzione dell applicazione. Ciascuna Activity è indipendente dall altra. Un applicazione esterna potrebbe lanciare un Activity di un altra app.
Fragment E una sezione modulare di un activity Ha un suo ciclo di vita Può essere aggiunto o rimosso a runtime. Componente riusabile in diverse Activity. Sono disponibili dalle api 11 in poi.
View e ViewGroups Sono I componenti di interazione con gli utenti che costituiscono le user interface( bottoni, campi di testo, label, ). Sono classi che estendono android.view.view. Views. I viewgroups sono contenitori di view (invisibili), servono per organizzare e impaginare le view. Sono classi che estendono android.view.viewgroups. ViewGroup
Services Eseguono operazioni in background che non richiedono l interazione diretta dell utente: es. Musica in sottofondo, scaricamento di un file, tracking della posizione dell utente. Un servizi non hanno user interface. Un Activity può fare lo start di un servizio ( e lo stop) e operare interazioni con lo stesso.
Intent E un messaggio asincrono di sistema che si compone di un azione da eseguire e dei dati. Può essere esplicito o inplicito: in quest ultimo caso il sistema individua il componente che può eseguire tale azione (Intent Receiver) e la esegue. Un applicazione si abilita alla registrazione di un particolare intent dichiarando un IntentFilter.
Intent Un intent può essere usato per: esplicitare un compito o azione che una Activity o un Service possono eseguire solitamente con o su un particolare insieme di dati; lanciare una particolare Activity o Service; Supportare l'interazione tra qualsiasi applicazione installata sul dispositivo Android, senza doversi preoccupare di che tipo di applicazione sia o di quale componente software gli Intent facciano parte.
Intent example:visualizzazione url
Broadcast Receiver Un app registra un broadcast receiver che e configurato per ricevere e gestire determinati messaggi di sistema e intent; Un app può anche definire dei propri intent custom, lanciarli e gestirli. Un app non può lanciare messaggi di sistema. Un Broadcast Receiver non ha una user interface.
Android Security Ogni app in android gira nel proprio processo associata ad un user ( di sistema) e ad un gruppo univoco Ogni app è quindi isolata dalle altre e non può accedere ai dati delle altre app. L unico modo di condividere dati tra applicazioni è dichiarare esplicitamente un content provider. Un app ad install time ha bisogno di richiedere le autorizzazione per poter accedere a dati come i contatti, gli sms, la galleria di foto, gli storage ( sd o memoria interna);
Content Provider Un content provider gestisce un set di dati condivisi Tramite un content provider un altra app potrebbe leggere e eventualmente modificare i dati esposti. Un app può definire un Content Provider privato, non condiviso con altre app.
Content Provider Il sistema operativo mette a disposizione una serie di content provider nativi. http://developer.android.com//reference/android/provider/package-summary.html. Il database dei contatti I contenuti multimediali (audio, video, foto)
Struttura di un progetto Android
Android Manifest <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="it.gmarz83.android.temperatura" android:versioncode="1" android:versionname="1.0"> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".convert" 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> <uses-sdk android:minsdkversion= 8 android:targetsdkversion= 17 /> <uses-feature android:name="android.hardware.camera android:required= false"> </uses-permission> <uses-permission android:name="android.permission.internet "> </usespermission> </manifest>
Android Manifest Permission <uses-permission android:name="android.permission.internet "> Tra i principali permessi che possiamo richiedere ci sono i seguenti: READ_CONTACTS: leggere (ma non scrivere) i dati dei contatti dell'utente. WRITE_CONTACTS: scrivere (ma non leggere) i dati dei contatti dell'utente RECEIVE_SMS: monitorare l'arrivo di messaggi SMS INTERNET: accedere ed utilizzare la connessione Internet ACCESS_FINE_LOCATION: utilizzare un accurato sistema di localizzazione come il GPS
Feature e permission categoria permission feature Location access_mock_location android.hardware.location access_location_extra_commands android.hardware.location install_location_provider access_coarse_location access_fine_location android.hardware.location android.hardware.location.network e android.hardware.location android.hardware.location e android.hardware.location.gps http://developer.android.com/guide/topics/manifest/uses-feature-element.html#permiss
Struttura di un progetto Android
Cartella assets contiene risorse esterne necessarie all applicazione (file audio, video, etc)
Struttura di un progetto Android
Cartella drawable Contiene I file immagine che saranno utilizzati all interno dell app( compresa l icona dell applicazione)
Struttura di un progetto Android
Cartella layout Contiene I file di layout delle schermate della nostra app. Il layout può essere definito anche da codice, ma è preferibile utilizzare l xml perchè disaccoppia la logica dalla definizione della user interface
Struttura di un progetto Android
Cartella Values(RES) Contiene file xml che definiscono risorse utilizzabili all interno dell applicazione Es. Il file delle stringhe o il file contenente lo stile dell'app.
Cartella Values(RES) <?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">nome App</string> </resources> <application android:icon="@drawable/icon" android:label="@string/app_name">
Struttura di un progetto Android
Cartella GEN Contiene un file R.java generato automaticamente da eclipse( non bisogna modificarlo). In questo file a ciascuna risorsa definita nella cartella Res( immagini, stringhe, view contenute nei layout ) è associato un id univoco mediante il quale è possizione referenziare il suddetto oggetto. Es. Per accedere alla stringa app_name: getstring(r.string.app_name));.
Struttura di un progetto Android
Contiene i file sorgente della nostra applicazione Cartella src
Activity lifecycle
Activity State L activity può restare per un periodo esteso di tempo solo nei seguenti stati: Resumed (running state): l activity è in foreground e l utente può interagire con la schermata; Paused: l activity è parzialmente oscurata da un altra schermata ( schermata semitrasparente o semplicemente un pop-up (alert dialog) ). L activity in questo caso non riceve input dall utente e non esegue codice; Stopped: l activity è completamente nascosta e invisibile all utente, ossia in background; Non esegue codice ma il contenuto delle sue variabili di istanza è mantenuto.
Gestione activity callback
Laboratorio App multidevice Hello word Intent tutorial Location Manager e Google Map tutorial Editor di note
App Multidevice I dispositivi android hanno una moltitudine di dimensioni, risoluzioni, e densità La densità è il numero di pixel per pollice calcolato sulla diagonale.
Classi di Device Per semplificare la realizzazione della User Interface Android raggruppa gli attuali device in classi in base a screen size e screen density (dpi). Screen sizes Small (426dp x 320dp) Normal (470dp x 320dp) baseline size Large (640dp x 480dp) xlarge (960dp x 720dp) Screen densities low o ldpi (~120 dpi) medium o mdpi (~160 dpi) baseline density high o hdpi (~ 240 dpi) extra high o xhdpi (~ 320 dpi) extra extra high o xxhdpi (~ 480 dpi)
Correlazione fra screen size/density reale e generalizzata Classi di Device
Classificazione Device
Classi di Device Note: A partire da Android 3.2 (API level 13), questi gruppi sono deprecati al posto di una nuova tecnica basata sulla screen width disponibile (espressa in dp). E un concetto molto simile alle CSS3 Query Nuovi qualificatori di dimensione I nuovi qualificatori offono più controllo sullo specifico screen sizes che l app supporta rispetto ai tradizionali 4 gruppi (small, normal, large, xlarge). Typical screen widths: 320dp: a typical phone screen (240x320 ldpi, 320x480 mdpi, 480x800 hdpi..) 360dp: a 5 phablet (es. note). 600dp: a 7 tablet (600x1024 mdpi). 720dp: a 10 tablet (720x1280 mdpi, 800x1280 mdpi, etc). http://developer.android.com/guide/practices/screens_support.html#declaringtabletlayouts 56
Supportare Multiple Screens Dichiarare esplicitamente nel manifest quali screen sizes la nostra app supporta <supports-screens android:xlargescreens="true" /> Provvedere layout differenti per differenti screen sizes I qualificatori utilizzati sono small, normal, large, xlarge Da Android 3.2 sw<n>dp definisce min-width richiesto per layout resource Provvedere immagini differenti per diverse densità I qualificatori utilizzati sono ldpi, mdpi, hdpi, xhdpi In base a size e density dello schermo corrente il sistema utilizza la risorsa adeguata http://developer.android.com/guide/topics/resources/providingresources.html#bestmatch
Esempio di sottocartelle res/layout/my_layout.xml // layout for normal screen size ("default") res/layout-small/my_layout.xml // layout for small screen size res/layout-large/my_layout.xml // layout for large screen size res/layout-xlarge/my_layout.xml // layout for extra large screen size res/layout-xlarge-land/my_layout.xml // layout for extra large in landscape orientation res/drawable-mdpi/my_icon.png // bitmap for medium density res/drawable-hdpi/my_icon.png // bitmap for high density res/drawable-xhdpi/my_icon.png // bitmap for extra high density Supportare Multiple Screens
La Soluzione Usare wrap_content, fill_parent or dp units nella definizione di android:layout_width and android:layout_height in un file di layout XML per garantire che la view abbia una grandezza appropriata per la corrente dimensione dello schermo del device. Non usare mai misure in pixel hard coded nelle app. Non usare l absolutelayout ( che è deprecato da Android 1,5) ma usare RelativeLayout Inserire repliche della stessa immagine per ogni densità Testare l app usando gli emulatori Approfondimento: http://docs.huihoo.com/android/2.2/guide/practices/screens_support.html
La Soluzione: Dpi DPI = Density Indipendent Pixel ossia un unità di misura dello schermo indipendente dalla densità 1 pixels = DP(density pixel) * (DPI(densità) / 160). 1 dp è equivalente ad un pixel fisico solo su schermi a 160 dpi (densità media) Indipendentemente dalla dimensione e della densità dello schermo il density pixel occupa sempre lo stesso spazio
La Soluzione: Scalare le immagini 3:4:6:8:12 è il rapporto tra le 4 densità. Se ho un immagine di 100px e la risoluzione base è mdpi(160 dpi che corrisponde al rapporto 4) si ottiene: 1.ldpi: 75 75, cioè 3/4 della risoluzione base (100 * 3 / 4 = 75); 2.mdpi: 100 100; 3.hdpi: 150 150, cioè una volta e mezzo la risoluzione base (100 * 6 / 4 = 100 * 3 / 2 = 100 * 1,5 = 150); 4.xhdpi: 200 200, cioè il doppio della risoluzione base (100 * 8 / 4 = 100 * 2 = 200). 5.xxhdpi: 300 300, cioè il triplo della risoluzione base (100 * 12 / 4 = 100 * 3 = 300).
Intent esplicito Si tratta di un utilizzo dell oggetto Intent nel quale si esplicita l oggetto che si vuole richiamare : Intent i = new Intent(this, ActivityTwo.class); i.putextra("value1", "This value one for ActivityTwo "); i.putextra("value2", "This value two ActivityTwo");
Intent implicito Si tratta di un utilizzo dell oggetto Intent nel quale si esplicita l oggetto che si vuole richiamare : L intent implicito non specifica una classe Java bensì un azione e opzionalmente un uri associata all azione: Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://gmarz83.altervista.org")); Android individua quale componente è registrato per gestire tale azione Se individua un solo componente, esegue l azione se ce n è più di uno un dialog chiede all utente verso quale componente dirigire l azione
Trasferimento Dati Intent espliciti o impliciti posso contentere dati extra Intent sharingintent = new Intent(Intent.ACTION_SEND); sharingintent.settype("text/plain"); sharingintent.putextra(android.content.intent.extra_text, " allegato!"); startactivity(intent.createchooser(sharingintent,"condividi"));
Trasferimento Dati 2 Il componente che riceve l intent estrae i dati così Bundle extras = getintent().getextras(); if (extras == null) { return; } String value1 = extras.getstring(intent.extra_text); if (value1!= null) { // fai qualcosa}
Chiamare Activity con Risultato Intent i = new Intent(this, ActivityTwo.class); i.putextra("val1", valore 1"); i.putextra("val2", valore 2"); startactivityforresult(i, REQUEST_CODE);
Chiamare Activity con Risultato 2 @Override public void finish() { Intent data = new Intent(); data.putextra("returnkey1", "risultato1"); data.putextra("returnkey2", "risultato2"); setresult(result_ok, data); super.finish(); }
Chiamare Activity con Risultato 3 @Override protected void onactivityresult(int requestcode, int resultcode, Intent data) { if (resultcode == RESULT_OK && requestcode == REQUEST_CODE) { if (data.hasextra("returnkey1")) { Toast.makeText(this, data.getextras().getstring("returnkey1"), Toast.LENGTH_SHORT).show(); } } }
Intent Filter Un componente si registra e si abilita alla ricezione di determinati intent attraverso la definizione di un intent filter, che avviene nel manifest.xml <activity android:name=".browseractivitiy" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.view" /> <category android:name="android.intent.category.default" /> <data android:scheme="http"/> </intent-filter> </activity>