Android Intent, AlertDialog, SharedPreferences
Intents
Un intent è un oggetto che viene utilizzato in Android per richiedere l’esecuzione di una particolare azione da parte del componente dell’applicazione (o anche di un’app differente). Possono gestire vari tipi di interazioni fra Activity differenti, ma principalmente vengono utilizzati per avviare un’activity, un servizio o per lanciare un broadcast (messaggio che qualsiasi app può ricevere). Esistono due tipi di intent: Intent espliciti: specificano il componente da avviare indicandone specificamente il nome (nome completo della classe che lo rappresenta). L’utilizzo principale di questo tipo di intent è per avviare un’activity o un servizio relativi all’app corrente. Intent impliciti: non indicano un componente, ma un’azione generale che deve essere eseguita, delegandone la gestione ad un componente che dichiara di essere in grado di svolgere tale compito (anche di un’altra app). INTENTS 3
Il seguente esempio mostra come inviare un intent esplicito per invocare una specifica activity: INTENTS ESPLICITI Intent intent = new Intent(CurrentActivity.this, OtherActivity.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. Dopodichè è sufficiente invocare il metodo startActivity, passando l’Intent appena creato.
E’ possibile definire delle proprie azioni custom, per definire una propria Activity che possa essere lancita anche dall’esterno della nostra applicazione. Per farlo è sufficiente associarle, all’interno del Manifest, un intent-filter che definisca la nostra custom Action, nel seguente modo: INTENTS IMPLICITI CUSTOM 5 Per poter lanciare in modo esplicito l’Intent corrispondente all’azione appena definita, è sufficiente utilizzare il seguente codice:
Il seguente frammento di XML mostra un activity che dichiara di essere in grado di inviare informazioni testuali. Oltre al tipo di azione (SEND), è necessario specificare inoltre il mimeType delle informazioni che il componente può gestire (in questo caso dati testuali). INTENTS IMPLICITI: SEND 6 Il seguente frammento di codice Java invece, mostra come richiedere l’esecuzione della medesima azione. Anche in questo caso si specifica il mimeType ed è, ovviamente, necessario aggiungere come extra la stringa da inviare Intent sendIntent = new Intent(); sendIntent.setAction(Intent.ACTION_SEND); sendIntent.putExtra(Intent.EXTRA_TEXT, textMessage); sendIntent.setType(HTTP.PLAIN_TEXT_TYPE); //Si verifica l’esistenza di un activity in grado di assolvere il compito if (sendIntent.resolveActivity(getPackageManager()) != null) { startActivity(sendIntent); }
L’azione VIEW viene utilizzata per specificare informazioni che devono essere mostrate all’utente. Tale action richiede come input le informazioni da visualizzare, passate sotto forma di URI. Il componente che dichiara di gestire tali azioni, deve riportare, nel proprio intent-filter, un tag data in cui specifica, nell’attributo scheme, i tipi di URI che supporta. I frammenti che seguono mostrano, da un lato un intent-filter che consente di dichiarare un componente in grado di gestire la visualizzazione di URI aventi come schema http, e dall’altro l’invocazione di un componente in grado di gestire le stesse informazioni. INTENTS IMPLICITI: VIEW 7 Intent viewIntent = new Intent(); sendIntent.setAction(Intent.ACTION_VIEW); intent.setData(Uri.parse(" startActivity(viewIntent);
PASSAGGIO DI INFORMAZIONI TRAMITE INTENT 8 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’intent, il metodo putExtra(..), i cui overload ci consentono di inviare dati di vario tipo (String, int, Serializable,..) Per far si che sia l’activity a restituirci informazioni è necessario utilizzare, anzichè startActivity(..), il metodo startActivityForResult(..). I risultati possono essere invece recuperati nell’apposita funzione di callback OnActivityResult. Intent intent=new Intent(this, MainActivity.class); intent.putExtra(EXTRA_NOME, "Marco"); startActivityForResult(intent, REQUEST_CODE); protected void onActivityResult(int requestCode, int resultCode, Intent data) { … } Il parametro requestCode consente di associare la richiesta alla corrispondente risposta.
L’activity che viene lanciata deve ovviamente essere in grado di recuperare le informazioni associate al relativo Intent. Per poterlo fare è necessario innanzitutto recuperare l’intent attraverso il metodo getIntent(). Dopodichè è necessario invocare 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 nell’esempio relativo all’azione FORM, in cui l’informazione è stata passata come extra, il codice per recuperare il testo da inviare sarà il seguente: PASSAGGIO DI INFORMAZIONI TRAMITE INTENT 9 Intent intent = getIntent(); if( intent != null) String text = intent.getStringExtra(EXTRA_NOME); L’activity che viene lanciata attraverso la funzione startActivityForResult(..), deve essere inoltre in grado di restituire le informazioni richieste. Per farlo viene utilizzato, anche in questo caso, un’Intent, che sarà passato come parametro alla funzione setResult(..).
SharedPreferences
Le SharedPreferences sono un meccanismo, fornito dal sistema Android, che ci permette di salvare dei singoli oggetti in maniera rapida e persistente. Abbiamo la possibilità di salvare oggetti di tutti i tipi base (String, int, boolean,...) più qualsiasi oggetto che implementi le interfacce Serializable o Parcelable. Per salvare informazioni in una preference, è necessario recuperare un oggetto di tipo SharedPreferences (tramite un apposito metodo della classe Context). Dopodichè, dato che il salvataggio di informazioni nelle preferences è gestito con logica transazionale, è necessario invocare il metodo edit() per aprire una nuova informazione, utilizzare il metodo putString (se vogliamo salvare una stringa) per salvare l’oggetto ed infine concludere la transazione attraverso la funzione apply(). SHARED PREFERENCES : SALVATAGGIO 11
l recupero di informazioni è molto più immediato, dato che è sufficiente recuperare l’oggetto SharedPreferences associato all’applicazione corrente ed infine richiamare il metodo per il recupero del tipo di dato desiderato. SHARED PREFERENCES: LETTURA 12
AlertDialog
Le AlertDialog vengono utilizzate per mostrare informazioni importanti all’utente o per richiedere conferma prima dell’esecuzione di un’operazione critica o comunque definitiva (come la cancellazione di alcune informazioni). Il codice che segue mostra un esempio di creazione di una dialog. ALERT DIALOG 14
Alert Dialog