Unterschiede zwischen Intent und PendingIntent

96

Ich habe einige Artikel gelesen und beide scheinen dasselbe zu tun. Ich habe mich gefragt, was der Unterschied zwischen dem Starten des Dienstes ist:

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

oder so:

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); 

Während ich durchlese, machen diese beiden dasselbe, wenn Sie im Dienst einen Parameter START_STICKY zurückgeben;

user3629316
quelle
Es gibt keinen Unterschied. Was lässt dich denken, dass es welche geben würde? Im ersten Fall starten Sie es "jetzt" und im zweiten planen Sie es nur für eine spätere Zeit / Daten.
Squonk
Mögliches Duplikat von Was ist ein Android PendingIntent?
James Moore

Antworten:

148

Absicht

Eine Android-Absicht ist ein Objekt, das eine Absicht trägt, dh eine Nachricht von einer Komponente zu einer anderen Komponente, entweder innerhalb oder außerhalb der Anwendung. Absichten können Nachrichten zwischen einer der drei Kernkomponenten einer Anwendung kommunizieren - Aktivitäten, Dienste und BroadcastReceiver.

Die Absicht selbst, ein Absichtsobjekt, ist eine passive Datenstruktur. Es enthält eine abstrakte Beschreibung einer auszuführenden Operation.

Beispiel: Angenommen, Sie haben eine Aktivität, mit der ein E-Mail-Client gestartet und eine E-Mail gesendet werden muss. Zu diesem Zweck sendet Ihre Aktivität eine Absicht mit der Aktion ACTION_SENDzusammen mit der entsprechenden Auswahl an den Android Intent Resolver:

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

Die angegebene Auswahl bietet dem Benutzer die richtige Oberfläche, um auszuwählen, wie Ihre E-Mail-Daten gesendet werden sollen.

EXPLICIT INTENTS

// 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);

IMPLICIT INTENTS

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

// Starts Implicit Activity
   startActivity(i); 

Ausstehende Absicht

Ein PendingIntent ist ein Token, das Sie einer fremden Anwendung (z. B. NotificationManager, AlarmManager, AppWidgetManager auf dem Startbildschirm oder anderen Anwendungen von Drittanbietern) geben, mit dem die fremde Anwendung die Berechtigungen Ihrer Anwendung zum Ausführen eines vordefinierten Codeteils verwenden kann.

Indem Sie einer anderen Anwendung einen PendingIntent zuweisen, gewähren Sie ihr das Recht, den von Ihnen angegebenen Vorgang so auszuführen, als wäre die andere Anwendung Sie selbst (mit denselben Berechtigungen und derselben Identität). Daher sollten Sie beim Erstellen des PendingIntent vorsichtig sein: Fast immer sollte beispielsweise bei dem von Ihnen angegebenen Basis-Intent der Komponentenname explizit auf eine Ihrer eigenen Komponenten festgelegt sein, um sicherzustellen, dass er letztendlich dorthin und nirgendwo anders gesendet wird.

Beispiel für ausstehende Absichten: http://android-pending-intent.blogspot.in/

Quelle: Android Intents und Android Pending Intents

Hoffe das hilft.

Siddharth_Vyas
quelle
25

PendingIntentist ein Wrapper von Intent. Die fremde App, die die empfängt PendingIntent, weiß nicht, von Intentwelchem Inhalt sie verpackt wird PendingIntent. Die Mission der ausländischen App besteht darin, die Absicht an den Eigentümer zurückzusenden, wenn bestimmte Bedingungen erfüllt sind (z. B. Alarm mit Zeitplan oder Benachrichtigung mit Klick ...). Die Bedingungen werden vom Eigentümer angegeben, aber von einer ausländischen App verarbeitet (z. B. Alarm, Benachrichtigung).

Wenn eine ausländische App eine Absicht an Ihre App gesendet hat, bedeutet dies, dass eine ausländische App über den Inhalt der Absicht informiert ist. Wenn eine ausländische App die Entscheidung trifft, eine Absicht zu senden, muss Ihre App die Absicht verarbeiten, um bestimmte Bedingungen zu erfüllen => Ihre App erhält die Leistungsressource des Systems.

HungNM2
quelle
3

Ein weiterer einfacher Unterschied:

  • Die normale Absicht stirbt, sobald die App beendet wird.

  • Ausstehende Absichten sterben nie. Sie sind so lange am Leben, wie sie vom Alarmdienst, vom Ortungsdienst oder von anderen Diensten benötigt werden.

Zumry Mohamed
quelle
1

Starten Sie Dienste regelmäßig über AlarmManager

Wie bei Aktivitäten kann das Android-System den Prozess eines Dienstes jederzeit beenden, um Ressourcen zu sparen. Aus diesem Grund können Sie a nicht einfach TimerTaskim Service verwenden, um sicherzustellen, dass es regelmäßig ausgeführt wird.

Verwenden Sie für die korrekte Planung des Dienstes die AlarmManagerKlasse.

AKTUALISIEREN:

Es gibt also keinen tatsächlichen Unterschied zwischen den beiden. Abhängig davon, ob Sie die Ausführung des Dienstes sicherstellen möchten oder nicht, können Sie entscheiden, was verwendet werden soll, da für den ersteren keine Garantie besteht und für den späteren .

Weitere Infos unter AndroidServices .

Mein Gott
quelle
2
Dies beantwortet nicht wirklich die Frage des OP, was "der Unterschied" zwischen dem direkten Starten eines Dienstes und dem Starten eines Dienstes mit einem Alarm ist. Auch das OP hat wahrscheinlich den Artikel gesehen, auf den Sie verlinken, da der Code im Artikel fast identisch mit dem ist, was das OP gepostet hat.
Squonk
Meinen Sie damit, dass das Starten eines Dienstes über AlarmManager sicherer ist und weniger wahrscheinlich getötet wird als durch eine Aktivität? Ich denke es ist falsch. Kannst du bitte Erklären. @VedPrakash. Darüber hinaus denke ich, dass der Kontext, den Sie beim Erstellen einer Absicht zum Starten des Dienstes übergeben, wichtiger ist. Die Verwendung des Kontextes der Anwendung (getApplicationContext ()) anstelle des Kontexts einer Aktivität (this) sollte sicherer sein.
Parth Kapoor
@ Eu.Dr. Ich empfehle Ihnen, einen Alarmmanager zu verwenden, der jedes Mal ausgelöst wird, wenn X ... die Aufgabe ausführt. Warum? Wenn Sie Dienste verwenden, wird diese möglicherweise irgendwann geschlossen und Sie überspringen möglicherweise zu einem bestimmten Zeitpunkt einige Aktualisierungen (unbekannt). Verwenden getApplicationContext()oder verwenden Sie es im Kontextzweck niemals , wenn Sie es unbedingt möchten. Lesen Sie einfach - wann Sie den Aktivitätskontext oder den Anwendungskontext aufrufen sollen ( stackoverflow.com/questions/7298731/… ).
Mein Gott
1

Funktionell gibt es keinen Unterschied.

Die Bedeutung von PendingIntent ist, dass Sie es mit einer anderen Anwendung verarbeiten können, die es später verwenden kann, als ob die andere Anwendung Sie selbst wäre. Hier ist die relevante Erklärung aus der Dokumentation :

Indem Sie einer anderen Anwendung einen PendingIntent zuweisen, gewähren Sie ihr das Recht, den von Ihnen angegebenen Vorgang so auszuführen, als wäre die andere Anwendung Sie selbst (mit denselben Berechtigungen und derselben Identität). Daher sollten Sie beim Erstellen des PendingIntent vorsichtig sein: Fast immer sollte beispielsweise bei dem von Ihnen angegebenen Basis-Intent der Komponentenname explizit auf eine Ihrer eigenen Komponenten festgelegt sein, um sicherzustellen, dass er letztendlich dorthin und nirgendwo anders gesendet wird.

Ein PendingIntent selbst ist einfach ein Verweis auf ein vom System verwaltetes Token, das die ursprünglichen Daten beschreibt, die zum Abrufen verwendet wurden.

PendingIntent ist also nur ein Verweis auf die Daten, die den ursprünglichen Intent darstellen (der zum Erstellen des PendingIntent verwendet wurde).

kupsef
quelle
4
Zu sagen, dass es funktional keinen Unterschied gibt, ist falsch. Wenn die Funktionen beider gleich sind, warum dann zwei auf dem ersten Platz? Der wichtigste Unterschied besteht darin, dass PendingIntent von einer Remote-Komponente (wie NotificationManager) mit denselben Berechtigungen ausgeführt wird wie die Komponente, die es übergibt (diejenige, die die Benachrichtigung erstellt).
Aniket Thakur