Qu'est-ce qu'un Android PendingIntent?

538

Je suis un débutant sur Android. J'ai lu la documentation Android mais j'ai encore besoin de précisions. Quelqu'un peut-il me dire ce qu'est exactement un PendingIntent?

Rakesh
la source

Réponses:

892

A PendingIntentest un jeton que vous donnez à une application étrangère (par exemple NotificationManager, l' AlarmManagerécran d'accueil AppWidgetManagerou d'autres applications tierces), qui permet à l'application étrangère d'utiliser les autorisations de votre application pour exécuter un morceau de code prédéfini .

Si vous donnez une intention à l'application étrangère, elle exécutera votre Intentavec ses propres autorisations. Mais si vous donnez à l'application étrangère un PendingIntent, cette application exécutera votre Intentutilisation de l'autorisation de votre application.

Lie Ryan
la source
3
sauf pour les notifications, où d'autre avez-vous vu l'utilisation de pendingIntents? Je pense que je n'ai vu que les notifications l'utiliser ...
développeur Android
4
@Johnny_D: cela signifie ce qu'il dit, en général, vous souhaitez créer une intention explicite dont le nom du composant est un nom absolu qui fait référence sans ambiguïté à l'une de vos propres classes. Sinon, l'intention peut être envoyée à une autre application, ce qui peut entraîner des problèmes car cette intention s'exécutera sous la permission de votre application.
Lie Ryan
3
@LieRyan, l'autorisation d'application est-elle celle que nous spécifions dans le manifeste? Par exemple. Autorisation INTERNET?
Diffy
2
Ce «transfert d'autorisations» n'est-il pas vraiment mauvais pour la sécurité? J'ai une application A à laquelle j'ai accordé plusieurs autorisations. Ensuite, j'ai l'application B qui utilise beaucoup moins d'autorisations. Si l'application A peut démarrer quelque chose dans l'application B via un PendingIntent (permettant à toutes les autorisations de A d'être temporairement sur B), B ne peut-il pas faire tout ce qu'il peut en arrière-plan avec cette autorisation? Par exemple, A peut être autorisé à lire les contacts de l'utilisateur, mais pas B. Si A envoie un PendingIntent à B, B peut alors lire les contacts et faire quelque chose de malveillant (comme l'envoyer à un serveur).
Tiago
6
@Tiago: Dans votre cas, si une application privilégiée A donne à l'application B une intention en attente afin que B puisse l'envoyer lorsqu'elle souhaite lire les données d'un contact. Il est de la responsabilité de A de demander à l'utilisateur quelles données de contact il souhaite donner à B, et de ne donner à B que ces données. Pending Intent est un mécanisme d'élévation de privilèges et, comme tout mécanisme d'élévation de privilèges, une grande puissance s'accompagne d'une grande responsabilité. Il incombe à l'utilisateur de décider si l'application B est fiable pour les données de contact que l'utilisateur a sélectionnées.
Lie Ryan
48

Une attente intention est un jeton que vous donnez à une application pour effectuer une action au nom de vos applications indépendamment du fait que votre processus de demande est en vie ou non.

Je pense que la documentation est suffisamment détaillée: documents en attente d'intention .

Pensez simplement à des cas d'utilisation pour les intentions en attente comme (intentions de diffusion, planification d'alarmes) et la documentation deviendra plus claire et significative.

Samuh
la source
Je pense que Intent est également une sorte de jeton que nous donnons à une autre application pour effectuer une action au nom de notre application. Ainsi, la seule différence entre une intention en attente et une intention est la durée de vie de notre processus de demande?
CopsOnRoad
40

Dans mon cas, aucune des réponses ci-dessus ni la documentation officielle de Google ne m'ont aidé à saisir le concept de PendingIntentclasse.

Et puis j'ai trouvé cette vidéo, Google I / O 2013, Beyond the Blue Dot session . Dans cette vidéo, l'ex-googleur Jaikumar Ganesh explique ce que PendingIntentc'est, et c'est ce qui m'a donné une vue d'ensemble de cela.

Ci-dessous est juste la transcription de la vidéo ci-dessus (à partir de 15:24 ).

Alors, quelle est une intention en attente?

C'est un jeton que votre processus d'application donnera au processus de localisation, et le processus de localisation l'utilisera pour réveiller votre application lorsqu'un événement d'intérêt se produit . Cela signifie donc que votre application en arrière-plan ne doit pas toujours être en cours d'exécution. Lorsque quelque chose d'intéressant se produit, nous vous réveillerons. Cela économise beaucoup de batterie.

Cette explication devient plus claire avec cet extrait de code (qui est inclus dans la diapositive de la session).

PendingIntent mIntent = PendingIntent.getService(...);

mLocationClient.requestLocationUpdates(locationRequest, mIntent);

public void onHandleIntent(Intent intent) {   
    String action = intent.getAction();   
    if (ACTION_LOCATION.equals(action)) {       
        Location location = intent.getParcelableExtra(...)   
    }
}
김준호
la source
D'accord, c'est assez simple et clair à comprendre. Mais cela ne nous dit rien sur l'autorisation que PendingIntent donne à une autre application.
CopsOnRoad
35

Pourquoi PendingIntent est requis? Je pensais comme

  1. Pourquoi l'application réceptrice elle-même ne peut pas créer le Intentou
  2. Pourquoi nous ne pouvons pas utiliser un simple Intentdans le même but.

Par exempleIntent bluetoothIntent= new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);

Si j'envoie bluetoothIntentà une autre application, qui n'a pas l'autorisation android.permission.BLUETOOTH_ADMIN, cette application de réception ne peut pas activer Bluetooth avec startActivity(bluetoothIntent).

La limitation est surmontée en utilisant PendingIntent. Avec PendingIntentl'application de réception, il n'est pas nécessaire d'avoir android.permission.BLUETOOTH_ADMINactivé Bluetooth. Source .

Kiran
la source
3
Votre exemple bluetoothIntent est vraiment précieux. Merci
Nicks
1
@Kiran - Si la réception de l'application peut activer Bluetooth (en utilisant l'intention en attente), alors pourquoi cette application n'a pas inclus cette autorisation dans son manifeste? C'est comme si je fais une application qui peut passer un appel, mais je n'inclus pas l'autorisation CALL_PHONE parce que je veux qu'une autre application m'envoie une intention en attente pour passer cet appel. C'est ça que tu veux dire?
CopsOnRoad
1
@CopsOnRoad L'application réceptrice du PendingIntent peut être une application générale qui reçoit n'importe quelle demande et exécute la demande au nom du demandeur. Son rôle est juste un intermédiaire, il n'a donc pas toutes les autorisations. Un exemple de ce type d'applications intermédiaires est le gestionnaire de notifications, qui peut lancer toutes les applications prévues à partir d'une notification, sans posséder l'autorisation.
Xiao-Feng Li
21

L'intention en attente est une intention qui commencera à un moment donné dans le futur. L'intention normale commence immédiatement lorsqu'elle est transmise à startActivity(Intent)ou StartService(Intent).

Arun P
la source
13

Une intention future que d'autres applications peuvent utiliser.
Et voici un exemple pour en créer un:

Intent intent = new Intent(context, MainActivity.class);
PendingIntent pendIntent = PendingIntent.getActivity(context, 0, intent, 0);
Breed Oded
la source
8
Votez parce que vous n'expliquez pas vraiment ce qui est spécial dans une intention qui est "future" ou utilisable par d'autres applications
Vic
@ WhereDatApp.com il a été dit par Antoine de Saint Exupéry et traduit par Lewis Galantière;)
Choletski
@Choletski merci, je ne connaissais pas la traduction 👍
Oded Breiner
13

ANALOGIE TAXI

Intention

Les intentions sont généralement utilisées pour démarrer les services. Par exemple:

Intent intent = new Intent(CurrentClass.this, ServiceClass.class);
startService(intent);

C'est comme lorsque vous appelez un taxi:

Myself = CurrentClass
Taxi Driver = ServiceClass

Intention en attente

Vous devrez utiliser quelque chose comme ceci:

Intent intent = new Intent(CurrentClass.this, ServiceClass.class);
PendingIntent pi = PendingIntent.getService(parameter, parameter, intent, parameter);
getDataFromThirdParty(parameter, parameter, pi, parameter);

Maintenant, ce tiers démarrera le service en votre nom. Une analogie réelle est Uber ou Lyft qui sont tous deux des compagnies de taxi.

Vous envoyez une demande de trajet à Uber / Lyft. Ils iront ensuite de l'avant et appelleront l'un de leurs chauffeurs en votre nom.

Donc:

Uber/Lyft ------ ThirdParty which receives PendingIntent
Myself --------- Class calling PendingIntent
Taxi Driver ---- ServiceClass
ARCHE
la source
11

Un PendingIntent est un jeton que vous donnez à une autre application (par exemple, Notification Manager, Alarm Manager ou d'autres applications tierces), qui permet à cette autre application d'utiliser les autorisations de votre application pour exécuter un morceau de code prédéfini. Pour effectuer une diffusion via une intention en attente, obtenez donc un PendingIntent via PendingIntent.getBroadcast (). Pour effectuer une activité via une intention en attente, vous recevez l'activité via PendingIntent.getActivity ().

srinu
la source
7

Qu'est-ce qu'une intention?

Une intention est une commande spécifique dans Android qui vous permet d'envoyer une commande au système d'exploitation Android pour faire quelque chose de spécifique. Considérez-le comme une action qui doit avoir lieu. Il existe de nombreuses actions qui peuvent être effectuées telles que l'envoi d'un e-mail, ou joindre une photo à un e-mail ou même lancer une application. Le flux de travail logique de la création d'une intention est généralement le suivant: a. Créer l'intention b. Ajouter des options d'intention -> Ex. quel type d'intention nous envoyons au système d'exploitation ou tout attribut associé à cette intention, comme une chaîne de texte ou quelque chose transmis avec l'intention c. RUN the Intent

Exemple concret: disons que je me réveille le matin et que je «compte» aller aux toilettes. Je devrai d'abord penser à aller aux toilettes, mais cela ne me fait pas vraiment aller aux toilettes. Je devrai alors dire à mon cerveau de sortir du lit en premier, puis marcher jusqu'aux toilettes, puis relâcher, puis aller me laver les mains, puis aller m'essuyer les mains. Une fois que je sais où je vais, j'ENVOIE la commande pour commencer et mon corps passe à l'action.

Qu'est-ce que les intentions en attente?

En reprenant l'exemple de la vie réelle, disons que je veux prendre une douche mais je veux prendre une douche APRÈS avoir brossé mes dents et pris le petit déjeuner. Je sais donc que je ne prendrai pas de douche avant au moins 30 à 40 minutes. J'ai encore dans ma tête que je dois préparer mes vêtements, puis remonter les escaliers jusqu'à la salle de bain, puis me déshabiller puis prendre une douche. Cependant, cela ne se produira que 30 à 40 minutes se seront écoulées. J'ai maintenant l'intention de prendre une douche. Il est EN ATTENTE pendant 30 à 40 minutes.

C'est à peu près la différence entre une intention en attente et une intention régulière. Les intentions régulières peuvent être créées sans intention en attente, mais pour créer une intention en attente, vous devez d'abord avoir une configuration d'intention régulière.

Narendra Motwani
la source
J'ai vraiment aimé le simple et l'exemple, je l'ai assez bien compris avec ces mots.
Josema
Je suis heureux que ce message vous soit utile Josema
Narendra Motwani
c'est exactement la même chose que l'explication de Shakeeb Ayaz ci-dessus. qui a copié de qui? :)
likejudo
5

PendingIntentest fondamentalement un objet qui enveloppe un autre Intentobjet. Ensuite, il peut être transmis à une application étrangère où vous accordez à cette application le droit d'exécuter l'opération, c'est-à-dire d'exécuter l'intention comme si elle avait été exécutée à partir du processus de votre propre application (mêmes autorisations et identité). Pour des raisons de sécurité, vous devez toujours transmettre des intentions explicites à un PendingIntent plutôt que d'être implicite.

 PendingIntent aPendingIntent = PendingIntent.getService(Context, 0, aIntent,
                    PendingIntent.FLAG_CANCEL_CURRENT);
Gowtham Subramaniam
la source
4

Dans un langage simple,
1. Une description d'une action d'intention et de cible à effectuer. Vous devez d'abord créer une intention, puis vous devez passer une classe Java spécifique que vous souhaitez exécuter, à l'intention.
2. Vous pouvez appeler la classe java qui est votre classe d'action de classe par PendingIntent.getActivity, PendingIntent.getActivities (Context, int, Intent [], int), PendingIntent.getBroadcast (Context, int, Intent, int) et PendingIntent. getService (Context, int, Intent, int); Ici, vous voyez que l'intention qui vient de l'étape 1
3. Vous devez garder à l'esprit que ... En donnant un PendingIntent à une autre application, vous lui accordez le droit d'effectuer l'opération que vous avez spécifiée.

C'est ce que j'ai appris après une longue lecture.

Omar Faroque Anik
la source
3

Un PendingIntent enveloppe l'intention générale avec un jeton que vous donnez à une application étrangère à exécuter avec votre permission. Par exemple:

La notification de votre application musicale ne peut pas lire / mettre en pause la musique si vous n'avez pas donné la PendingIntentdiffusion d'envoi, car votre application musicale est READ_EXTERNAL_STORAGEautorisée, contrairement à l'application de notification. La notification est un service système (c'est donc une application étrangère).

Ashish Rawat
la source
bon exemple!
likejudo
2

Comme son nom l'indique .. PendingIntent

vous pouvez le suspendre (le faire après un certain temps). Cela fonctionne comme l'autre intention .. c'est un moyen de confier votre tâche à une autre application à effectuer en votre nom.

Zar E Ahmer
la source
1
Pouvez-vous donner un exemple concret pour cela?
CopsOnRoad
0

Une intention en attente spécifie une action à entreprendre à l'avenir. Il vous permet de passer une intention future à une autre application et de permettre à cette application d'exécuter cette intention comme si elle avait les mêmes autorisations que votre application, que votre application soit toujours présente lorsque l'intention est finalement invoquée.

C'est un jeton que vous donnez à une application étrangère qui permet à l'application étrangère d'utiliser les autorisations de votre application pour exécuter un morceau de code prédéfini.

Si vous donnez une intention à l'application étrangère et que cette application envoie / diffuse l'intention que vous avez donnée, ils exécuteront l'intention avec leurs propres autorisations. Mais si vous donnez plutôt à l'application étrangère une intention en attente que vous avez créée à l'aide de votre propre autorisation, cette application exécutera l'intention contenue à l'aide de l'autorisation de votre application.

Pour effectuer une diffusion via une intention en attente, obtenez donc un PendingIntent via PendingIntent.getBroadcast (). Pour effectuer une activité via une intention en attente, vous recevez l'activité via PendingIntent.getActivity ().

Il s'agit d'une action d'intention que vous souhaitez effectuer, mais ultérieurement. Pensez-y à mettre une intention sur la glace. La raison pour laquelle elle est nécessaire est qu'une intention doit être créée et lancée à partir d'un contexte valide dans votre application, mais il existe certains cas où l'un n'est pas disponible au moment où vous souhaitez exécuter l'action car vous êtes techniquement en dehors du contexte de l'application (le deux exemples courants sont le lancement d'une activité à partir d'une notification ou d'un BroadcastReceiver.

En créant un PendingIntent que vous souhaitez utiliser pour lancer, disons, une activité pendant que vous avez le contexte pour le faire (à l'intérieur d'une autre activité ou service), vous pouvez passer cet objet à quelque chose d'extérieur pour qu'il lance une partie de votre application. en votre nom.

Un PendingIntent permet aux applications de fonctionner, même après la fin de leur processus. Il est important de noter que même après la suppression de l'application qui a créé le PendingIntent, Intent peut toujours s'exécuter. Une description d'une intention et d'une action cible à exécuter avec elle. Les instances de cette classe sont créées avec getActivity (Context, int, Intent, int), getBroadcast (Context, int, Intent, int), getService (Context, int, Intent, int); l'objet retourné peut être remis à d'autres applications afin qu'elles puissent effectuer l'action que vous avez décrite en votre nom ultérieurement.

En donnant un PendingIntent à une autre application, vous lui accordez le droit d'effectuer l'opération que vous avez spécifiée comme si l'autre application était vous-même (avec les mêmes autorisations et identité). En tant que tel, vous devez faire attention à la façon dont vous construisez le PendingIntent: souvent, par exemple, l'intention de base que vous fournissez aura le nom du composant explicitement défini sur l'un de vos propres composants, pour vous assurer qu'il est finalement envoyé là-bas et nulle part ailleurs.

Un PendingIntent lui-même est simplement une référence à un jeton maintenu par le système décrivant les données d'origine utilisées pour le récupérer. Cela signifie que, même si le processus de sa propre application est tué, le PendingIntent lui-même restera utilisable à partir des autres processus qui lui ont été attribués. Si l'application de création récupère ultérieurement le même type de PendingIntent (même opération, même action d'intention, données, catégories et composants, et mêmes indicateurs), elle recevra un PendingIntent représentant le même jeton si celui-ci est toujours valide et peut appelez donc cancel () pour le supprimer.

vikseln
la source
0

L'intention en attente est une intention qui fournit toutes les autorisations à une autre application pour effectuer des travaux particuliers. Lorsque l'activité principale est détruite, Android OS en reprend l'autorisation.

Neimer
la source