web-dev-qa-db-fra.com

Qu'est-ce qu'un Android PendingIntent?

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

496
Rakesh

A PendingIntent est un jeton que vous attribuez à une application étrangère (par exemple NotificationManager, AlarmManager, Écran d’accueil AppWidgetManager ou à 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 Intent avec ses propres autorisations. Mais si vous attribuez PendingIntent à l'application étrangère, cette application exécutera votre Intent avec l'autorisation de votre application.

844
Lie Ryan

INTENTION

Les intentions sont le mécanisme de messagerie standard dans Android qui exprime l'intention de l'utilisateur d'effectuer certains travaux. Ils vous permettent d'interagir avec d'autres composants définis par vous ou par le système d'exploitation Android.

Exemple:

  1. Diffuser un message
  2. Démarrer la caméra
  3. Démarrer un service
  4. Lancer une activité
  5. Afficher une page Web ou une liste de contacts
  6. Composer un numéro de téléphone ou répondre à un appel téléphonique

    Ils sont utilisés dans les deux sens

1) par vous pour appeler un composant

2) par le système pour vous informer d'un événement.

Le processus logique de création d'une intention est généralement le suivant:

  • Créer l'intention
  • b. Ajouter les options d'intention-> Ex. quel type d'intention que nous envoyons au système d'exploitation ou aux attributs associés à cette intention, tels qu'une chaîne de texte ou quelque chose qui est transmis avec l'intention
  • c. Exécuter l'intention

Exemple concret: Imaginons que je me lève le matin et que je "INTENTION" se rende aux toilettes. Je vais d'abord devoir penser d'aller aux toilettes, mais ça ne m'emmène pas vraiment aux toilettes. Je devrai ensuite dire à mon cerveau de sortir du lit en premier, puis de me rendre aux toilettes, puis de le relâcher, puis de me laver les mains, puis de m'essuyer les mains. Une fois que je sais où je vais, j'envoie la commande pour commencer et mon corps prend des mesures.

EN ATTENTE

A PendingIntent spécifie une action à entreprendre dans le futur. Il vous permet de transmettre une intention future à une autre application et de permettre à cette application d'exécuter cette intention comme si elle possédait le same permissions as your application, que votre application soit toujours là ou non lorsque l'intention est finalement appelée. C’est un jeton que vous donnez à une application étrangère qui permet à l’application étrangère d’utiliser les autorisations de celle-ci pour exécuter un morceau de code prédéfini.

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 la vôtre (avec les mêmes autorisations et identité). En tant que tel, vous devez faire attention à la façon dont vous construisezPendingIntent: 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, afin de: s'assurer qu'il est finalement envoyé là-bas et nulle part ailleurs.

C'est une action d'intention que vous souhaitez effectuer, mais ultérieurement. Pensez-y à mettre une Intention sur la glace. Cela est nécessaire parce qu’une intention doit être créée et lancée à partir d’un Context valide dans votre application. Toutefois, dans certains cas, il n’est pas disponible au moment où vous souhaitez exécuter l’action, car vous êtes techniquement en dehors du système. contexte de l'application (les deux exemples courants lancent une activité à partir d'une notification ou d'une BroadcastReceiver. En créant une PendingIntent que vous souhaitez utiliser pour lancer, par exemple, une activité alors que vous avez la Context pour le faire (depuis une autre activité ou service)

Reprenons l’exemple concret: disons que je veux prendre une douche mais que je veux me doucher APRÈS me brosser les dents et prendre mon petit déjeuner. Je sais donc que je ne me doucherai pas avant au moins 30 à 40 minutes. J'ai toujours dans la tête le besoin de préparer mes vêtements, puis de monter les escaliers pour retourner à la salle de bain, puis de me déshabiller et de prendre une douche. Cependant, cela n'arrivera pas avant 30 à 40 minutes. Maintenant, j'ai une intention PENDING 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. En bref:

Intention régulière -> DOES NOT REQUIRE PENDING INTENT TO BE MADE

Intention en attente -> REQUIRES A REGULAR INTENT TO BE CREATED

Les intentions sont de deux types- Explicite et Implicite

Intention explicite : lorsque votre application sait quel composant appeler pour effectuer une action.

Intention implicite : Lorsque votre application ne sait pas quel composant peut effectuer exactement l'action souhaitée. Pour Ex, si vous dites simplement que vous voulez afficher une URL, le système décide quel composant remplira son intention.

Pour une idée plus précise et plus claire des intentions. Voir les liens ci-dessous

  1. Slidenerd.com
  2. Tutoriel sur l'intention Android
  3. Quelques autres
259
Shakeeb Ayaz

Une intention en attente est un jeton que vous donnez à une application pour qu'elle exécute une action au nom de vos applications , que votre processus de candidature soit actif ou non .

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

Il suffit de penser à des cas d'utilisation pour des intentions en attente telles que (intentions de diffusion, planification d'alarmes) et la documentation deviendra plus claire et plus utile.

48
Samuh

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

Et puis j'ai trouvé cette vidéo, Google I/O 2013, au-delà de la session Point bleu . Dans cette vidéo, l'ex-googler Jaikumar Ganesh explique ce qu'est PendingIntent et c'est ce qui m'a permis de brosser un tableau d'ensemble de la situation.

Vous trouverez ci-dessous la transcription de la vidéo ci-dessus ( à partir de 15h24 ).

Alors, quelle est l'intention en attente?

C'est un jeton que le processus de votre application attribuera au processus de localisation et , le processus de localisation l'utilisera pour réactiver 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 (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(...)   
    }
}
35
김준호

Pourquoi PendingIntent est nécessaire? Je pensais comme

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

E.g .Intent bluetoothIntent= new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);

Si j'envoie bluetoothIntent à une autre application n'ayant pas l'autorisation Android.permission.BLUETOOTH_ADMIN, cette application réceptrice ne peut pas activer Bluetooth avec startActivity(bluetoothIntent).

La limitation est surmontée avec PendingIntent. Avec PendingIntent l'application destinataire, vous n'avez pas besoin de Android.permission.BLUETOOTH_ADMIN pour activer Bluetooth. Source .

28
Kiran

Une intention en attente est une intention qui commencera dans le futur. L'intention normale commence immédiatement lorsqu'elle est passée à startActivity(Intent) ou StartService(Intent).

20
Arun P

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);
12
Oded Breiner

ANALOGIE DE 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 quand 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, cette tierce partie démarrera le service agissant en votre nom. Une analogie réelle est Uber ou Lyft, qui sont toutes deux des sociétés de taxi.

Vous envoyez une demande pour un tour à 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
11
Akshayraj Kore

Un PendingIntent est un jeton que vous attribuez à 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 la recevez via PendingIntent.getActivity ().

9
srinu

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 afin d'effectuer une opération spécifique. Pensez-y comme à une action qui doit avoir lieu. De nombreuses actions peuvent être effectuées, telles qu'envoyer un courrier électronique, joindre une photo à un courrier électronique ou même lancer une application. Le processus logique de 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, tel qu'une chaîne de texte ou quelque chose qui est transmis avec l'intention c. Exécuter l'intention

Exemple concret: Imaginons que je me lève le matin et que je "me propose" d'aller aux toilettes. Je vais d'abord devoir penser d'aller aux toilettes, mais cela ne m'emmène pas vraiment aux toilettes. Je devrai ensuite dire à mon cerveau de sortir du lit en premier, puis de me rendre aux toilettes, puis de le relâcher, puis de me laver les mains, puis de m'essuyer les mains. Une fois que je sais où je vais, j'envoie la commande pour commencer et mon corps prend des mesures.

Quelle est l'intention en attente?

En reprenant l’exemple concret, supposons que je veuille prendre une douche mais que je veuille me doucher APRÈS me brosser les dents et prendre le petit-déjeuner. Je sais donc que je ne me doucherai pas avant au moins 30 à 40 minutes. J'ai toujours dans la tête le besoin de préparer mes vêtements, puis de monter les escaliers pour retourner à la salle de bain, puis de me déshabiller et de prendre une douche. Cependant, cela ne se produira pas avant 30 à 40 minutes. J'ai maintenant une intention PENDING 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. Toutefois, pour créer une intention en attente, vous devez d'abord configurer une intention régulière.

6
Narendra Motwani

PendingIntent est fondamentalement un objet qui englobe un autre objet Intent. Il peut ensuite être transmis à une application étrangère où vous accordez à cette application le droit d'effectuer 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 autorisation et identité). Pour des raisons de sécurité, vous devez toujours transmettre des intentions explicites à un objet en attente plutôt que d'être implicite.

 PendingIntent aPendingIntent = PendingIntent.getService(Context, 0, aIntent,
                    PendingIntent.FLAG_CANCEL_CURRENT);
5

Dans une langue facile,
1. Une description d'une action d'intention et cible à effectuer. Vous devez d’abord créer une intention, puis transmettre une classe Java que vous voulez exécuter, à l’intention.
2. Vous pouvez appeler ces classes Java qui sont 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); Vous voyez ici 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.

4
Omar Faroque Anik

Un PendingIntent encapsule l'intention générale avec un jeton que vous laissez à une application étrangère pour qu'il l'exécute avec votre permission. Pour par exemple:

La notification de votre application musicale ne peut pas lire/mettre en pause la musique si vous n'avez pas donné à la PendingIntent émettre en diffusion parce que votre application musicale a l'autorisation READ_EXTERNAL_STORAGE contrairement à l'application de notification. Notification est un service système (donc une application étrangère).

3
Ashish Rawat

Comme son nom l'indique .. PendingIntent

vous pouvez le faire (faites-le après un certain temps). Cela fonctionne comme l’autre intention. C’est un moyen de confier votre tâche à une autre application pour qu’elle s’exécute en votre nom.

2
Xar E Ahmer

A Intention en attente spécifie une action à prendre dans le futur. Il vous permet de transmettre une intention future à une autre application et de permettre à cette application d'exécuter cette intention comme si elle disposait des mêmes autorisations que votre application, que votre application soit toujours présente ou non lorsque l'intention est finalement appelée.

C’est un jeton que vous donnez à une application étrangère qui permet à l’application étrangère d’utiliser les autorisations de celle-ci 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, elle l'exécutera avec ses propres autorisations. Mais si, au lieu de cela, vous donnez une intention en attente à l’application étrangère que vous avez créée avec votre propre autorisation, cette application exécutera l’intention contenue en utilisant 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 la recevez via PendingIntent.getActivity ().

C'est une action d'intention que vous souhaitez exécuter, mais ultérieurement. Pensez-y à mettre une Intention sur la glace. Cela est nécessaire parce qu’une intention doit être créée et lancée à partir d’un contexte valide dans votre application. Toutefois, dans certains cas, elle n’est pas disponible au moment où vous souhaitez exécuter l’action, car vous vous trouvez techniquement en dehors du contexte de l’application ( Deux exemples courants lancent une activité à partir d'une notification ou d'un broadcastReceiver.

En créant un PendingIntent que vous souhaitez utiliser pour lancer, par exemple, une activité alors que vous avez le contexte pour le faire (depuis une autre activité ou un autre service), vous pouvez transmettre cet objet à quelque chose d'extérieur pour pouvoir lancer une partie de votre application. en votre nom.

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 que l'application qui a créé PendingIntent a été supprimée, cette intention peut toujours s'exécuter. Description de l’intention et de l’action cible à effectuer avec. 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 renvoyé peut être remis à d'autres applications afin qu'elles puissent effectuer l'action que vous avez décrite en votre nom ultérieurement.

En attribuant 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 la vôtre (avec les mêmes autorisations et identité). En tant que tel, vous devez faire attention à la façon dont vous construisez 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, afin de garantir qu’il soit finalement envoyé ici et nulle part ailleurs.

Un PendingIntent lui-même est simplement une référence à un jeton géré 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 son application propriétaire est tué, le PendingIntent lui-même restera utilisable par rapport aux 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 s'il est toujours valide, et peut appelez donc cancel () pour le supprimer.

0
vikseln

En attente d'intention 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.

0
Neimer