web-dev-qa-db-fra.com

Différences entre Intention et PendingIntent

J'ai lu certains articles et les deux semblent faire la même chose et je me demandais quelle est la différence entre le lancement du service de cette manière:

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

ou comme ça:

Calendar cal = Calendar.getInstance();
Intent intent = new Intent(this, MyService.class);
PendingIntent pintent = PendingIntent.getService(this, 0, intent, 0);
AlarmManager alarm = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
alarm.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), 30*1000, pintent); 

Au fur et à mesure que je lis, ces deux font la même chose, si dans le service vous renvoyez un paramètre START_STICKY;

89
user3629316

Intention

Un Android Intent est un objet portant une intention, c’est-à-dire un message d’un composant à un autre, à l’intérieur ou à l’extérieur de l’application. Intents peut communiquer des messages entre l’un des trois composants principaux d’une application. - Activités, services et diffuseurs.

L'intention elle-même, un objet Intent, est une structure de données passive. Il contient une description abstraite d’une opération à exécuter.

Par exemple, disons que vous avez une activité qui doit lancer un client de messagerie et envoyer un courrier électronique. Pour ce faire, votre activité enverrait une intention avec l'action ACTION_SEND, avec le sélecteur approprié, dans le Android résolveur d'intention:

Intent intent = new Intent(Intent.ACTION_SENDTO);
intent.setData(Uri.parse("mailto:")); // only email apps should handle this

Le sélecteur spécifié fournit l'interface appropriée à l'utilisateur pour choisir le mode d'envoi de vos données de courrier électronique.

INTENSES EXPLICITES

// Explicit Intent by specifying its class name
   Intent i = new Intent(this, TargetActivity.class);
   i.putExtra("Key1", "ABC");
   i.putExtra("Key2", "123");

// Starts TargetActivity
   startActivity(i);

INTENTION IMPLICITE

// Implicit Intent by specifying a URI
   Intent i = new Intent(Intent.ACTION_VIEW, 
   Uri.parse("http://www.example.com"));

// Starts Implicit Activity
   startActivity(i); 

Intention en attente

Un PendingIntent est un jeton que vous attribuez à une application foreign (par exemple, NotificationManager, AlarmManager, Home Screen AppWidgetManager ou d'autres applications tierces), qui permet à l'application étrangère d'utiliser les autorisations de votre application pour s'exécuter. un morceau de code prédéfini.

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: presque toujours, par exemple, l’intention de base que vous fournissez doit avoir le nom du composant explicitement défini sur l’un de vos propres composants, afin de garantir qu’il soit finalement envoyé là-bas et nulle part ailleurs.

Exemple d'intention en attente: http://Android-pending-intent.blogspot.in/

Source: Android Intents et Android Pending Intents

J'espère que cela t'aides.

138
Siddharth_Vyas

PendingIntent est un wrapper de Intent. L'application étrangère qui reçoit le PendingIntent ne connaît pas le contenu de Intent qui est encapsulé par PendingIntent. La mission de l'application étrangère est de renvoyer l'intention au propriétaire lorsque certaines conditions sont remplies (par exemple: alarme avec planification ou notification avec clic ...). Les conditions sont données par le propriétaire mais traitées par une application étrangère (par exemple: alarme, notification).

Si une application étrangère a envoyé une intention à votre application, cela signifie que cette application étrangère connaît le contenu de cette intention. et les applications étrangères décident d'envoyer une intention, votre application doit alors traiter l'intention de respecter certaines conditions => votre application obtient des ressources de performance du système.

22
HungNM2

Une autre différence simple:

  • L'intention normale mourra dès que l'application sera tuée.

  • Les intentions en suspens ne meurent jamais. Ils resteront en vie aussi longtemps que le service d'alarme, le service de localisation ou tout autre service en auront besoin.

3
Zumry Mohamed

Fonctionnellement, il n'y a pas de différence.

La signification de PendingIntent est que vous pouvez le gérer vers une autre application qui pourra l’utiliser ultérieurement comme si l’autre application était vous-même. Voici l'explication pertinente de la documentation :

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: presque toujours, par exemple, l’intention de base que vous fournissez doit avoir 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.

Donc, PendingIntent est simplement une référence aux données qui représentent l’intention initiale (celle utilisée pour créer PendingIntent).

1
kupsef

Démarrage régulier des services via AlarmManager

Comme pour les activités, le système Android peut mettre fin au processus d'un service à tout moment pour économiser des ressources. Pour cette raison, vous ne pouvez pas simplement utiliser un TimerTask dans le service pour vous en assurer. est exécuté régulièrement.

Ainsi, pour une planification correcte du Service, utilisez la classe AlarmManager.

UPDATE:

Donc, il n'y a pas de différence réelle entre les deux. Mais selon que vous souhaitiez ou non assurer l'exécution du service, vous pouvez décider quoi utiliser comme pour le former il n'y a pas de garantie et pour le plus tard c'est.

Plus d'infos sur AndroidServices .

1
My God