Service vs IntentService auf der Android-Plattform

774

Ich suche ein Beispiel für etwas, das mit einem gemacht werden IntentServicekann, das nicht mit einem gemacht werden kann Service(und umgekehrt)?

Ich glaube auch, dass ein IntentServicein einem anderen Thread läuft und ein Servicenicht. Soweit ich sehen kann, ist das Starten eines Dienstes innerhalb eines eigenen Threads wie das Starten eines IntentService. Ist das korrekt?

Roiberg
quelle
45
IntentService is used for short tasks (etc) and a service is for long oneswo hast du das gelesen
NJZK2
9
Außerdem schlage ich vor, dass Sie den Quellcode für IntentService lesen. Es macht deutlich, was es ist und was es tut.
njzk2
1
Ich habe meine Frage bearbeitet, nachdem ich Ihren Kommentar gesehen habe.
Roiberg
2
Der Link im vorherigen Kommentar (von greg7gkb) ist eine großartige Lektüre.
DSlomer64

Antworten:

1348

Tejas Lagvankar hat einen schönen Beitrag zu diesem Thema geschrieben. Im Folgenden sind einige wichtige Unterschiede zwischen Service und IntentService aufgeführt.

Wann verwenden?

  • Der Dienst kann für Aufgaben ohne Benutzeroberfläche verwendet werden, sollte jedoch nicht zu lang sein. Wenn Sie lange Aufgaben ausführen müssen, müssen Sie Threads innerhalb des Dienstes verwenden.

  • Der IntentService kann für lange Aufgaben verwendet werden, normalerweise ohne Kommunikation mit dem Hauptthread. Wenn Kommunikation erforderlich ist, können Sie den Main Thread-Handler oder Broadcast-Absichten verwenden. Ein weiterer Anwendungsfall ist, wenn Rückrufe erforderlich sind (durch Absicht ausgelöste Aufgaben).

Wie auslösen?

  • Der Dienst wird durch Aufrufen der Methode ausgelöst startService().

  • Der IntentService wird mit einem Intent ausgelöst, es wird ein neuer Arbeitsthread erzeugt und die Methode onHandleIntent()wird für diesen Thread aufgerufen.

Ausgelöst von

  • Der Service und der IntentService können von einem Thread, einer Aktivität oder einer anderen Anwendungskomponente ausgelöst werden.

Läuft auf

  • Der Dienst wird im Hintergrund ausgeführt, jedoch im Hauptthread der Anwendung.

  • Der IntentService wird auf einem separaten Arbeitsthread ausgeführt .

Einschränkungen / Nachteile

  • Der Dienst blockiert möglicherweise den Hauptthread der Anwendung.

  • Der IntentService kann keine Aufgaben parallel ausführen. Daher werden alle aufeinander folgenden Absichten in die Nachrichtenwarteschlange für den Arbeitsthread gestellt und nacheinander ausgeführt.

Wann aufhören?

  • Wenn Sie einen Dienst implementieren , liegt es in Ihrer Verantwortung, den Dienst zu beenden, wenn seine Arbeit erledigt ist, indem Sie stopSelf()oder anrufenstopService() . (Wenn Sie nur eine Bindung bereitstellen möchten, müssen Sie diese Methode nicht implementieren.)

  • Der IntentService stoppt den Dienst, nachdem alle Startanforderungen verarbeitet wurden, sodass Sie nie mehr anrufen müssen stopSelf().

José Juan Sánchez
quelle
11
kurz und bündig, aber es ist besser, wenn Sie Ihre Antwort einschließlich der Punkte von CommonsWare bearbeiten, da viele Leute nur akzeptierte oder am meisten bewertete Antworten lesen
Shirish Herwade
12
@Darpan Ein Dienst ist eine Anwendungskomponente, die lang laufende Vorgänge im Hintergrund ausführen kann und keine Benutzeroberfläche bietet. Ein Dienst wird im Hauptthread seines Hosting-Prozesses ausgeführt. Der Dienst erstellt keinen eigenen Thread und wird nicht in einem separaten Prozess ausgeführt (sofern Sie nichts anderes angeben). Dies bedeutet, dass Sie einen neuen Thread innerhalb des Dienstes erstellen sollten, wenn Ihr Dienst CPU-intensive Arbeit oder Blockierungsvorgänge ausführen soll (z. B. MP3-Wiedergabe oder Netzwerk).
José Juan Sánchez
8
"Der IntentService muss vom Haupt-Thread ausgelöst werden." Bist du sicher? Wenn ich in meiner MainActivity onCreate () einen IntentService von einem neuen Thread aus aufrufe (Code unten), funktioniert dies immer noch für mich. neuer Thread (new Runnable () {@Override public void run () {Intent intent = new Intent (Kontext, HelloIntentService.class); startService (intent);}}). start ();
Ashok Bijoy Debnath
9
@AshokBijoyDebnath Du hast recht! Die Dienste und IntentServices können von jedem Thread, jeder Aktivität oder jeder anderen Anwendungskomponente aus gestartet werden. Ich habe gerade den Text der Antwort bearbeitet, um dieses Problem zu beheben. Vielen Dank für Ihren Bearbeitungsvorschlag! :)
José Juan Sánchez
2
Kein Problem, mach es!
José Juan Sánchez
165

Wenn mir jemand ein Beispiel für etwas zeigen kann, das mit einem gemacht werden IntentServicekann und nicht mit einem Serviceund umgekehrt.

Per Definition ist das unmöglich. IntentServiceist eine Unterklasse von Service, geschrieben in Java. Daher kann alles, was ein IntentServicetut, Servicetun, indem die relevanten Codebits, die IntentServiceverwendet werden, eingeschlossen werden.

Das Starten eines Dienstes mit einem eigenen Thread entspricht dem Starten eines IntentService. Es ist nicht?

Die drei Hauptmerkmale eines IntentServicesind:

  • der Hintergrund-Thread

  • Die automatische Warteschlange von Intents wird an geliefert. onStartCommand()Wenn also einer im Hintergrund-Thread Intentverarbeitet wird onHandleIntent(), warten andere Befehle in der Warteschlange, bis sie an der Reihe sind

  • das automatische Herunterfahren von IntentService, über einen Anruf an stopSelf(), sobald die Warteschlange leer ist

All dies könnte von a Serviceohne Erweiterung umgesetzt werden IntentService.

CommonsWare
quelle
6
Ein wenig spät, aber ich finde , dass Servicemit rief startServiceetwa 10 Sekunden lang kann nur ausgeführt werden, bevor ein ANR-- wirft ein IntentServicebegann mit der Absicht Rundfunk scheint nicht diese Einschränkung zu haben
edthethird
16
@edthethird: Das liegt daran, dass Sie den Hauptanwendungsthread gebunden haben. Alle Lebenszyklusmethoden für alle Komponenten, einschließlich onStartCommand()a Service, werden im Hauptanwendungsthread aufgerufen. Sie können diesen Thread nicht länger als ein paar Millisekunden binden, ohne Ihre Benutzeroberfläche einzufrieren. Wenn Sie viele Sekunden benötigen, erhalten Sie das Service-Äquivalent einer ANR.
CommonsWare
3
yup ich habe zu früh kommentiert. Ich habe die Arbeit gemacht onStartCommandanstatt onHandleIntent- sieht so aus, onStartCommandals würde sie auf dem UI-Thread ausgeführt, jedoch wird ein separater Thread zur onHandleIntentAusführung erzeugt.
3.
3
@IgorGanapolsky: IntentServiceruft das selbst nach der onHandleIntent()Rückkehr auf, wenn keine Arbeit mehr zu erledigen ist.
CommonsWare
1
Das Problem ist nicht Englisch, sondern Programmierung. Zum Beispiel hat "Ich habe die App geschlossen" keine genaue Definition, daher kann ich Ihnen nicht sagen, was passiert, wenn dies geschieht. Ich weiß auch nicht, wie sich "Ich habe die App geschlossen" auf "Wird nach 1 Stunde herunterladen" bezieht. Sie können eine separate Frage zum Stapelüberlauf stellen, in der Sie ein minimal reproduzierbares Beispiel für "Wird nach 1 Stunde heruntergeladen" angeben können. Dort können Sie detailliert erklären, was "Ich habe die App geschlossen" bedeutet (was macht der Benutzer beispielsweise konkret, um die App zu schließen?).
CommonsWare
39

Bedienung

  • Rufen Sie an von startService()
  • Ausgelöst von jedem Thread
  • Läuft auf Main Thread
  • Kann den Hauptthread (UI) blockieren. Verwenden Sie für lange Aufgaben immer Thread innerhalb des Dienstes
  • Sobald die Aufgabe erledigt ist, liegt es in unserer Verantwortung, den Service durch einen Anruf stopSelf()oder zu beendenstopService()

IntentService

  • Es führt lange Aufgaben aus, normalerweise keine Kommunikation mit dem Haupt-Thread. Wenn eine Kommunikation erforderlich ist, erfolgt dies durch HandleroderBroadcastReceiver
  • Aufruf über Intent
  • Ausgelöst von Main Thread
  • Läuft auf dem separaten Thread
  • Die Aufgabe kann nicht parallel ausgeführt werden, und mehrere Absichten werden im selben Arbeitsthread in die Warteschlange gestellt.
Umang Kothari
quelle
19

Das Rad nicht neu erfinden

IntentService erweitert die Serviceklasse , was eindeutig bedeutet, dass sie IntentServiceabsichtlich für denselben Zweck erstellt wurde.

Was ist der Zweck?

`IntentService hat zum Ziel, die Ausführung von Hintergrundaufgaben zu vereinfachen, ohne sich darüber Gedanken machen zu müssen

  • Erstellung eines Worker-Threads

  • Warteschlange für die Verarbeitung mehrerer Anforderungen nacheinander ( Threading)

  • Zerstörung der Service

Also NEIN , Servicekann jede Aufgabe erledigen, die ein IntentServicetun würde. Wenn Ihre Anforderungen unter die oben genannten Kriterien fallen, müssen Sie diese Logiken nicht in die ServiceKlasse schreiben . Erfinden Sie das Rad also nicht neu, denn es IntentServiceist das erfundene Rad.

Der Hauptunterschied

Der Service wird auf dem UI-Thread ausgeführt, während ein IntentService auf einem separaten Thread ausgeführt wird

Wann verwenden Sie IntentService?

Wenn Sie mehrere Hintergrundaufgaben nacheinander ausführen möchten, die über den Rahmen einer Aktivität hinausgehen, ist die Aufgabe IntentServiceperfekt.

Wie IntentService wird aus gemachtService

Ein normaler Dienst läuft auf dem UI - Thread (Jede Art Android - Komponente läuft auf UI - Thread standardmäßig zB Activity, BroadcastReceiver, ContentProviderund Service). Wenn Sie einige Arbeiten ausführen müssen, die einige Zeit in Anspruch nehmen können, müssen Sie einen Thread erstellen. Bei mehreren Anfragen müssen Sie sich darum kümmern synchronization. IntentServiceerhält eine Standardimplementierung, die diese Aufgaben für Sie erledigt.
Laut Entwicklerseite

  1. IntentService erstellt einen Worker-Thread

  2. IntentService Erstellt eine Arbeitswarteschlange, an die eine Anforderung gesendet wird onHandleIntent() nacheinander Methode

  3. Wenn es keine Arbeit gibt, IntentServiceruft man anstopSelf() Methode aufgerufen
  4. Bietet eine Standardimplementierung für eine onBind()Methode, die null ist
  5. Standardimplementierung, für onStartCommand()die eine IntentAnforderung an WorkQueue und schließlich an gesendet wirdonHandleIntent()
Rohit Singh
quelle
15

Hinzufügen von Punkten zur akzeptierten Antwort:

Informationen zur Verwendung von IntentService in der Android-API finden Sie hier. z.B:

public class SimpleWakefulService extends IntentService {
    public SimpleWakefulService() {
        super("SimpleWakefulService");
    }

    @Override
    protected void onHandleIntent(Intent intent) {  ...}

Um eine IntentService-Komponente für Ihre App zu erstellen, definieren Sie eine Klasse, die IntentService erweitert, und definieren Sie darin eine Methode, die onHandleIntent () überschreibt.

Lesen Sie auch den Quellcode des IntentService, seine Konstruktor- und Lebenszyklusmethoden wie onStartCommand ...

  @Override
    public int More ...onStartCommand(Intent intent, int flags, int startId) {
       onStart(intent, startId);
        return mRedelivery ? START_REDELIVER_INTENT : START_NOT_STICKY;
    }

Die gemeinsame Wartung einer AsyncTask ist einer der besten Ansätze für viele Anwendungsfälle, in denen die Nutzlast nicht sehr groß ist. oder erstellen Sie einfach eine Klasse, die IntentSerivce erweitert. Ab Android Version 4.0 sollten sich alle Netzwerkvorgänge im Hintergrund befinden, da sonst das Kompilieren / Erstellen der Anwendung fehlschlägt. Trennen Sie den Thread von der Benutzeroberfläche. Die AsyncTask-Klasse bietet eine der einfachsten Möglichkeiten, eine neue Aufgabe aus dem UI-Thread auszulösen. Weitere Informationen zu diesem Thema finden Sie im Blogbeitrag

aus dem Android-Entwicklerhandbuch :

IntentService ist eine Basisklasse für Dienste, die bei Bedarf asynchrone Anforderungen (ausgedrückt als Absichten) verarbeiten. Clients senden Anforderungen über startService (Intent) -Aufrufe. Der Dienst wird nach Bedarf gestartet, verarbeitet jede Absicht wiederum mithilfe eines Arbeitsthreads und stoppt sich selbst, wenn die Arbeit ausgeht.

In IntentService verwendetes Entwurfsmuster

: Dieses Muster "Arbeitswarteschlangenprozessor" wird häufig verwendet, um Aufgaben aus dem Hauptthread einer Anwendung zu entfernen. Die IntentService-Klasse ist vorhanden, um dieses Muster zu vereinfachen und die Mechanik zu übernehmen. Um es zu verwenden, erweitern Sie IntentService und implementieren Sie onHandleIntent (Intent). IntentService empfängt die Absichten, startet einen Arbeitsthread und beendet den Dienst entsprechend.

Alle Anforderungen werden in einem einzelnen Worker-Thread verarbeitet. Sie können so lange wie nötig dauern (und blockieren nicht die Hauptschleife der Anwendung), es wird jedoch jeweils nur eine Anforderung verarbeitet.

Die IntentService-Klasse bietet eine einfache Struktur zum Ausführen einer Operation für einen einzelnen Hintergrundthread. Auf diese Weise können lang laufende Vorgänge ausgeführt werden, ohne die Reaktionsfähigkeit Ihrer Benutzeroberfläche zu beeinträchtigen. Außerdem ist ein IntentService von den meisten Lebenszyklusereignissen der Benutzeroberfläche nicht betroffen, sodass er unter Umständen fortgesetzt wird, unter denen eine AsyncTask heruntergefahren wird.

Ein IntentService weist einige Einschränkungen auf:

Es kann nicht direkt mit Ihrer Benutzeroberfläche interagieren. Um die Ergebnisse in die Benutzeroberfläche einzufügen, müssen Sie sie an eine Aktivität senden. Arbeitsanforderungen werden nacheinander ausgeführt. Wenn ein Vorgang in einem IntentService ausgeführt wird und Sie ihm eine weitere Anforderung senden, wartet die Anforderung, bis der erste Vorgang abgeschlossen ist. Ein Vorgang, der auf einem IntentService ausgeführt wird, kann nicht unterbrochen werden. In den meisten Fällen jedoch

IntentService ist der bevorzugte Weg zu einfachen Hintergrundoperationen

** **.

Volley Bibliothek

Es gibt die Bibliothek namens Volley-Bibliothek für die Entwicklung von Android-Netzwerkanwendungen. Der Quellcode ist für die Öffentlichkeit in GitHub verfügbar.

Die offizielle Android-Dokumentation für Best Practices für Hintergrundjobs : Hilft beim besseren Verständnis von Intent Service, Thread, Handler und Service. und auch Netzwerkoperationen durchführen

Sree Rama
quelle
1
Es könnte besser sein, wenn Sie eine kurze, aktuelle Antwort geben könnten.
eRaisedToX
12

Ich bin sicher, Sie können eine umfangreiche Liste von Unterschieden finden, indem Sie einfach etwas wie "Android IntentService vs Service" googeln.

Einer der wichtigeren Unterschiede pro Beispiel ist, dass IntentService sich selbst beendet, sobald es fertig ist.

Einige Beispiele (schnell erfunden) könnten sein;

IntentService: Wenn Sie zu Beginn des Öffnens Ihrer App eine Reihe von Bildern herunterladen möchten. Es ist ein einmaliger Vorgang und kann sich selbst bereinigen, sobald alles heruntergeladen wurde.

Service: Ein Service, der ständig zur Kommunikation zwischen Ihrer App und dem Back-End mit Web-API-Aufrufen verwendet wird. Selbst wenn die aktuelle Aufgabe erledigt ist, möchten Sie, dass sie einige Minuten später verfügbar ist, um mehr Kommunikation zu ermöglichen.

Stefan de Bruijn
quelle
2
Ich habe kein Beispiel gefunden, das mit dem einen und nicht mit dem anderen gemacht werden kann. Nur ein paar Erklärungen, die mir nicht geholfen haben.
Roiberg
1
Probieren Sie diese Seite aus, sie enthält viele gute Erklärungen zu grundlegenden Android-Konzepten mit anständigen Beispielen. Vogella.com/articles/AndroidServices/article.html
Stefan de Bruijn
4
Es ist ein weiteres Beispiel für "Verwendung". nicht, wenn Service speziell verwendet wird und wenn Intentservice. Bitte geben Sie mir ein theoretisches Beispiel und keine Links zu "How to Use" oder anderen Likes für diesen Metter. Ich bitte Sie nicht, für mich zu "arbeiten", während ich nichts tue. Es ist nur so, dass ich all diese Vorlieben bereits gesehen habe und immer noch nicht sicher bin.
Roiberg
5
Das ist ein ziemlich wichtiger Unterschied. Wenn Sie beispielsweise den Dienst verwenden, um eine dauerhafte Verbindung zum Server aufrechtzuerhalten, können Sie den Intentservice dafür nicht verwenden, da er direkt nach Abschluss aller Aufgaben beendet wird
pelotasplus
24
Wenn ich das google, bringt es mich hierher. Jetzt bin ich in einer Endlosschleife.
Lou Morda
12

IntentService

IntentServiceläuft auf einem eigenen Thread. Es wird sich selbst stoppen, wenn es fertig ist. Eher wie Feuer und vergessen. Nachfolgende Anrufe werden in die Warteschlange gestellt. Gut zum Anstehen von Anrufen. Sie können IntentServicebei Bedarf auch mehrere Threads innerhalb drehen. Dies können Sie mit erreichen ThreadPoolExecutor. Ich sage das, weil mich viele Leute gefragt haben, "warum verwenden, IntentServiceda es keine parallele Ausführung unterstützt". IntentServiceist nur ein Thread. Sie können alles tun, was Sie brauchen - sogar mehrere Threads drehen. Die einzige Einschränkung ist, dass sie IntentServicebeendet ist, sobald Sie diese mehreren Fäden drehen. Es wartet nicht darauf, dass diese Threads zurückkommen. Sie müssen sich darum kümmern. Daher empfehle ich die Verwendung ThreadPoolExecutorin diesen Szenarien.

  • Gut zum Synchronisieren, Hochladen usw.

Bedienung

Standardmäßig wird Serviceauf dem Hauptthread ausgeführt. Sie müssen einen Worker-Thread spinnen, um Ihre Arbeit zu erledigen. Sie müssen serviceexplizit aufhören . Ich habe es für eine Situation verwendet, in der Sie Dinge im Hintergrund ausführen müssen, selbst wenn Sie sich von Ihrer App entfernen und mehr für einen Headless zurückkehren service.

  • Auch hier können Sie bei Bedarf mehrere Threads ausführen.
  • Kann für Apps wie Musik-Player verwendet werden.

Sie können jederzeit BroadcastReceiversbei Bedarf mit Ihrer Aktivität kommunizieren .

Sayooj Valsan
quelle
8

Ein IntentService ist eine Erweiterung eines Dienstes, die die Ausführung einer Aufgabe erleichtert, die im Hintergrund und in einem separaten Thread ausgeführt werden muss.

IntentService startet, erstellt einen Thread und führt seine Aufgabe im Thread aus. Sobald es fertig ist, reinigt es alles. Es kann immer nur eine Instanz eines IntentService gleichzeitig ausgeführt werden. Mehrere Aufrufe werden in die Warteschlange gestellt.

Es ist sehr einfach zu bedienen und sehr praktisch für viele Zwecke, zum Beispiel zum Herunterladen von Inhalten. Es gibt jedoch Einschränkungen, die dazu führen können, dass Sie stattdessen den grundlegenderen (nicht einfachen) Dienst verwenden möchten.

Beispielsweise kann ein Dienst, der mit einem xmpp-Server verbunden und an Aktivitäten gebunden ist, nicht einfach mit einem IntentService ausgeführt werden. Am Ende werden Sie IntentService-Inhalte ignorieren oder überschreiben.

njzk2
quelle
Es scheint, dass die meisten Leute, die einen wirklich lang laufenden Dienst im Hintergrund ausführen möchten, am Ende versuchen, etwas über IntentService herauszufinden, weil die Dokumente den Anschein erwecken, dass dies der Fall ist. Aber Sie könnten meistens genauso gut einen neuen Thread verwenden (new Runnable ()). start (). Mit anderen Worten, wenn es um "erzeugt einen neuen Thread" geht, der alles ist, was es tut, wird es nicht in einen separaten Prozess verschoben, was eigentlich die meisten Leute tun, wenn sie etwas laufenden Code von der Aktivität trennen möchten ! (weil nur Laichen von Fäden sowieso ein Einzeiler ist)
Lassi Kinnunen
Der intentService kümmert sich auch um den Lebenszyklus des Threads und verwendet einen Looper, der dem Scheduler hilft. Außerdem wird sichergestellt, dass nur eine Instanz ausgeführt wird, und andere Anrufe werden in die Warteschlange gestellt.
NJZK2
5

Wenn mir jemand ein Beispiel für etwas zeigen kann, das man mit einem machen IntentServicekann und nicht mit einem serviceund umgekehrt.

IntentService kann nicht für langes Hören verwendet werden, wie für XMPP-Listener, es ist ein einzelner Zeitoperator, erledigt den Job und winkt zum Abschied.

Es hat auch nur einen Threadworker, aber mit einem Trick können Sie es als unbegrenzt verwenden.

user3764748
quelle
4

Der Hauptunterschied zwischen a Serviceund anIntentService wird wie folgt beschrieben:

Bedienung :

1.A. Service wird standardmäßig auf dem Hauptthread der Anwendung ausgeführt (hier ist kein Standardarbeitsthread verfügbar). Daher muss der Benutzer einen separaten Thread erstellen und die erforderliche Arbeit in diesem Thread ausführen.

2.Ermöglicht mehrere Anforderungen gleichzeitig (Multi-Threading)

IntentService:

1. Jetzt steht IntentServicehier ein Standard-Worker-Thread zur Verfügung, mit dem alle Vorgänge ausgeführt werden können. Beachten Sie Folgendes: - Sie müssen implementierenonHandleIntent() Methode , die die Absicht für jede Startanforderung erhält, mit der Sie die Hintergrundarbeit ausführen können.

2.Aber es erlaubt jeweils nur eine Anfrage.

Narendrakumar
quelle
3

Android IntentService vs Service

1. Service

  • Ein Dienst wird mit startService () aufgerufen.
  • Ein Service kann von jedem Thread aus aufgerufen werden.
  • Ein Dienst führt standardmäßig Hintergrundvorgänge für den Hauptthread der Anwendung aus. Daher kann es die Benutzeroberfläche Ihrer Anwendung blockieren.
  • Ein Dienst, der mehrmals aufgerufen wird, erstellt mehrere Instanzen.
  • Ein Dienst muss mit stopSelf () oder stopService () gestoppt werden.
  • Der Android-Dienst kann parallele Vorgänge ausführen.

2. IntentService

  • Ein IntentService wird mit Intent aufgerufen.
  • Ein IntentService kann nur vom Hauptthread aus aufgerufen werden.
  • Ein IntentService erstellt einen separaten Arbeitsthread zum Ausführen von Hintergrundoperationen.
  • Ein mehrfach aufgerufener IntentService erstellt nicht mehrere Instanzen.
  • Ein IntentService wird automatisch beendet, nachdem die Warteschlange abgeschlossen ist. StopService () oder stopSelf () müssen nicht ausgelöst werden.
  • In einem IntentService werden mehrere Intent-Aufrufe automatisch in die Warteschlange gestellt und nacheinander ausgeführt.
  • Ein IntentService kann nicht wie ein Service parallel ausgeführt werden.

Siehe hier

Deepak Gupta
quelle