Si votre application peut effectuer une action qui pourrait être utile à une autre, préparez-la à répondre aux requêtes d'action en spécifiant le filtre d'intent approprié dans votre activité.
Par exemple, si vous créez une application de réseau social qui peut partager des messages ou des photos avec les amis de l'utilisateur, prenez en charge l'intent ACTION_SEND
.
Ensuite, lorsque les utilisateurs lancent une action de partage à partir d'une autre application, celle-ci apparaît comme une option dans la boîte de dialogue du sélecteur (également appelée boîte de dialogue de sélection d'application), comme l'illustre la figure 1.
Pour permettre à d'autres applications de démarrer votre activité de cette manière, vous devez ajouter un élément <intent-filter>
à votre fichier manifeste pour l'élément <activity>
correspondant.
Lorsque votre application est installée sur un appareil, le système identifie vos filtres d'intent et ajoute les informations à un catalogue interne d'intents compatibles avec toutes les applications installées.
Lorsqu'une application appelle startActivity()
ou startActivityForResult()
avec un intent implicite, le système recherche les activités susceptibles de répondre à cet intent.
Ajouter un filtre d'intent
Pour définir correctement les intents que votre activité peut gérer, faites en sorte que chaque filtre d'intent que vous ajoutez soit aussi spécifique que possible en termes de type d'action et de données acceptées par l'activité.
Le système peut envoyer un élément Intent
spécifique à une activité si celle-ci comporte un filtre d'intent répondant aux critères suivants de l'objet Intent
:
- Action
- Chaîne indiquant l'action à effectuer. En général, l'une des valeurs définies par la plate-forme, comme
ACTION_SEND
ouACTION_VIEW
.Indiquez-le dans votre filtre d'intent avec l'élément
<action>
. La valeur que vous spécifiez dans cet élément doit correspondre au nom complet de la chaîne de l'action, et non à la constante de l'API, comme indiqué dans les exemples de cette page. - Données
- Description des données associées à l'intent.
Indiquez-le dans votre filtre d'intent avec l'élément
<data>
. À l'aide d'un ou plusieurs attributs dans cet élément, vous pouvez spécifier le type MIME, un préfixe d'URI, un schéma d'URI ou une combinaison de ces éléments et d'autres qui indiquent le type de données accepté.Remarque : Si vous ne devez pas déclarer de détails spécifiques sur les données
Uri
(par exemple, lorsque votre activité traite un autre type de données "supplémentaires" au lieu d'un URI), spécifiez uniquement l'attributandroid:mimeType
pour déclarer le type de données traité par votre activité, commetext/plain
ouimage/jpeg
. - Catégorie
- Fournit un moyen supplémentaire de définir l'activité qui gère l'intent, généralement liée au geste utilisateur ou au lieu d'où elle a commencé. Le système accepte plusieurs catégories, mais la plupart sont rarement utilisées. Toutefois, tous les intents implicites sont définis avec
CATEGORY_DEFAULT
par défaut.Indiquez-le dans votre filtre d'intent avec l'élément
<category>
.
Dans votre filtre d'intent, vous pouvez déclarer les critères acceptés par votre activité en déclarant chacun d'eux avec les éléments XML correspondants imbriqués dans l'élément <intent-filter>
.
Par exemple, voici une activité avec un filtre d'intent qui gère l'intent ACTION_SEND
lorsque le type de données est soit du texte, soit une image :
<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>
Conseil : Si vous souhaitez que l'icône de la boîte de dialogue du sélecteur soit différente de l'icône par défaut de votre activité, ajoutez android:icon
à <intent-filter>
.
Chaque intent entrant ne définit qu'une action et un type de données, mais vous pouvez déclarer plusieurs instances d'éléments <action>
, <category>
et <data>
dans chaque <intent-filter>
.
Si deux paires d'action et de données s'excluent mutuellement dans leurs comportements, créez des filtres d'intent distincts pour définir les actions acceptables lorsqu'elles sont associées aux types de données.
Supposons par exemple que votre activité gère à la fois le texte et les images pour les intents ACTION_SEND
et ACTION_SENDTO
. Dans ce cas, vous devez définir deux filtres d'intent distincts pour les deux actions, car un intent ACTION_SENDTO
doit utiliser les données Uri
pour préciser l'adresse du destinataire à l'aide du schéma d'URI send
ou sendto
. Ce processus est illustré dans l'exemple suivant :
<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>
Remarque : Pour recevoir des intents implicites, vous devez inclure la catégorie CATEGORY_DEFAULT
dans le filtre d'intent. Les méthodes startActivity()
et startActivityForResult()
traitent tous les intents comme s'ils avaient déclaré la catégorie CATEGORY_DEFAULT
. Si vous ne la déclarez pas dans votre filtre d'intent, aucun intent implicite n'atteindra votre activité.
Pour en savoir plus sur l'envoi et la réception d'intents ACTION_SEND
qui sont responsables des comportements de partage sur les réseaux sociaux, consultez la section Recevoir des données simples depuis d'autres applications.
Vous trouverez également des informations utiles sur le partage de données dans Partager des données simples et Partager des fichiers.
Gérer l'intent de votre activité
Pour choisir l'action à effectuer, consultez l'Intent
utilisé pour la démarrer.
Au début de votre activité, appelez getIntent()
pour récupérer l'élément Intent
qui a lancé l'activité. Vous pouvez le faire à tout moment au cours du cycle de vie de l'activité, mais il vaut généralement mieux le faire lors des premiers rappels, comme onCreate()
ou onStart()
.
Ce processus est illustré dans l'exemple suivant :
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 } }
Renvoyer un résultat
Si vous souhaitez renvoyer un résultat à l'activité qui a appelé la vôtre, appelez setResult()
pour préciser l'élément Intent
de code du résultat et de résultat. Lorsque l'opération est terminée et que l'utilisateur retourne dans l'activité d'origine, appelez finish()
pour fermer et détruire votre activité. Ce processus est illustré dans l'exemple suivant :
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();
Vous devez toujours indiquer un code de résultat avec le résultat. Il s'agit en général de RESULT_OK
ou de RESULT_CANCELED
. Fournissez ensuite si nécessaire des données supplémentaires avec un élément Intent
.
Remarque : Le résultat est défini par défaut sur RESULT_CANCELED
. Ainsi, si l'utilisateur appuie sur le bouton Retour avant d'effectuer l'action et avant que vous ne définissiez le résultat, l'activité d'origine reçoit le résultat "Annulé".
Si vous devez simplement renvoyer un nombre entier indiquant l'une des possibilités de résultat, vous pouvez définir le code de résultat sur une valeur supérieure à 0. Si vous utilisez le code de résultat pour fournir un nombre entier et que vous n'avez pas besoin d'inclure l'élément Intent
, vous pouvez appeler setResult()
et ne transmettre qu'un code de résultat :
Kotlin
setResult(RESULT_COLOR_RED) finish()
Java
setResult(RESULT_COLOR_RED); finish();
Dans ce cas, il peut n'y avoir que quelques résultats possibles. Le code de résultat est donc un nombre entier défini localement (supérieur à 0). Cela fonctionne bien lorsque vous renvoyez un résultat à une activité dans votre propre application, car l'activité qui reçoit le résultat peut mentionner la constante publique pour déterminer la valeur du code de résultat.
Remarque : Inutile de vérifier si votre activité a commencé par startActivity()
ou startActivityForResult()
. Il suffit d'appeler setResult()
si l'intent qui a démarré votre activité peut s'attendre à un résultat. Si l'activité d'origine avait appelé startActivityForResult()
, le système envoie le résultat que vous avez fourni à setResult()
; sinon le résultat est ignoré.