COUTION
Si vous n'avez pas d'application sur votre appareil qui peut utiliser Intent implicite, l'utilisation de startActivity () provoquera le blocage de l'application. Pour éviter un plantage, appelez la méthode resolutionActibity () (la méthode de l'objet Intent) pour vérifier l'existence de l'application qui peut recevoir l'intention. Si le résultat n'est pas nul, il existe une application qui peut recevoir Intent et vous pouvez appeler startActivity () en toute sécurité. Si le résultat est nul, l'intention provoquera un plantage, alors ne l'utilisez pas.
Intent et IntentFilter
https://developer.android.com/guide/components/intents-filters.html?hl=ja
L'intention facilite la communication entre les composants. Les trois exemples suivants sont des exemples d'utilisation de base.
Exemple d'utilisation d'intention
- Démarrer l'activité </ strong>
Pour démarrer une nouvelle instance d'activité (créer un nouvel écran), transmettez Intent to startActivity () </ font> .. L'activité à démarrer est décrite dans l'intention et les données nécessaires sont définies. Utilisez startActivityForResult () </ font> pour recevoir le résultat lorsque l'activité est terminée. L'activité reçoit le résultat en tant qu'objet Intent en utilisant le rappel onActivityResult () </ font>.
- Service start </ strong>
Le service est un composant pour les opérations en arrière-plan sans interface utilisateur. Avec Android5.0 (API21) ou version ultérieure, vous pouvez démarrer le service avec JobScheduler </ font>. Dans Android5.0 ou version antérieure, démarrez le service avec la méthode de la classe Service. Pour les opérations ponctuelles telles que le téléchargement de fichiers, transmettez Intent à startService (). Configurez le service et les données pour démarrer dans Intent. Si l'interface client-serveur est définie pour le service, l'intention peut être transmise à bindService () </ font> et liée au service d'autres composants.
- Diffusion de la diffusion </ strong>
La diffusion est un message qui peut être reçu par n'importe quelle application. Le système diffuse des émissions sur divers événements du système tels que le démarrage du terminal et le début de la charge. Pour diffuser vers d'autres applications, transmettez l'intention à sendBroadcast () </ font> ou sendOrderedBroadcast () </ font>.
Type d'intention | Intention explicite Intention implicite
- Explicit Intent </ strong>
Spécifiez le nom du package de l'application cible ou le nom complet de la classe de décoration du composant et spécifiez l'application qui exécute l'intention. Dans de nombreux cas, le développeur utilise une intention explicite car il connaît le nom de classe de l'activité ou du service qu'il souhaite démarrer.
- Intention implicite </ strong>
Ne nommez pas de composant spécifique. En définissant le traitement et les données nécessaires dans l'intention, il peut être exécuté par un composant d'une autre application. Par exemple, si vous souhaitez afficher un certain lieu sur la carte à l'utilisateur, demandez à l'aide de l'intention d'afficher le lieu spécifié par une autre application sur la carte.
Utilisez une intention implicite lorsque vous confiez le composant qui gère l'activité au système Android, et une intention explicite lorsque le composant est spécifique (non confié au système).
\ <Fonctionnement de l'intention: Image> </ strong>
1. Activity (A) crée un Intent qui décrit l'action et le transmet à startActivity () (startActivity (intent))
2. Le système Android recherche toutes les applications et trouve les filtres d'intention qui correspondent à l'intention
3. Si un filtre d'intention correspondant est trouvé, le système appelle la méthode onCreate () de l'application et transmet l'intent
4. L'application recherchée démarre une activité (B) qui correspond à l'intention.
|
Avec l'intention implicite, le système Android compare le contenu de l'intention avec le filtre d'intention défini dans le fichier manifeste d'autres applications </ font>. Lorsque l'intention correspond au filtre Intent, le système Android démarre son composant et délivre l'objet Intent. S'il existe plusieurs applications correspondantes, laissez l'utilisateur les sélectionner dans la boîte de dialogue. Le filtre d'intention spécifie le type d'intention que le composant souhaite recevoir dans le fichier manifeste de l'application.
Par exemple, vous pouvez déclarer un filtre d'intention d'activité pour démarrer une activité directement à partir d'une autre application à l'aide d'un type particulier d'intention. Si vous ne déclarez pas de filtre d'intention pour l'activité, vous ne pouvez démarrer l'activité qu'avec une intention explicite.
COUTION
Utilisez une intention explicite lorsque vous démarrez avec Service. N'utilisez pas le filtre d'intention du service. L'intention implicite dans un service présente un risque de sécurité car elle perd la trace du fait que le service répond à l'intention et que l'utilisateur n'est pas au courant du service lancé. Dans Android 5.0 et versions ultérieures, l'utilisation de bindService () avec une intention implicite provoque le déclenchement d'une exception par le système.
Construire l'intention
Dans l'objet Intent, définissez les informations requises pour rechercher le composant démarré par le système Android et les informations requises pour que le composant exécute l'action (ci-dessous).
- Nom du composant
- Action
- Données
- Catégorie
- Extra
- Drapeau
Intent intent = new Intent(this,MainActivity.class);
intent.setComponent() // setClass(),setClassName(),Intent Constructor
intent.setAction() // Intent Constructor
intent.setData() // setType setDataAndType
intent.CATEFORY_BROWSABLE // CATEGORY_LAUNCHER
intent.putExtar()
intent.setFlags()
// Android Developer intent :des constructeurs publics(Context packageContext, Class<?> cls)référence
//Composant spécifié(Class<?>)Créer une intention dans
//Le contexte est AndroidSystem<-> app :Passer les informations sur l'environnement
■ Nom du composant (objet ComponentName)
- Nom du composant de départ </ strong>
Requis pour les intentions explicites. En outre, lors du démarrage du service, utilisez une intention explicite pour garantir la sécurité.
--L'objet ComponentName peut être spécifié en utilisant le nom de classe entièrement décoré du composant cible (par exemple com.example.ExampleActivity). Spécifiez avec la méthode suivante, etc.
- setComponent()
- setClass()
- setClassName()
- Constructeur d'intention
■ Action
Une chaîne qui spécifie l'action générale (affichage ou sélection) effectuée.
-
Pour l'intention de diffusion, cette chaîne est une action qui s'est déjà produite et qui a été signalée. Les informations qui constituent d'autres intentions, telles que les informations contenues dans les données et les extras, sont déterminées par le type d'action (affichage ou sélection).
-
Dans votre application, l'action à démarrer est spécifiée par Intent, ou elle est spécifiée par Intent pour appeler le composant de votre application à partir d'autres applications, mais Normalement Intent Spécifiez les constantes d'action définies dans la classe ou dans d'autres classes du framework </ font>.
-
<Constantes d'action générales pour démarrer une activité> </ strong>
-
ACTION_VIEW </ font> </ strong> Lorsqu'il existe des informations que l'activité affiche à l'utilisateur, telles que la photo affichée dans l'application ou l'adresse affichée dans l'application de carte. En outre, utilisez la constante ACTION_VIEW </ font> pour l'intention et transmettez-la à startActivity ().
-
ACTION_SEND </ font> </ strong> ACTION_SEND est intention partagée </ font>. Si des données peuvent être partagées avec une autre application, telle qu'une application de messagerie ou une application de partage social, utilisez la constante ACTION_SEND </ font> pour Intent et transmettez-la à startActivity ().
Les constantes qui définissent d'autres actions sont> https://developer.android.com/reference/android/content/Intent.html?hl=ja (voir Contenu)
D'autres actions sont définies ailleurs dans le framework Android. Par exemple, l'action pour ouvrir un écran spécifique de l'application des paramètres système est définie dans Paramètres.
Les actions d'intention sont spécifiées à l'aide de setAction () ou du constructeur d'intention </ font>.
Ci-dessous, après avoir défini votre propre action (TIMETRAVEL), spécifiez le nom du package de l'application comme préfixe (ACTION_TIMETRAVEL = " com.example.action.TIMETRAVEL " ).
static final String ACTION_TIMETRAVEL = "com.example.action.TIMETRAVEL";
■ Données
Un URI (objet Uri) qui fait référence aux données requises pour exécuter une action et au type MINE des données. Le type de données spécifié dépend de l'action de l'intention. Si l'action est ACTION_EDIT </ font>, les données seront définies sur l'URI du document à modifier.
Lors de la création d'une intention, il peut être important de spécifier le type de données (MIME) </ font> ainsi que l'URI. La musique ne peut pas être lue dans l'activité d'affichage d'image. Spécifiez le type MIME des données pour permettre au système Android de rechercher les composants appropriés pour l'intention.
Cependant, il peut être possible d'estimer MIME à partir de l'URI. Lorsque les données sont du contenu, l'URI se trouve sur le terminal et est contrôlé par ContentProvider, de sorte que le système Android peut déterminer le type MIME à partir de l'URI.
<Paramètre de type de données / MIME>
--Définir uniquement l'URI des données: setData () </ font>
- Définir le type MIME uniquement: setType () </ font>
- Définissez les deux: utilisez setDataAndType ().
COUTION Lors de la définition du type URI et MIME, n'utilisez pas setData () et setType () (désactivez les valeurs de l'autre) Il y a un risque). Lorsque vous définissez les deux, veillez à utiliser setDataAndType ()
■ Catégorie
Chaîne qui définit des informations supplémentaires sur le type de composant qui gère l'intention. La plupart des intentions ne nécessitent pas de catégories. Vous pouvez définir autant de descriptions de catégories que vous le souhaitez dans Intention. Voici quelques exemples de catégories couramment utilisées.
- CATEFORY_BROWSABLE
En fonction de l'activité cible, le navigateur affiche des données telles que des images et des e-mails.
- CATEGORY_LAUNCHER
Dans l'activité initiale de la tâche, affichez l'activité dans la liste des lanceurs d'application du système.
■ Extra
Par nom de composant, action, données ou catégorie, le système Android recherche le composant d'application approprié. Des informations supplémentaires qui n'affectent pas cette recherche peuvent être trouvées dans les Extras d'intention </ font>.
Définissez les informations requises pour exécuter l'action de demande avec une paire clé / valeur. Les actions utilisent certains types d'URI de données ou utilisent certains extras.
Les données supplémentaires sont la méthode putExtra () </ font>, qui ajoute des paramètres de clé et de valeur. Bundle </ font> peut définir toutes les données supplémentaires, et putExtras () peut être utilisé pour définir Bundle sur Intent </ font>.
Par exemple, lors de la création d'une intention d'envoyer un e-mail à l'aide de ACTION_SEND </ font>, utilisez la clé EXTRA_EMAIL </ font> au destinataire Ou vous pouvez spécifier le sujet à l'aide de la touche EXTRA_SUBJECT </ font>.
La classe Intent peut spécifier plusieurs constantes EXTRA_ * </ strong> pour les types de données standardisés. Si vous souhaitez déclarer votre propre clé supplémentaire pour l'intention que votre application reçoit, spécifiez le nom du package de l'application comme préfixe (ci-dessous).
static final String EXTRA_GIGAWATTS = "com.example.EXTRA_FIFAWATTS";
COUTION:
N'utilisez pas Parcelable ou Serializable lors de l'envoi d'intentions reçues par d'autres applications. Si l'application tente d'accéder aux données de l'objet Bundle et ne peut pas accéder aux classes de parcellisation ou de sérialisation, le système lève une RuntimeException.
■ Drapeau
Défini dans la classe d'intention d'indicateur. L'indicateur fonctionne comme des métadonnées d'intention (informations indiquant les données elles-mêmes (nom, date, extension, etc.) telles que les fichiers et les dossiers). L'indicateur spécifie au système Android comment démarrer l'activité (à quelle tâche l'activité appartient, etc.) et comment la gérer après le démarrage (s'il faut l'inclure dans la liste des activités récentes, etc.).
□ setFlags
--Définissez la gestion de l'intention avec l'indicateur. Les paramètres dépendent du type de composant exécuté par Intent. L'indicateur ** FLAG_ACTIVITY_ * ** est utilisé dans ** ConText # startActivity **, et l'indicateur ** FLAG_RECEIVER_ * ** est utilisé dans ** Context # sendBroadcast (Intent) **. (Par exemple, si vous définissez FLAG_ACTIVITY_NO_HISTORY, les nouvelles activités ne seront pas enregistrées dans l'historique de la pile)
--setFlags () Pour plus d'informations> https://developer.android.com/reference/android/content/Intent.html?hl=ja#setFlags (int)
Intention explicite, exemple d'intention implicite
Exemple d'intention explicite
Utilisez une intention explicite lors du lancement de composants d'application spéciaux. Pour créer une intention explicite, définissez le nom du composant dans l'objet Intent. Les autres propriétés Intent sont facultatives.
<Exemple: Démarrez Download Service pour télécharger des fichiers à partir du Web>
//Supposons que vous souhaitiez participer à une activité.'this'Est le contexte.
//fileUrl est l'URL de la chaîne.("http:://www.example.com/image.png ")
Intent downloadIntent = new Intent(this,DownloadService.class);
downloadIntent.setData(Uri.parse(fileUrl));
startService(downloadIntent);
Le constructeur Intent (Context, Class) fournit le contexte à l'application et l'objet Class au composant. De cette manière, cette intention lance explicitement la classe DownloadService vers l'application.
Exemple d'intention implicite
L'intention implicite lance une application sur un appareil qui peut spécifier une action et l'exécuter. L'intention implicite est un bon choix si vous ne souhaitez pas effectuer cette action dans votre propre application, mais que vous pouvez le faire dans une autre application et que vous souhaitez que l'utilisateur choisisse d'utiliser ou non cette application.
Par exemple, si vous avez du contenu que vous souhaitez que les utilisateurs partagent avec d’autres, utilisez l’action ACTION_SEND </ font> pour créer une intention et ajoutez un élément supplémentaire pour spécifier le contenu à partager. Faire. L'utilisation de cette intention pour appeler startActivity () </ font> permet à l'utilisateur de choisir avec quelle application partager le contenu.
COUTION:
Il se peut qu'aucune application ne puisse gérer l'intention implicite envoyée à startActivity (), ou elle peut être inaccessible en raison de restrictions de fichiers ou de paramètres. Dans ce cas, l'application plantera. Pour éviter un plantage, certaines activités utilisent resolActivity () sur l'objet Intent et utilisent Intent si le résultat n'est pas nul. Si null, désactivez le processus d'émission d'intention pour éviter un blocage. Le code ci-dessous est un exemple. Dans cet exemple, le contenu supplémentaire est spécifié en déclarant le type de données Intent sans utiliser l'URI.
python
//Générer un message texte avec une chaîne
Intent sendIntent = new Intent();
sendIntent.setAction(Intent.ACTION_SEND);
sendIntent.putExtra(Intent.EXTRA_TEXT,textMessage);
sendIntent.setType("text/plain");
//Vérifiez s'il y a une activité qui utilise l'intention
if(sendIntent.resolbeActivity(getPackageManager()) !=null){
startActivity(sendIntent);
}
Lorsque startActivity () est appelée, le système examine toutes les applications installées et détermine quelles applications peuvent gérer ce type d'intention. L'intention doit avoir l'action ACTION_SEND </ font> et l'ensemble de données "text / plain". S'il existe plusieurs activités de ce type, laissez l'utilisateur sélectionner l'activité à démarrer dans la boîte de dialogue (boîte de dialogue Tuser).
Affichage du sélecteur d'applications
Lorsque plusieurs applications répondent à une intention implicite, l'utilisateur sélectionne l'application et en fait le choix d'action par défaut. La définition des choix par défaut est utile si l'utilisateur sélectionne la même application à chaque fois.
Cependant, s'il existe plusieurs applications qui répondent à l'intention et que l'utilisateur peut utiliser une application différente à chaque fois, affichez explicitement la boîte de dialogue de sélection (l'application par défaut pour l'action ne peut pas être sélectionnée).
Lorsqu'une application effectue un "partage" avec une action ACTION_SEND </ font>, l'utilisateur peut souhaiter partager à l'aide d'une autre application, selon la situation du moment. Utilisez toujours une boîte de dialogue de sélection comme celle ci-dessous.
Code d'affichage Tuser
Créez une intention à l'aide de createChooser () </ font> et transmettez-la à startActivity () </ font>. Le code suivant affichera dans une boîte de dialogue une liste d'applications qui répondent à l'intention transmise à la méthode createChooser () </ font>. Utilisez le texte spécifié pour le titre de la boîte de dialogue.
python
Intent sendIntent = new Intent(Intent.ACTION_SEND);
...
// "Utilisez cette application ●●"Avec ce sentiment
//Utiliser des ressources de chaîne pour le texte de l'interface utilisateur
String title = getResources().getString(R.string.chooser_title);
//Générer une intention qui affiche la boîte de dialogue de sélection
Intent chooser = Intent.createChooser(sendIntent,title);
//L'intention implicite nécessite la présence d'une action de réponse
//Vérifiez s'il y a une action pour répondre
if(sendIntent.sesolveActivity(getPackageManager())!=null){
startActivity(chooser);
}
Recevoir une intention implicite
Pour annoncer l'intention implicite que votre application peut recevoir, utilisez l'élément </ font> dans le fichier manifeste pour filtrer un ou plusieurs filtres d'intention pour chaque composant d'application. Déclarer. Chaque filtre d'intention spécifie le type d'intention qu'il accepte, en fonction des actions, des données et des catégories de l'intent. Le système délivre une intention implicite à ses composants d'application uniquement si l'intention passe l'un des filtres d'intention.
L'intention explicite est toujours fournie au composant cible, quel que soit le filtre d'intention déclaré par le composant.
|
Le composant d'application déclare un filtre individuellement pour chaque tâche unique à exécuter. Par exemple, si une activité de l'application de galerie d'images a deux filtres, l'un pour afficher l'image et l'autre pour la modifier, lorsque vous démarrez cette activité, elle reviendra aux informations de l'intention et affichera ou modifiera l'image. Décidez quelle action choisir.
Chaque filtre d'intention est défini dans l'élément </ font> du fichier manifeste de l'application et correspond au composant de l'application ( < Nest dans les éléments d'activité> </ font>, etc.). Dans </ font>, utilisez un ou plusieurs des trois éléments suivants et spécifiez le type d'intention à accepter.
|
|
| |
|