Fondamenti di sviluppo mobile su Android - Dott. A. Tedeschi Corso di - Area Sistemi Informativi
←
→
Trascrizione del contenuto della pagina
Se il tuo browser non visualizza correttamente la pagina, ti preghiamo di leggere il contenuto della pagina quaggiù
Fondamenti di sviluppo mobile su Android Dott. A. Tedeschi antonio.tedeschi@uniroma3.it Corso di Telecomunicazioni Wireless a.a. 2016-2017 © A. Tedeschi 2016/2017 1
Outline • Fondamenti di programmazione Android • Creare un nuovo progetto • Struttura del progetto • Struttura di un file apk • Activity lifecycle • Intent e la comunicazione tra activity e applicazioni • Emulatore © A. Tedeschi 2016/2017 2
Android: La prima app Recap Creazione di un nuovo progetto Android Studio -> Start a new Android Studio project © A. Tedeschi 2016/2017 4
Android: La prima app © A. Tedeschi 2016/2017 8
Android: La prima app Recap Creazione di un nuovo progetto: Android Studio -> Start a new Android Studio project Impostare opportunamente: • I nomi dell’app, del progetto e in particolare del package(!). NOTA com.example.NAME è il nome di default del package è consigliabile cambiarlo • La versione minima e target delle API. Ciò permette di definire la retrocompatibilità di un’app e le API che possono essere adottate. © A. Tedeschi 2016/2017 9
Android: Struttura del progetto Organizzazione del progetto e struttura dei file Android Studio propone diverse view come accade per Eclipse ognuna delle quali ci permette di visualizzare un determinato set cartelle e dati Di default, alla creazione di un nuovo progetto viene mostrata la vista Android project view, che: • mostra una versione ridotta del progetto mostrando solo i file e le cartelle principali • Raggruppa i file di build per tutti i moduli in un’unica cartella • Raggruppa i file di manifest per ogni modulo in un’unica cartella Android Studio permette la gestione dei Moduli, che possono essere applicazioni (mobile devices, TV, …), librerie e test © A. Tedeschi 2016/2017 10
Android: Struttura del progetto gradle • Si tratta di un prodotto di build automation diffuso nel mondo Java. L’omonima cartella contiene i gradler-wrapper file .idea • È la cartella in cui sono memorizzati i setting di IntelliJ IDEA Nota: Android Studio si basa su IntelliJ External Libraries • Contiene al suo interno un set di librerie necessarie per lo sviluppo dell’app. • appcompat_v7 • Libreria di supporto auto-importata alla creazione di un progetto in cui si crea un nuovo progetto • Permette retrocompatibilità di elementi presenti nelle recenti versioni, come ActionBar, utilizzabili dalla versione 2.1 e superiori • support-v4.jar permette l’utilizzo dei fragment dalla versione 1.6 e superiori (info) • design-23.1.0 libreria di supporto per la definizione di alcuni © A. Tedeschi 2016/2017 elementi material design 11
Android: Struttura del progetto build • Memorizza l’output della compilazione di tutti i moduli del progetto build.grade • Permette di customizzare le proprietà per la compilazione del sistema. Possibile usare le impostazioni di default gradlew e gradlew.bat • Startup script del gradel per i sistemi Unix e Windows, rispettivamente local.properties • Permette di settare le proprietà specifiche del calcolatore per fare la build del sistema, ad esempio il path della SDK installata. .iml • File del modulo creato da IntelliJ IDEA per memorizzare le informazioni sul modulo settings.gradle • Specifica i sotto-progetti da compilare 12 © A. Tedeschi 2016/2017
Android: Struttura del progetto assets • Cartella base vuota • È possibile utilizzarla per integrare nell’applicazione risorse primarie, come: font custom, database sqlite per lo storage dei dati, molteplici tipologie di file da utilizzare nell’applicazione. • Possibile navigare questa cartella come un file system attraverso l’AssetManager • Tale cartella non è inserita di default nella creazione del progetto, va aggiunta manualmente (tasto destro sul nome del progetto -> New -> Folders -> Assets Folder output • Directory di output della compilazione • Al suo interno è presente il file .apk ottenuto dalla compilazione del codice e delle risorse comprese quelle contenute in assets libs • Cartella in cui è consigliato inserire le librerie private che © A. Tedeschi 2016/2017 varranno impiegate nell’applicazione 13
Android: Struttura del progetto Classe responsabile della Grafica public static final class drawable { public static final int ic_launcher = 0x7f020000; } «Oggetto» grafico che Valore numerico univoco si vuole rappresentare che identifica «l’oggetto» Senza questo file Android non sarebbe in grado di effettuare le associazioni tra gli elementi che compongono l’activity dal punto di vista grafico (layout, immagini, bottoni, … ) e il codice Java dell’activity stessa. R.java non va MAI modificato manualmente! È compito del compilatore aggiungere o rimuovere classi o attributi. Quando si importa un progetto è possibile che questo file non sia presente o non venga generato © A. Tedeschi 2016/2017 correttamente -> fare Clean & Build del progetto manualmente 14
Android: Struttura del progetto app • Contiene il sorgente dell’applicazione non solo in termini di codice Java ma anche di gestione delle risorse AndroidManifest.xml • Generato automaticamente alla creazione del progetto • Permette la definizione: • delle Activity per renderle utilizzabili dal sistema • nome dell’applicazione • dei permessi, come accesso ad internet, localizzazione, etc © A. Tedeschi 2016/2017 15
Android Manifest How to… • Definire una activity in portrait • Impostare una activity come principale • Aggiungere un permesso © A. Tedeschi 2016/2017 16
Android: Struttura del progetto Java • codice sorgente come le Activity • logica di business dell’applicazione res • Contiene diverse tipologie di risorse, quali immagini, layout, file xml per definire le stringhe statiche, animazioni, ecc. Gradle Scripts • Al suo interno ci sono due file build.gradle: uno generale per tutto il progetto ed uno più specifico per ogni modulo che stiamo sviluppando • build.gradle (Module: app) contiene al suo interno le dipendenze e le configurazioni di default dell’app. Ad esempio: minSdkVersion, targetVersion, versionCode. NOTA: queste informazioni sono state rimosse dall’AndroidManifest alleggerendolo © A. Tedeschi 2016/2017 17
Android: Struttura del progetto drawable-LAYOUT sono le cartelle in cui inserire la grafica in base alla qualità dello schermo che si desidera supportare. • Se la grafica non è definita per ogni risoluzione, Android effettuerà il resize automatico a partire dalla risoluzione più vicina a quella che deve essere finita. • Possibili effetti collaterali come immagini sgranate o troppo piccole • Le cartelle drawable a diverse risoluzioni non sono create di default, ma possono essere create values: contiene diversi file xml per la definizione • stile dell’applicazione (style.xml) • dimensioni di margini dei layout, widget (es. TextView) o font (dimens.xml) • definizione delle stringe statiche della applicazione in una lingua di base scelta (string.xml) © A. Tedeschi 2016/2017 18
Android: Struttura del progetto anim • Contiene file XML per la creazione e gestione delle animazioni color • se necessario è possibile specificare colori non standard non offerti da Android xml • Insieme di file XML che possono essere utili per la configurazione di alcuni componenti dell’applicazione mipmap • è la cartella per le icone dell’app e permette al sistema di scegliere in base alla risoluzione del dispositivo l’icona opportuna. Rimpiazza la cartella drawable per le icone raw • Alternativa alla cartella assets. I file contenuti sono © A. Tedeschi 2016/2017 gestiti dall’Android Asset Packaging Tool 19
Android: Struttura del progetto layout: • contiene un insieme di file XML che rappresentano l’interfaccia grafica dell’applicazione. • Attenzione layout permette la gestione della grafica dell’applicazione ma spesso è necessarie creare ulteriori cartelle dal nome layout- RISOLUZIONE per gestire opportunamente una data risoluzione. menu • Contiene un insieme di file XML relativi ai menu impiegati nelle singole activity dell’applicazione. • Prende il nome dell’activity se questa è creata automaticamente. • Dalla versione 3.0 serve per gestire anche le ActionBar © A. Tedeschi 2016/2017 20
Android: Emulatore Contro • Lento (a volte molto) specie con laptop non prestanti • Presenta bug • Le ultime versioni (API 17 e superiori) richiedono Intel HAXM (Hardware Accelerator Execution Manager) per rendere più performante l’emulatore attraverso la virtualizzazione (da attivare dal Bios) non sempre disponibile nei propri laptop. Problema: se attivo Hyper-V, HAXM non viene installato e l’emulatore non viene eseguito (per Windows, Mac, Linux). Soluzione: scegliere quale dei due abilitare ogni volta oppure creare due opzioni di boot (guida) Pro • Possibilità di ricreare situazioni particolari, come la localizzazione, ricezione chiamate e messaggi • Permette la verifica del comportamento della nostra applicazione • Possibilità di creare device con risoluzione, qualità di schermo e versione dell’OS di nostro interesse al fine di testare la bontà dell’app dal punto di vista di compatibilità. Android Studio offre template di dispositivi già pronti all’utilizzo © A. Tedeschi 2016/2017 22
Android: Logcat • Il termine Log indica la registrazione cronologica delle operazioni man mano che vengono eseguite (Wikipedia). • Il termine Cat indica un comando dei sistemi operativi Unix e Unix- like che legge i file che gli sono specificati come parametri (o lo standard input) e produce sullo standard output la concatenazione del loro contenuto (Wikipedia). • I due termini uniti formano Logcat che indica il tracciamento cronologico delle operazioni con la relativa visualizzazione sullo standard output del sistema. Esempi reali: • Lista della spesa • Elenco delle chiamate ricevute ed effettuate, organizzate secondo un ordine cronologico © A. Tedeschi 2016/2017 23
Android: Logcat • iI logcat non è altro che un insieme di informazioni che ci permettono di ricordare o tracciare eventi nel passato • Ad ogni informazione può essere associato un livello (o meglio filtro), in modo da organizzare in modo gerarchico le informazioni. In particolare i livelli sono i seguenti: • V — Verbose (lowest priority) • D — Debug • I — Info • W — Warning • E — Error • F — Fatal • Tramite un analisi di questi dati e un apposito filtraggio per tag, PID o testo è possibile individuare la causa di errori o malfunzionamenti dell’applicazione. Il logcat è nostro amico… Imparare a usarlo salverà il nostro tempo… © A. Tedeschi 2016/2017 24
Struttura *.apk – build process • Android Asset Packaging Tool (aapt) prende le risorse, come il manifest e gli xml, e li compila. Questo passo genera il file R.java • aidl tool converte ogni interfaccia .aidl presente tra le interfacce Java • Tutto il codice Java (comprese R.java e I file .aidl) sono compilati restituendo file .class • dex tool converte i file .class in bytecode della Dalvik. Stessa cosa accade per le librerie incluse nel progetto © A. Tedeschi 2016/2017 25
Struttura *.apk – build process • I file .dex, le risorse compilate e quelle non compilate sono inserite nell’Android PacKaging (apk) • L’app viene firmata con la chiave di debug o di release • Se l’app è stata fermata con la chiave release è necessario allineare l’apk con lo zipalign tool, diminuendo l’uso della memoria quando questa è in esecuzione © A. Tedeschi 2016/2017 26
Struttura *.apk Un file apk (Android Package) contiene tutte le informazioni necessarie per permettere l’esecuzione dell’applicazione creata (sia su dispostivi che su emulatore) © A. Tedeschi 2016/2017 27
Activity • Una activity in Android rappresenta una singola schermata di una app con cui l’utente si interfaccia. • Un’app ha una o più activity, ma solo una activity per volta può essere visualizzata sullo schermo • Una activity attraverso gli intent può richiamare altre activity • Con Nugat 7.0 è possibile avere aperte contemporaneamente due Activity. Nelle versioni precedenti fatta eccezione di alcuni modelli come il Galaxy Note non era possibile © A. Tedeschi 2016/2017 28
Activity: lifecycle • Le activity sono inserite in uno stack, back stack gestisto tramie LIFO • Quando una Activity in running richiama una nuova Activity, viene messa in pausa e stoppata • Il cambio di activity può anche avvenire per mano dell’utente (apre una nuova app) o a causa di un evento esterno (es. telefonata in arrivo) • L’utente può ibernare o ripristinare un’activity ma non può chiuderla • Terminazione gestita dal sistema ed è trasparente al developer © A. Tedeschi 2016/2017 29
Activity: lifecycle Approfondimenti: link © A. Tedeschi 2016/2017 30
Activity: lifecycle Esempio di comportamento del back stack gestito secondo l’approccio Last In, First Out (LIFO) (link) • Quando un’activity corrente lancia una nuova activity, quella corrente viene messa in cima alla pila. • L’activity resta nella pila ed è stoppata • Quando una activity viene stoppata, il sistema mantiene in memoria lo stato corrente ad essa relativa • Cliccando sul tasto back, l’activity corrente viene tolta dalla pila (e distrutta dal sistema) ripristinando l’activity precedente • Iterando quest’ultima operazione si arriva fino all’activity di partenza dell’applicazione e se anche da qui viene cliccato il tasto back, si torna alla home deallocando del tutto l’app © A. Tedeschi 2016/2017 31
Activity: lifecycle • protected void onCreate(android.os.Bundle savedInstanceState) Richiamato alla creazione dell’attività. setContentView() per assegnare un layout all’interfaccia utente L’argomento savedInstanceState serve per riportare un eventuale stato dell’attività salvato in precedenza da un’altra istanza che è stata terminata. L’argomento è null nel caso in cui l’attività non abbia uno stato salvato. • protected void onStart() Segnala che l’attività sta per diventare visibile sullo schermo • protected void onResume() Segnala che l’attività sta per iniziare l’interazione con l’utente • protected void onPause() Segnala che l’attività non sta più interagendo con l’utente • protected void onStop() Segnala che l’attività non è più visibile sullo schermo • protected void onRestart() Segnala che l’attività sta per essere riavviata, causa precedente arrestato • protected void onDestroy() Segnala che l’applicazione sta per essere terminata 32 © A. Tedeschi 2016/2017
Activity: lifecycle Questi metodi: • Sono annotati con @Override • possono essere riscritti dallo sviluppatore per specificarne il comportamento. • Non necessariamente devono essere specificati tutti (fatta eccezione per OnCreate) • Hanno come prima riga di codice il richiamo del metodo di base che si sta sovrascrivendo Es: @Override protected void onResume() { super.onResume(); //proprio codice } © A. Tedeschi 2016/2017 33
DEMO Demo © A. Tedeschi 2016/2017 34
Intent • Servono a comunicare ad Android che un certo evento sta per avvenire. • Spesso vengono utilizzati per il lancio di una Activity • Descrivono l’azione che si desidera compiere e fornisce i dati che vengono impiegati per compiere tale azione. Possono essere: • Espliciti: creazione e definizione della classe da eseguire • Impliciti: viene specificata l’azione ma il destinatario non è noto. Fondamentale per la collaborazione tra app diverse. Es: l’apertura PDF può essere eseguita da diverse app. 35
Intent • Impliciti: viene specificata l’azione ma il destinatario non è noto. Fondamentale per la collaborazione tra app diverse Ricerca di tutte le app con il medesimo intent filter 36
Intent • Per passare da un’activity ad un’altra (modalità esplicità) Intent intent = new Intent(this, FooActivity.class); startActivity(intent); • Per far partire un’activity di cui non senza conoscere l’applicazione destinataria (modalità implicita). Fondamentale il filtro ACTION_SEND che deve essere presente e settato nell’applicazione destinataria. Intent intent = new Intent(Intent.ACTION_SEND); startActivity(intent); • Possibilità di creare AppChooser per permettere all’utente di scegliere con quale app aprire l’oggetto inviato attraverso l’intent 37
Intent • Ricezione di un intent implicito • Necessario dichiarare uno o più intent filters all’interno del manifest attraverso il tag • In ogni filtro si deve specificare • action: dichiara il tipo di intent accettato, da specificare nell’attributo «name» • data: dichiara il tipo di dato accettato, usando uno o più attributi che specificano i vari aspetti dell’URI (host, port, path, ecc) e il MIME type • category: dichiara la categoria dell’intent accettato da specifiare nell’attributo name. • Esempio di intent filter che permette di ricevere un intent con ACTION_SEND 38
Intent • Passaggio di dati tra due activity attraverso il metodo putExtra(..) di Intent intent.putExtra(name, value); startActivity(intent); • Estrazione dei dati dall’activity di destinazione Intent intent = getIntent(); intent.getStringExtra(name) 39
Intent Esempio di intent per inviare una mail Intent intent= new Intent(); String[] recipients = new String[]{"my@email.com"}; intent.setAction(Intent.ACTION_SEND); intent.putExtra(Intent.EXTRA_TEXT, "testo da mostrare"); intent.putExtra(Intent.EXTRA_EMAIL, recipients); intent.putExtra(Intent.EXTRA_SUBJECT, "Oggetto Email"); intent.setType("text/plain"); startActivity(intent); 40
Intent Esempio di intent per inviare aprire una pagine web del browser . String url = "http://www.uniroma3.it"; Intent i = new Intent(Intent.ACTION_VIEW); i.setData(Uri.parse(url)); startActivity(i); Alternativamente Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); startActivity(i); 41
Layout e grafica Componente fondamentale dell’interfaccia grafica è la classe android.view.View In generale un oggetto View • occupa una porzione rettangolare dello schermo • è responsabile della creazione della grafica e della gestione degli eventi della porzione di schermo assegnata • è la classe alla base dei widget (Button, check box, textview, ecc) Progettato il layout di una certa activity, ossia la View, è possibile mostrarla all’utente finale dell’applicazione attraverso il metodo della classe Activity public void setContentView(View view) © A. Tedeschi 2016/2017 42
Layout e grafica FrameLayout definito per bloccare in una certa area dello schermo un singolo oggetto. Non sempre utilizzato perché non permette un buon adattamento alle altre risoluzioni di schermo. Permette di aggiungere comunque dei nodi figli (widget o altro) la cui posizione deve essere gestita opportunamente attraverso le proprietà offerte da Android come android:layout_gravity TableLayout posiziona gli oggetti in righe e colonne, senza mostrare bordi. Una singola riga è rappresentata da un oggetto di tipo TableRow in cui inserire i widget © A. Tedeschi 2016/2017 43
Layout e grafica RelativeLayout consente ai figli di specificare la propria posizione relativamente alla View genitore o ad altri figli. Offre un’ottima gestione nel posizionamento dei suoi nodi attraverso opportune proprietà LinearLayout allinea tutti gli oggetti orizzontalmente o verticalmente a seconda del valore dell'attributo orientation. I figli sono posizionabili mediante la proprietà gravity. Definisce due proprietà fondamentali weightsum da utilizzare all’interno del LinearLayout e weight da usare su i figli. Tramite queste è possibile posizionare gli elementi del layout affinché occupino sempre la medesima posizione nelle schermate. © A. Tedeschi 2016/2017 44
Layout e grafica Esempio di definizione di un layout //QUI VANNO INSERITI GLI ELEMENTI CHE SI DESIDERA MOSTRARE ALL’UTENTE © A. Tedeschi 2016/2017 45
Layout e grafica Widget componenti di base per l’interazione con l’utente Ne esistono diversi e sono tutti disponibili al programmatore attraverso il package android.widget Estendono la classe View (android:nomepro=valore) che ne definiscono la posizione, la grandezza, © A. Tedeschi 2016/2017 46
Layout e grafica I widget e i layout permettono adottano delle unità di misura per stabilire lo spazio occupato o la grandezza del font Queste sono rappresentate dai seguenti acronimi • px = pixel, attuali sullo schermo • sp = scale-independent pixels • adottato per la dimensione del font • dip | dp = Density-independent pixels • si basa sulla desità fisica dello schermo • 1 px = 160dp, tale rapporto cambia in base alla densità dello schermo • È adottato per definire le grandezze delle immagini, del padding, del layout, ecc © A. Tedeschi 2016/2017 47
DEMO Demo © A. Tedeschi 2016/2017 48
Layout e grafica Problema A causa della molteplicità dei dispositivi mobili in circolazione (oltre i 2000 con caratteristiche hardware e software differenti tra loro) è necessario gestire opportunamente la grafica. Soluzione • Creare opportunamente il layout grafico principale adottando il RelativeLayout ove possibile e necessario • Supportare le diverse soluzioni di schermo, creando nuovi layout con layout- RISOLUZIONE. Es: layout-ldpi • Supportare le diverse versioni della piattaforma Android • Popolare opportunamente le cartelle drawable-RISOLUZIONE, che differiscono tra loro per la risoluzione dell’immagine Il sistema automaticamente in base alla caratteristiche del dispositivo selezionerà il layout e le immagini opportune per garantire la migliore esperienza utente. Approfondimenti http://developer.android.com/guide/practices/screens_support.html © A. Tedeschi 2016/2017 49
DEMO Demo 50
App Multilingua Per creare un’applicazione multilingua è necessario compiere i seguenti passi: • Definire opportunamente in lingua inglese il contenuto del file string.xml presente nella cartella values • Creare una o più cartelle values-LINGUA, dove LINGUA è l’abbreviazione della lingua che si desidera supportare es: Italiano = it; Spagnolo = es; ecc… • Copiare e incollare il file string.xml presente in values e incollarlo all’interno della cartella values-LINGUA che avete creato. • Aggiornate opportunamente il file con i valori corretti di lingua. Android automaticamente riconoscerà che l’applicazione supporta più lingue e pertanto selezionerà la lingua che corrisponde con quella del telefono. Se così non fosse Android utilizzerà la lingua di default, ossia l’inglese. NOTA: quanto descritto è valido solo per contenuti testuali statici © A. Tedeschi 2016/2017 51
Puoi anche leggere