Consenti ad altre app di iniziare la tua attività

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.

Figura 1. La finestra di dialogo del selettore.

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 o ACTION_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'attributo android:mimeType per dichiarare il tipo Dati gestiti dalla tua attività, ad esempio text/plain o image/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.