Android Intent, ListView e Adapter Corso di programmazione di sistemi mobile 1
Intent Uno degli argomenti di maggior interesse nell architettura di Android, è sicuramente costituito dalla possibilità delle activity di richiamarsi tra loro e di riutilizzare activity per eseguire azioni che possono essere comuni a più applicativi. Un intent, come il nome stesso suggerisce è un intenzione, una sorta di richiesta da parte di un applicazione di poter accedere ad una risorsa. Quando un applicazione ha la necessità di eseguire una particolare operazione non farà altro che creare un Intent richiedendo l utilizzo di una qualche risorsa, o componente, in grado di poterlo esaudire. Un qualsiasi intent necessiterà quindi delle informazioni relative all operazione che si intende eseguire e dovrà essere a conoscenza del tipo di dati su cui essa opera. A volte l intent sarà esplicito e quindi si conoscerà a priori chi sarà in grado di risolverlo. In questo caso dovremo specificare noi la classe da eseguire. In altri casi invece non sappiamo chi risolverà l intent, il nostro compito sarà quello di specificare l azione da eseguire pur non conoscendo il destinatario. Corso di programmazione di sistemi mobile 2
Intent Espliciti Vengono detti Intent Espliciti quelli in cui il componente chiamato è conosciuto in fase di creazione dell Intent. Intent intent = new Intent(CurrentActivity.this, SecondActivity.class); startactivity(intent); Per farlo è necessario creare un oggetto di tipo Intent, passando come parametri al costruttore il riferimento al Context attuale e la classe dell Activity che vogliamo lanciare. Successivamente è sufficiente invocare il metodo startactivity, passando l Intent appena creato. Di base le varie Activity si alternano all interno dello stesso stack, è comunque possibile decidere come organizzarle a livello di task e di processo. Questo è possibile impostando diversi flag dell Intent o configurazioni dell Activity per poter configurare ogni aspetto del task in cui l attività sarà eseguita Corso di programmazione di sistemi mobile 3
FLAG_ACTIVITY_NEW_TASK FLAG_ACTIVITY_SINGLE_TOP FLAG_ACTIVITY_NO_HISTORY FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS FLAG_ACTIVITY_BROUGHT_TO_FRONT FLAG_ACTIVITY_FROM_BACKGROUND FLAG_ACTIVITY_MULTIPLE_TASK FLAG_ACTIVITY_RESET_TASK_IF_NEEDED FLAG_ACTIVITY_CLEAR_TOP lancia o ripristina l Activity all interno del task con lo stesso valore di affinità se l Activity richiesta è già in cima allo stack non ne viene creata una nuova istanza l Activity avviata non viene inserita nello stack delle attività elimina l Activity corrente dall elenco delle attività recentemente avviate permette di notificare all attività che è stata portata in foreground in quanto già esistente permette di notificare ad un Activity che non è stata avviata da un azione dell utente ma ad esempio da un servizio utilizzato insieme a NEW_TASK, premette di avviare un attività all interno di un proprio task permette la cancellazione della storia di un task, impostando l Activity come root dello stesso elimina tutte le Activity nello stack, inclusa quella che ha avviato l intent Corso di programmazione di sistemi mobile 4
è possibile configurare le activity anche attraverso l attributo android:launchmode attraverso l elemento <activity> nel file AndroidManifest.xml multiple 0 valore di default, corrisponde alla creazione di una nuova istanza ad ogni lancio singletop 1 permette di non avviare più istanze della stessa activity, equivalente al flag Intent.FLAG_ACTIVITY_SINGLE_TOP singletask 2 per lanciare una nuova attività all interno di un nuovo task, se il task esiste già, verrà portato in foreground singleinstance 3 permette di creare solo un istanza dell Activity la quale è associata ad uno e un solo task Ogni volta che un attività viene chiamata da un intent diverso da quello che l ha invocata in precedenza viene richiamato il metodo: public void onnewintent(intent intent) Corso di programmazione di sistemi mobile 5
Manifest Se si esegue il metodo startactivity passando un intent esplicito è necessario che l acitivity sia dichiarata all interno del manifest, altrimenti l applicazione lancia un eccezione. Per dichiarare un activity nel manifest basta semplicemente creare un nuovo tag xml all interno di application e alla proprietà name dichiarare la classe che estende Activity. <application <activity android:name=".mainactivity"> <intent-filter> <action android:name="android.intent.action.main" /> <category android:name="android.intent.category.launcher" /> </intent-filter> </activity> <activity android:name=".secondaactivity"/> </application> Corso di programmazione di sistemi mobile 6
Intent Impliciti Sono definiti intent impliciti quelli in cui il componente non è indicato in fase di creazione dell oggetto ma al suo posto viene descritta l azione che deve essere eseguita, delegandone la gestione ad un activity che dichiara di essere in grado di svolgere tale compito. Esempio richiesta di apertura di una pagina web: Intent intent = new Intent(Intent.ACTION_VIEW); intent.setdata(uri.parse("http://developer.android.com/"); startactivity(intent); Esempio richiesta di condivisione del testo: Intent intent = new Intent(Intent.ACTION_SEND); intent.putextra(intent.extra_text, "Prova condivisione testo!"); intent.settype("text/plain"); startactivity(intent); Esempio custom: Intent intent = new Intent(MY_ACTION); intent.putextra(my_value, 123); startactivity(intent); Corso di programmazione di sistemi mobile 7
Intent-Filter L intent filter è il tag xml che si occupa di dichiarare quali azioni e categorie e dati l activity può svolgere. <activity android:name=".mainactivity"> <intent-filter> <action android:name="android.intent.action.main" /> <category android:name="android.intent.category.launcher" /> </intent-filter> </activity> <activity android:name=".shareinimageactivity"> <intent-filter> <action android:name="android.intent.action.send" /> <category android:name="android.intent.category.default" /> <data android:mimetype="image/*" /> </intent-filter> </activity> Corso di programmazione di sistemi mobile 8
ACTION: descrive il tipo di azione, può assumere valori di sistema oppure azioni specifiche per la nostra applicazione. Alcune azioni del sistema android sono: ACTION_ANSWER ACTION_CALL ACTION_DELETE ACTION_DIAL ACTION_EDIT ACTION_INSERT ACTION_PICK ACTION_SEARCH ACTION_SENDTO ACTION_SEND ACTION_VIEW ACTION_WEB_SEARCH Per rispondere a una chiamata telefonica Per iniziare una chiamata corrispondente al numero descritto dall'uri Per eliminare il dato specificato nell'uri Per effettuare una chiamata al numero specificato nell'uri Per editate il dato specificato nell'uri Per inserire un elemento specificato nell'uri Per scegliere un elemento Per effettuare una ricerca Per l invio del messaggio specificato nell Uri Per l invio dei dati specificati nell Uri Per visualizzare i dati specificati nell Uri Per effettuare una ricerca sul web con i dati passati Corso di programmazione di sistemi mobile 9
CATEGORY: elemento opzionale indica le circostanze in cui l azione può essere utilizzata. Si possono dichiarare più category per la stessa action. ALTERNATIVE SELECTED_ALTERNATIVE BROWSABLE DEFAULT GADGET HOME LAUNCHER Le azioni alternative all'azione standard sull'oggetto Simile alla categoria ALTERNATIVE ma verrà risolta in una singola selezione Specifica azioni disponibili dal Browser Azione di default su un componente e per poter usare gli intent espliciti Si specifica un'attività che può essere inclusa in un'altra attività Specificando questa categoria e non specificando l'azione, si propone un'alternativa allo schermo home nativo Specifica un'attività che può essere eseguita dal launcher del sistema Android Corso di programmazione di sistemi mobile 10
DATA: permette di specificare che tipi di dati il cui componente può gestire. La sintassi è <scheme>://<host>:<port>/<path> android:scheme android:host android:port android:path android:mimetype Lo schema (esempio: content or http) Nome dell host valido (es. google.com) Eventuale porta dell'host Eventuale un path dell'uri (es. /transport/boats/) Tipo di dato che il componente è in grado di gestire Corso di programmazione di sistemi mobile 11
Passaggio di dati tramite Intent In alcuni casi può essere necessario passare informazioni all activity che stiamo avviando, mentre in altre situazioni può essere richiesto che sia l activity invocata a restituirci dei risultati. Per passare informazioni all activity è sufficiente invocare, sull oggetto intent, il metodo putextra(..) i cui overload ci consentono di inviare dati di vario tipo (String, int, Serializable...) L activity che viene lanciata può recuperare le informazioni associate al relativo intent attraverso il metodo getintent(). È necessario invocare poi il metodo appropriato a seconda del tipo di informazioni che si vogliono recuperare e di come queste sono state passate all intent. Per esempio, per recuperare le informazioni passate come stringa: Intent intent = getintent(); String text = intent.getstringextra(extra_nome); Corso di programmazione di sistemi mobile 12
Per far si che sia l activity a restituirci informazioni è necessario utilizzare il metodo startactivityforresult(intent intent, int requestcode) anziché startactivity(intent intent). L activity che viene lanciata deve restituire le informazioni richieste attraverso la creazione di un nuovo oggetto intent il quale sarà passato alla funzione setresult(..)prima della chiamata del metodo finish(). //si crea un nuovo intent inizialmente vuoto per restituire il risultato Intent resultintent = new Intent(); //si aggiunge all'intent, in forma di extra, le info da restituire resultintent.putextra(form_key_name, "prova"); //imposto l'intent dichiarando che la richiesta è andata a buon fine setresult(result_ok, resultintent); finish(); I risultati possono essere recuperati nell apposita funzione di callback onactivityresult(int requestcode, int resultcode, Intent data). Il parametro requestcode consente di associare la richiesta alla corrispondente risposta. Corso di programmazione di sistemi mobile 13
Liste/Griglie/Spinner Nelle applicazioni mobile capita spesso di dover mostrare degli elementi all interno di una lista. La lista può essere visualizzata in sequenza (ListView), in griglia (GridView), a selezione (Spinner). Tali elementi vengono mostrati con la stessa UI cambiando il contenuto al suo interno. Ad un evento di click su un elemento si vuole visualizzare il dettaglio dell elemento selezionato. In Android l entità che ha il compito di gestire e visualizzare gli elementi è l ADAPTER. Esistono diverse implementazioni dell interfaccia adapter come: BaseAdapter che implementa diversi metodi ma lascia definire allo sviluppatore la View da visualizzare ArrayAdapter che implementa i metodi per gestire e manipolare (add, remove ) le liste. Corso di programmazione di sistemi mobile 14
Adapter Fornisce l accesso ai dati ed è responsabile per la realizzazione delle View. I metodi principali da definire sono: public abstract Obejct getitem(int position); //restituisce l oggetto in posizione position; public abstract getcount(); // restituisce il numero di elementi che fanno parte dell adapter; public abstract long getitemid(int position); // l id associato all elemento in posizione position; public abstract View getview(int position, View convertview, ViewGroup parent) //instanzia la view da visualizzare nella posizione indicata, convertview è il riferimento a una precedente View non più visibile e parent è il riferimento all'oggetto ViewGroup che contiene le singole View dei record; Corso di programmazione di sistemi mobile 15
ListView Per rappresentare elenchi di dati in un applicazione si usano le ListView, con la possibilità di effettuare scrolling e di visualizzare i dati in riga uno sotto l altro. <ListView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/listview" /> Si può successivamente specificare a quale fonte di dati farà riferimento la lista, e il layout di ogni singola riga. ListView listview=(listview)findviewbyid(r.id.listview); String[] values= new String[]{"primo","secondo","terzo", "quarto"}; ArrayAdapter<String> arrayadapter = new ArrayAdapter<String> (this, R.layout.row, R.id.textViewList, values); listview.setadapter(arrayadapter); Corso di programmazione di sistemi mobile 16
Spinner Lo Spinner è il classico menu a tendina. Si possono definire le voci tramite un array di stringhe nei values della cartella res oppure come per le listview utilizzando un adapter <Spinner android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/spinner" android:entries="@array/persona"/> <string-array name="persona"> <item>maschio</item> <item>femmina</item> </string-array> Corso di programmazione di sistemi mobile 17