Se la tua app può eseguire un'azione che potrebbe essere utile a un'altra app, prepararlo a rispondere alle richieste di azioni specificando il filtro per intent appropriato nella tua attività.
Ad esempio, se
creare un'app social che possa condividere messaggi o foto con gli amici dell'utente,
supportano l'intent ACTION_SEND
.
Poi, quando gli utenti avviano una "condivisione" da un'altra app, la tua app viene visualizzata come opzione nella
finestra di dialogo del selettore (nota anche come finestra di dialogo di disambiguazione), come mostrato nella Figura 1.
Per consentire ad altre app di iniziare la tua attività in questo modo, devi aggiungere una <intent-filter>
nel file manifest per l'elemento <activity>
corrispondente.
Quando la tua app è installata su un dispositivo, il sistema identifica il tuo intent
filtra e aggiunge le informazioni a un catalogo interno di intent supportati da tutte le app installate.
Quando un'app chiama startActivity()
o startActivityForResult()
con un intento implicito, il sistema controlla le attività che possono rispondere alle
l'intento.
Aggiungi un filtro per intent
Per definire correttamente gli intent che la tua attività può gestire, imposta ogni filtro per intent che aggiungi il più specifico possibile in termini di tipo di azione e dati accetta.
Il sistema potrebbe inviare un determinato Intent
a un'attività se questa ha
un filtro per intent che soddisfi i seguenti criteri dell'oggetto Intent
:
- Azione
- Una stringa con il nome dell'azione da eseguire. Di solito uno dei valori definiti dalla piattaforma
come
ACTION_SEND
oACTION_VIEW
.Specificalo nel filtro per intent con l'elemento
<action>
. Il valore specificato in questo elemento deve essere il nome completo della stringa per l'azione, invece che costante dell'API, come mostrato negli esempi in questa pagina. - Dati
- Una descrizione dei dati associati all'intento.
Specificalo nel filtro per intent con l'elemento
<data>
. Utilizzarne uno o più attributi in questo elemento, puoi specificare il tipo MIME, un prefisso URI, uno schema URI o una combinazione di questi e altri che indicano il tipo di dati accettato.Nota:se non devi dichiarare le specifiche relative ai dati
Uri
, ad esempio quando la tua attività gestisce altro tipo di "extra" anziché un URI, specifica solo l'attributoandroid:mimeType
per dichiarare il tipo Dati gestiti dalla tua attività, ad esempiotext/plain
oimage/jpeg
. - Categoria
- Offre un ulteriore modo per caratterizzare l'attività che gestisce l'intento, di solito correlata
al gesto o alla posizione dell'utente da cui ha inizio. Esistono varie categorie
supportate dal sistema, ma la maggior parte viene utilizzata raramente. Tuttavia, tutti gli intent impliciti sono definiti
CATEGORY_DEFAULT
per impostazione predefinita.Specifica questa informazione nel filtro per intent con
<category>
.
Nel filtro per intent, puoi dichiarare i criteri accettati dalla tua attività
dichiarando ciascuno di essi con gli elementi XML corrispondenti nidificati nel file <intent-filter>
.
Ad esempio, ecco un'attività con un filtro per intent che gestisce l'intent ACTION_SEND
quando il tipo di dati è un testo o un'immagine:
<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"/> <data android:mimeType="image/*"/> </intent-filter> </activity>
Suggerimento:se vuoi che l'icona nella finestra di dialogo del selettore sia diversa.
dall'icona predefinita della tua attività, aggiungi android:icon
nel <intent-filter>
.
Ogni intent in entrata specifica solo un'azione e un tipo di dati, ma è accettabile dichiarare più azioni
istanze degli elementi <action>
, <category>
e <data>
in ogni
<intent-filter>
.
Se due coppie di azioni e dati si escludono a vicenda in i loro comportamenti, crea filtri per intent separati per specificare quali azioni sono accettabili se abbinati ai tipi di dati.
Ad esempio, supponi che la tua attività gestisca testo e immagini per entrambi gli intent ACTION_SEND
e ACTION_SENDTO
. In questo caso, devi definire due livelli
filtri per intent per le due azioni, perché un intent ACTION_SENDTO
deve utilizzare i dati Uri
per specificare
l'indirizzo del destinatario utilizzando lo schema URI send
o sendto
. Ciò è mostrato nell'esempio seguente:
<activity android:name="ShareActivity"> <!-- Filter for sending text; accepts SENDTO action with sms URI schemes --> <intent-filter> <action android:name="android.intent.action.SENDTO"/> <category android:name="android.intent.category.DEFAULT"/> <data android:scheme="sms" /> <data android:scheme="smsto" /> </intent-filter> <!-- Filter for sending text or images; accepts SEND action and text or image data --> <intent-filter> <action android:name="android.intent.action.SEND"/> <category android:name="android.intent.category.DEFAULT"/> <data android:mimeType="image/*"/> <data android:mimeType="text/plain"/> </intent-filter> </activity>
Nota: per ricevere intent impliciti, devi includere il parametro
Categoria CATEGORY_DEFAULT
nel filtro per intent. I metodi startActivity()
e startActivityForResult()
trattano tutti gli intent come se
ha dichiarato la categoria CATEGORY_DEFAULT
. Se non lo dichiari
nel filtro per intent, nessun intent implicito verrà risolto per la tua attività.
Per ulteriori informazioni sull'invio e la ricezione di ACTION_SEND
per intent che eseguono comportamenti di condivisione sui social, consulta Ricezione di dati semplici da altre app.
Puoi anche trovare informazioni utili sulla condivisione dei dati in:
Condividere dati semplici e
Condivisione di file.
Gestisci l'intenzione nell'attività
Per decidere quale azione intraprendere nell'attività, leggi le
Intent
utilizzato per avviarlo.
Quando l'attività inizia, chiama getIntent()
per recuperare
Intent
che ha iniziato l'attività. Puoi farlo in qualsiasi momento durante il
ciclo di vita dell'attività, ma in genere lo fai durante i primi callback, ad esempio
onCreate()
o onStart()
.
Ciò è mostrato nell'esempio seguente:
Kotlin
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.main) val data: Uri? = intent?.data // Figure out what to do based on the intent type if (intent?.type?.startsWith("image/") == true) { // Handle intents with image data } else if (intent?.type == "text/plain") { // Handle intents with text } }
Java
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // Get the intent that started this activity Intent intent = getIntent(); Uri data = intent.getData(); // Figure out what to do based on the intent type if (intent.getType().indexOf("image/") != -1) { // Handle intents with image data } else if (intent.getType().equals("text/plain")) { // Handle intents with text } }
Restituire un risultato
Se vuoi restituire un risultato all'attività che ha richiamato il tuo, chiama setResult()
per specificare il codice del risultato e il risultato Intent
. Al termine dell'operazione e quando l'utente torna alla versione originale
attività, chiama finish()
a
chiudere e distruggere la tua attività. Ciò è mostrato nell'esempio seguente:
Kotlin
// Create intent to deliver some kind of result data Intent("com.example.RESULT_ACTION", Uri.parse("content://result_uri")).also { result -> setResult(Activity.RESULT_OK, result) } finish()
Java
// Create intent to deliver some kind of result data Intent result = new Intent("com.example.RESULT_ACTION", Uri.parse("content://result_uri")); setResult(Activity.RESULT_OK, result); finish();
Devi sempre specificare un codice risultato con il risultato. Generalmente, è RESULT_OK
o RESULT_CANCELED
. Puoi quindi
fornire dati aggiuntivi con un Intent
, se necessario.
Nota: il risultato è impostato su
RESULT_CANCELED
per impostazione predefinita. Quindi, se l'utente tocca Indietro
prima di completare l'azione e di impostare il risultato, l'attività originale riceve
il file "annullato" o il risultato finale.
Se devi semplicemente restituire un numero intero che indica una delle varie opzioni di risultato, puoi impostare
il codice risultato in qualsiasi valore maggiore di 0. Se utilizzi il codice risultato per fornire un numero intero e
non è necessario includere Intent
,
puoi chiamare setResult()
e trasmetti solo un codice risultato:
Kotlin
setResult(RESULT_COLOR_RED) finish()
Java
setResult(RESULT_COLOR_RED); finish();
In questo caso, potrebbero esserci solo pochi risultati possibili, quindi il codice risultato è una intero definito (maggiore di 0). Funziona bene quando restituisci un risultato a un'attività nella tua app, perché l'attività che riceve il risultato può fare riferimento al pubblico costante per determinare il valore del codice del risultato.
Nota:non è necessario verificare se l'attività è stata avviata.
con startActivity()
o startActivityForResult()
. Chiama setResult()
se l'intent che ha avviato la tua attività
potrebbe aspettarsi un risultato. Se l'attività di origine chiamata startActivityForResult()
, il sistema la invia
il risultato che fornisci a setResult()
; altrimenti il risultato viene ignorato.