INTRODUZIONE ALLA PROGRAMMAZIONE ANDROID · Introduzione alla piattaforma Android Struttura di...

Post on 25-Feb-2019

222 views 0 download

Transcript of INTRODUZIONE ALLA PROGRAMMAZIONE ANDROID · Introduzione alla piattaforma Android Struttura di...

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 : gmarziale83@gmail.com 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>