Ich suche ein Beispiel für etwas, das mit einem gemacht werden IntentService
kann, das nicht mit einem gemacht werden kann Service
(und umgekehrt)?
Ich glaube auch, dass ein IntentService
in einem anderen Thread läuft und ein Service
nicht. Soweit ich sehen kann, ist das Starten eines Dienstes innerhalb eines eigenen Threads wie das Starten eines IntentService
. Ist das korrekt?
IntentService is used for short tasks (etc) and a service is for long ones
wo hast du das gelesenAntworten:
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
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()
.quelle
Per Definition ist das unmöglich.
IntentService
ist eine Unterklasse vonService
, geschrieben in Java. Daher kann alles, was einIntentService
tut,Service
tun, indem die relevanten Codebits, dieIntentService
verwendet werden, eingeschlossen werden.Die drei Hauptmerkmale eines
IntentService
sind:der Hintergrund-Thread
Die automatische Warteschlange von
Intent
s wird an geliefert.onStartCommand()
Wenn also einer im Hintergrund-ThreadIntent
verarbeitet wirdonHandleIntent()
, warten andere Befehle in der Warteschlange, bis sie an der Reihe sinddas automatische Herunterfahren von
IntentService
, über einen Anruf anstopSelf()
, sobald die Warteschlange leer istAll dies könnte von a
Service
ohne Erweiterung umgesetzt werdenIntentService
.quelle
Service
mit riefstartService
etwa 10 Sekunden lang kann nur ausgeführt werden, bevor ein ANR-- wirft einIntentService
begann mit der Absicht Rundfunk scheint nicht diese Einschränkung zu habenonStartCommand()
aService
, 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.onStartCommand
anstattonHandleIntent
- sieht so aus,onStartCommand
als würde sie auf dem UI-Thread ausgeführt, jedoch wird ein separater Thread zuronHandleIntent
Ausführung erzeugt.IntentService
ruft das selbst nach deronHandleIntent()
Rückkehr auf, wenn keine Arbeit mehr zu erledigen ist.Bedienung
startService()
Thread
Main Thread
stopSelf()
oder zu beendenstopService()
IntentService
Handler
oderBroadcastReceiver
Intent
Main Thread
quelle
Das Rad nicht neu erfinden
IntentService erweitert die Serviceklasse , was eindeutig bedeutet, dass sie
IntentService
absichtlich 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
)Service
Also NEIN ,
Service
kann jede Aufgabe erledigen, die einIntentService
tun würde. Wenn Ihre Anforderungen unter die oben genannten Kriterien fallen, müssen Sie diese Logiken nicht in dieService
Klasse schreiben . Erfinden Sie das Rad also nicht neu, denn esIntentService
ist das erfundene Rad.Der Hauptunterschied
Wann verwenden Sie IntentService?
Wenn Sie mehrere Hintergrundaufgaben nacheinander ausführen möchten, die über den Rahmen einer Aktivität hinausgehen, ist die Aufgabe
IntentService
perfekt.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
,ContentProvider
undService
). 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ümmernsynchronization
.IntentService
erhält eine Standardimplementierung, die diese Aufgaben für Sie erledigt.Laut Entwicklerseite
IntentService
erstellt einen Worker-ThreadIntentService
Erstellt eine Arbeitswarteschlange, an die eine Anforderung gesendet wirdonHandleIntent()
nacheinander MethodeIntentService
ruft man anstopSelf()
Methode aufgerufenonBind()
Methode, die null istonStartCommand()
die eineIntent
Anforderung an WorkQueue und schließlich an gesendet wirdonHandleIntent()
quelle
Hinzufügen von Punkten zur akzeptierten Antwort:
Informationen zur Verwendung von IntentService in der Android-API finden Sie hier. z.B:
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 ...
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.
: 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
** **.
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
quelle
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.
quelle
IntentService
IntentService
lä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önnenIntentService
bei Bedarf auch mehrere Threads innerhalb drehen. Dies können Sie mit erreichenThreadPoolExecutor
. Ich sage das, weil mich viele Leute gefragt haben, "warum verwenden,IntentService
da es keine parallele Ausführung unterstützt".IntentService
ist nur ein Thread. Sie können alles tun, was Sie brauchen - sogar mehrere Threads drehen. Die einzige Einschränkung ist, dass sieIntentService
beendet 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 VerwendungThreadPoolExecutor
in diesen Szenarien.Bedienung
Standardmäßig wird
Service
auf dem Hauptthread ausgeführt. Sie müssen einen Worker-Thread spinnen, um Ihre Arbeit zu erledigen. Sie müssenservice
explizit 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ückkehrenservice
.Sie können jederzeit
BroadcastReceivers
bei Bedarf mit Ihrer Aktivität kommunizieren .quelle
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.
quelle
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.
quelle
Der Hauptunterschied zwischen a
Service
und 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
IntentService
hier 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.
quelle
Android IntentService vs Service
1. Service
2. IntentService
Siehe hier
quelle