Upload
dominh
View
221
Download
0
Embed Size (px)
Citation preview
INTRODUZIONE ALLA PROGRAMMAZIONE ANDROID
Bari, 27 Novembre 2013
Giuseppe Marziale
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 : [email protected] skype: giuseppe_marziale
Agenda
Introduzione alla piattaforma Android
Struttura di un’applicazione Android e tool di sviluppo
Laboratorio
4
Introduzione alla piattaforma Android
Perché sviluppare Mobile
Fonte: comscore.com
Perché sviluppare Mobile
Fonte: pureoxygenmobile.com
La diffusione degli smartphone, è enorme ed in continua crescita. Gli utenti connessi sono milioni e le app scaricate hanno superato 10 miliardi di copie
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
11
ARCHITETTURA ANDROID
Linux kernel
Librerie native + Android runtime
Application Framework
Applicazioni
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.
13
kernel Linux v2.6 Driver dei dispositivi fisici
Linux Kernel
14
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
Librerie e Runtime
15
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.
Application Framework
16
TIPOLOGIA MOBILE APP
17
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
Applicazioni native Android
18
Struttura di un’app Android e ambiente di sviluppo
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 "> </uses-permission> </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'utenteRECEIVE_SMS: monitorare l'arrivo di messaggi SMSINTERNET: accedere ed utilizzare la connessione InternetACCESS_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 android.hardware.location
access_coarse_location android.hardware.location.network e android.hardware.location
access_fine_location android.hardware.location e android.hardware.location.gps
http://developer.android.com/guide/topics/manifest/uses-feature-element.html#permissions-features
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
Cartella src
Contiene i file sorgente della nostra applicazione
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)
Classi di Device
Correlazione fra screen size/density reale e generalizzata
Classificazione Device
56
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
● Dichiarare esplicitamente nel manifest quali screen sizes la nostra app supporta<supports-screens android:xlargeScreens="true" />
Supportare Multiple Screens
● Provvedere layout differenti per differenti screen sizesI qualificatori utilizzati sono small, normal, large, xlargeDa 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 adeguatahttp://developer.android.com/guide/topics/resources/providing-resources.html#BestMatch
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 ScreensEsempio di sottocartelle
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>