Android Intent e intent-filter diegozabot@yahoo.it
Intent
Cos è un Intent Un intent è una richiesta da parte di un componente di una funzionalità che viene implementata in un altro componente. Viene utilizzato per fare interagire le applicazioni tra di loro, sia quelle programmate che quelle già presenti nel sistema. Esempi: richiesta di una activity esterna per fare una fotografia richiesta di una activity esterna per effettuare una chiamata Gli Intent sono oggetti di tipo android.content.intent. Un intent utilizza un oggetto di classe Bundle per ricevere eventualmente dei dati.
Tipologie di Intent Possiamo utilizzare due tipologie di Intent: intent espliciti indichiamo esplicitamente la componente che vogliamo richiamare utilizzando la classe java Intent i = new Intent(context, class) intent impliciti indichiamo l azione che vogliamo eseguire e lasciamo che il sistema proponga come risolvere l azione Intent i= new Intent(action, Uri) *Uri: Uniform Resource Identifier. Stringa che identifica univocamente una risorsa (sito web, immagine, file, ecc.)
Intent espliciti Per far partire una activity si utilizza il metodo startactivity(intent) definito nella classe Context, da cui Activity estende. Per far partire la activity chiamata Activity2 usiamo la seguente sintassi: Intent i = new Intent(this, Activity2.class); startactivity(i);
Intent impliciti (1) Esempio 1: facciamo caricare una pagina web. Dobbiamo specificare l action (Intent.ACTION_VIEW) e l Uri (l indirizzo internet). Intent i = new Intent( Intent.ACTION_VIEW, Uri.parse( http://google.it ) ); startactivity(i); In questo modo non chiamiamo una specifica classe ma definiamo l intenzione vedere una pagine web, lasciando al dispositivo soddisfare la nostra intenzione. Ricordarsi di impostare nel manifest il parametro uses-permission di tipo android. permission.internet
Intent impliciti (2) Esempio 2: facciamo partire una chiamata dalla nostra applicazione. Dobbiamo specificare l action (Intent.ACTION_CALL) e l Uri (il numero di telefono). Intent i = new Intent( Intent.ACTION_CALL, Uri.parse( tel:(+39)123456 ) ); startactivity(i); Ricordarsi di impostare nel manifest il parametro uses-permission di tipo android. permission.call_phone
Intent impliciti (1) Di seguito alcuni tipi di intent impliciti: Visualizzare una pagina web Action: Intent.ACTION_VIEW Es. Uri: Uri.parse( http://www.yahoo.it ) Permission: android.permission.internet Visualizzare una mappa georeferenziata Action: Intent.ACTION_VIEW Es. Uri: Uri.parse("geo:45.6577793, 13.8289025?z=15") Permission: android.permission.internet Visualizzare un video di youtube Action: Intent.ACTION_VIEW Es. Uri: Uri.parse("vnd.youtube:sONcojECWXs") Permission: android.permission.internet
Intent impliciti (2) Effettuare una chiamata Action: Intent.ACTION_CALL Es. Uri: Uri.parse( tel:(+39)123456 ) Permission: android.permission.call_phone Comporre un numero Action: Intent.ACTION_DIAL Es. Uri: Uri.parse( tel:(+39)123456 ) Permission: / Scattare una foto Action: android.media.action.image_capture Es. Uri: / Permission: android.permission.camera *per approfondire gli intent vedere gli esempi al seguente link: http://www.intertech.com/blog/android-intents-for-app-integration-call-a-calculator-play-video-open-an-editor/
Passaggio di dati
Passare dei dati Mediante l intent possiamo anche passare dei dati extra mediante i.putextra(chiave, valore) dove chiave è una stringa e valore può essere un tipo primitivo o oggett di tipo Stringa, Bundle, Serializable. Per recuperare le informazioni, nell activity chiamata, si utilizza ad esempio il seguente modo per recuperare una stringa: String s = getintent( ).getextras( ).getstring(chiave); O più genericamente: Bundle extras = getintent( ).getextras( ); if(extras!=null){ String s=extras.getstring(chiave) }
Restituire dei dati (1) A volte abbiamo bisogno che l activity chiamata torni un risultato. In questo caso dobbiamo eseguire le seguenti operazioni: 1. Facciamo partire la nuova activity con startactivityforresult 2. Quando l activity richiamata termina, impostiamo i valori da ritornare (solitamente nel metodo finish) 3. Impostiamo il metodo di callback onactivityresult per recuperare il risultato ritornato (nella activity chiamante).
Restituire dei dati (2) 1. Facciamo partire la nuova activity con startactivityforresult startactivityforresult(intent i, int requestcode); requestcode è un codice che assegnamo all intent per verificare al ritorno dalla activity chiamata da che intent stiamo ritornando. Solitamente si utilizza una costante. Es. private final static int INTENT_CODE=1;... Intent i = new Intent(this, Activity2.class"); startactivityforresult(i, INTENT_CODE);
Restituire dei dati (3) 2. Quando l activity richiamata termina, impostiamo i valori da ritornare. Utilizziamo un intent per impostare i valori da ritornare alla activity chiamante ed eseguiamo il metodo setresult passando una costante indicante la buona riuscita e l intent creato. Es. public void finish( ){ Intent i = new Intent( ); String nome = editnome.gettext( ).tostring( ); i.putextra( Nome, nome); setresult(result_ok, i); super.finish( ); }
Restituire dei dati (4) 3. Impostiamo il metodo di callback onactivityresult* per recuperare il risultato ritornato (nella activity chiamante). Tale metodo riceve due interi, requestcode che indica da quale activity stiamo ricevendo dati, resultcode che indica la riuscita dell intent e un intent (data) contentente i valori passati. protected void onactivityresult( int requestcode, int resultcode, Intent data) { if (requestcode == INTENT_CODE && resultcode == RESULT_OK) { String nome = data.getextras().getstring("nome"); text1.settext(nome); } } *per semplicità in Eclipse richiamiamo il metodo mediante il menu Source -> override/implement methods
Esempio: Utilizzo della camera
Utilizzo della camera (1) Richiamiamo l activity di default che gestisce la camera. Tale activity non vuole nessun parametro aggiuntivo, quindi nell intent avremo solo l action: private final static int CAMERA_CODE = 1;... public void onclick(view v) { Intent i = new Intent("android.media.action.IMAGE_CAPTURE"); startactivityforresult(i, CAMERA_CODE); }
Utilizzo della camera (2) Dobbiamo essere a conoscenza che l activity che scatta la fotografia ci ritorna un intent con l immagine salvata con l etichetta data. Quindi la prendiamo e la castiamo in Bitmap e la utilizziamo: protected void onactivityresult( int requestcode, int resultcode, Intent data) { if (requestcode == CAMERA_CODE && resultcode == RESULT_OK) { Bitmap foto = (Bitmap) data.getextras().get("data"); imagefoto.setimagebitmap(foto); } }
Intent filter
Intent filter (1) Un intent-filter è una dichiarazione di comportamento che possiamo assegnare alla nostra applicazione direttamente nel manifest. <activity... > <intent-filter> <action android:name="android.intent.action.main" /> <category android:name="android.intent.category.launcher" /> </intent-filter> </activity> Queste dichiarazioni indicano che l activity viene eseguita come punto di partenza della app e che compaia l icona di esecuzione nell elenco dei programmi disponibili nel dispositivo.
Intent filter (2) Se vogliamo che la nostra activity possa ricevere una chiamata implicita come, ad esempio, visualizzare un Url, dovremo specificarlo nell intent filter: <intent-filter > <action android:name="android.intent.action.view" /> <category android:name="android.intent.category.default" /> <data android:scheme="http" /> </intent-filter> Questo intent-filter indica che la nostra activity risponderà ad intent impliciti di tipo action.view. Dichiariamo anche lo schema dei dati da ricevere.