Fondamenti di sviluppo mobile su Android Dott. A. Tedeschi antonio.tedeschi@uniroma3.it Corso di Telecomunicazioni Wireless a.a. 2015-2016 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 2013/2014 2
DEMO Demo 3
Android: La prima app Recap Creazione di un nuovo progetto Android Studio -> Start a new Android Studio project 4
Android: La prima app 5
Android: La prima app 6
Android: La prima app 7
Android: La prima app 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. 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 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 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
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 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 si vuole rappresentare Valore numerico univoco 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 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 15
Android Manifest How to Definire una activity in portrait <activity android:name="it.sp4te.mainactivity" android:screenorientation="portrait" /> Impostare una activity come principale <activity android:name="it.roma3.droidbike.splashactivity" android:screenorientation="portrait" > <intent-filter> <action android:name="android.intent.action.main" /> <category android:name="android.intent.category.launcher" /> </intent-filter> </activity> Aggiungere un permesso <uses-permission android:name="android.permission.internet" /> 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 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) 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 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 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 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 Unixlike 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 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 24
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) 25
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 26
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 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 Solo con alcuni tipi di device, come i Samsung Galaxy Note, è possibile tenere aperte contemporaneamente più activity sullo schermo Competitor: Microsoft Windows 8.1-10 offre la stessa opportunità. 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 29
Activity: lifecycle Approfondimenti: link 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 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
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 } 33
DEMO Demo 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 <intent-filter> 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 <activity android:name="shareactivity"> <intent-filter> <action android:name="android.intent.action.send"/> <category android:name="android.intent.category.default"/> <data android:mimetype="text/plain"/> </intent-filter> </activity> 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
DEMO Demo 42
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) 43
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 44
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. 45
Layout e grafica Esempio di definizione di un layout <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@android:color/black"> //QUI VANNO INSERITI GLI ELEMENTI CHE SI DESIDERA MOSTRARE ALL UTENTE </RelativeLayout> A. Tedeschi 2013/2014 46
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 Possono essere creati da codice Java o da file xml. Sono definiti da proprietà (android:nomepro=valore) che ne definiscono la posizione, la grandezza, il colore, ecc. La possibilità di accesso ad alcune proprietà dipende dal tipo di Layout scelto <ImageView android:id="@+id/androidsplash" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerhorizontal="true" android:layout_marginbottom="5dp" android:contentdescription="@string/empty" android:src="@drawable/android" /> <TextView android:id="@+id/splash" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerinparent="true" android:paddingleft="20dip" android:paddingright="20dip" android:text="@string/splashtext" android:textcolor="@android:color/white" android:textsize="25sp" /> A. Tedeschi 2013/2014 47
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 2013/2014 48
DEMO Demo A. Tedeschi 2013/2014 49
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 2013/2014 50
DEMO Demo 51
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 2013/2014 52