823 Stimmen

Dienst vs. IntentService auf der Android-Plattform

Ich suche ein Beispiel für etwas, das man mit einer IntentService die nicht mit einer Service (und vice versa)?

Ich glaube auch, dass ein IntentService läuft in einem anderen Thread und ein Service nicht. Soweit ich sehen kann, ist das Starten eines Dienstes innerhalb seines eigenen Threads also wie das Starten eines IntentService . Ist das richtig?

1429voto

José Juan Sánchez Punkte 14419

Tejas Lagvankar schrieb einen schönen poste über dieses Thema. Nachfolgend sind einige wesentliche Unterschiede zwischen Service und IntentService aufgeführt.

Wann ist sie zu verwenden?

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

  • En IntentService kann in langen Aufgaben verwendet werden, bei denen normalerweise keine Kommunikation mit dem Hauptthread stattfindet. Wenn Kommunikation erforderlich ist, können Main Thread Handler oder Broadcast Intents verwendet werden. Ein weiterer Anwendungsfall ist, wenn Rückrufe erforderlich sind (durch Intents ausgelöste Aufgaben).

Wie wird ausgelöst?

  • En Dienst wird ausgelöst durch den Aufruf der Methode startService() .

  • En IntentService mit einem Intent ausgelöst wird, wird ein neuer Worker-Thread angelegt und die Methode onHandleIntent() zu diesem Thema aufgerufen wird.

Ausgelöst von

  • En Dienst y IntentService kann von einem beliebigen Thread, einer Aktivität oder einer anderen Anwendungskomponente ausgelöst werden.

Läuft weiter

  • En Dienst läuft im Hintergrund, aber auf dem Hauptthread der Anwendung.

  • En IntentService läuft auf einem separaten Worker-Thread.

Beschränkungen/Nachteile

  • En Dienst kann den Haupt-Thread der Anwendung blockieren.

  • En IntentService kann keine Aufgaben parallel ausführen. Daher werden alle aufeinanderfolgenden Intents in die Nachrichtenwarteschlange für den Worker-Thread gestellt und nacheinander ausgeführt.

Wann soll man aufhören?

  • Wenn Sie eine Dienst liegt es in Ihrer Verantwortung, den Dienst zu stoppen, wenn er seine Arbeit beendet hat, indem Sie stopSelf() ou stopService() . (Wenn Sie nur die Bindung bereitstellen wollen, brauchen Sie diese Methode nicht zu implementieren).

  • En IntentService hält den Dienst an, nachdem alle Startanfragen abgearbeitet wurden, so dass Sie niemals stopSelf() .

174voto

CommonsWare Punkte 950864

Wenn mir jemand ein Beispiel für etwas zeigen kann, das mit einer IntentService und kann nicht mit einer Service und andersherum.

Das ist per Definition unmöglich. IntentService ist eine Unterklasse von Service , geschrieben in Java. Daher ist alles, was ein IntentService tut, ein Service tun könnte, indem er die entsprechenden Codestellen einbezieht, die IntentService verwendet.

Das Starten eines Dienstes mit eigenem Thread ist wie das Starten eines IntentService. Ist es nicht so?

Die drei wichtigsten Merkmale einer IntentService sind:

  • der Hintergrundfaden

  • die automatische Warteschlangenbildung von Intent s geliefert an onStartCommand() wenn man also Intent wird verarbeitet von onHandleIntent() auf dem Hintergrund-Thread, andere Befehle warten in der Warteschlange, bis sie an der Reihe sind

  • die automatische Abschaltung des IntentService über einen Aufruf an stopSelf() sobald die Warteschlange leer ist

All dies könnte durch eine Service ohne Verlängerung IntentService .

44voto

Umang Kothari Punkte 3614

Dienst

  • Aufrufen durch startService()
  • Ausgelöst von einem beliebigen Thread
  • Läuft auf Main Thread
  • Kann den Hauptthread (UI) blockieren. Verwenden Sie für lange Aufgaben immer einen Thread innerhalb des Dienstes
  • Sobald die Aufgabe erledigt ist, liegt es in unserer Verantwortung, den Dienst durch den Aufruf stopSelf() ou stopService()

IntentService

  • Er führt lange Aufgaben aus, normalerweise ohne Kommunikation mit dem Hauptthread, wenn Kommunikation erforderlich ist, wird sie von Handler ou BroadcastReceiver
  • Aufrufen über Intent
  • Ausgelöst von Main Thread
  • Läuft über den separaten Thread
  • Die Aufgabe kann nicht parallel ausgeführt werden, und mehrere Intents werden auf demselben Worker-Thread in die Warteschlange gestellt.

15voto

Sree Rama Punkte 1167

Hinzufügen von Punkten zur akzeptierten Antwort:

Siehe die Verwendung von IntentService innerhalb der Android API. z. B:

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

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

Um eine IntentService-Komponente für Ihre Anwendung zu erstellen, definieren Sie eine Klasse, die IntentService erweitert, und definieren Sie darin eine Methode, die onHandleIntent() außer Kraft setzt.

Sehen Sie sich auch den Quellcode des IntentService an, seinen Konstruktor und seine 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;
    }

S Anwendungsfälle, bei denen die Nutzlast nicht riesig ist. oder erstellen Sie einfach eine Klasse die IntentSerivce erweitert. Ab Android Version 4.0 sollten alle Netzwerk Operationen im Hintergrund ablaufen, sonst schlägt die Kompilierung/Erstellung der Anwendung fehl. separater Thread von der Benutzeroberfläche. Die Klasse AsyncTask bietet eine der einfachsten Möglichkeiten, eine neue Aufgabe aus dem UI-Thread auszulösen. Weitere Informationen zu diesem Thema finden Sie in dem Blogbeitrag

von Leitfaden für Android-Entwickler :

IntentService ist eine Basisklasse für Dienste, die bei Bedarf asynchrone Anfragen (ausgedrückt als Intents) bearbeiten. Clients senden Anfragen über startService(Intent)-Aufrufe; der Dienst wird nach Bedarf gestartet, bearbeitet jeden Intent der Reihe nach über einen Worker-Thread und hält sich selbst an, wenn er keine Arbeit mehr hat.

In IntentService verwendetes Entwurfsmuster

: Dieses "Work Queue Processor"-Muster wird häufig verwendet, um Aufgaben vom Hauptthread einer Anwendung zu entlasten. Die Klasse IntentService dient der Vereinfachung dieses Musters und kümmert sich um die Mechanismen. Um sie zu verwenden, erweitern Sie IntentService und implementieren onHandleIntent(Intent). IntentService empfängt die Intents, startet einen Worker-Thread und stoppt den Dienst bei Bedarf.

Alle Anfragen werden von einem einzigen Worker-Thread bearbeitet - sie können so lange wie nötig dauern (und blockieren nicht die Hauptschleife der Anwendung), aber es wird immer nur eine Anfrage auf einmal bearbeitet.

Die Klasse IntentService bietet eine unkomplizierte Struktur für die Ausführung eines Vorgangs auf einem einzigen Hintergrund-Thread. Dadurch können lange laufende Vorgänge ohne Beeinträchtigung der Reaktionsfähigkeit der Benutzeroberfläche verarbeitet werden. Außerdem wird ein IntentService von den meisten Lebenszyklusereignissen der Benutzeroberfläche nicht beeinflusst, so dass er auch unter Umständen weiterläuft, unter denen eine AsyncTask heruntergefahren würde.

Ein IntentService hat ein paar Einschränkungen:

Es kann nicht direkt mit Ihrer Benutzeroberfläche interagieren. Um die Ergebnisse in die Benutzeroberfläche zu stellen, müssen Sie sie an eine Aktivität senden. Arbeitsaufträge werden sequentiell ausgeführt. Wenn ein Vorgang in einem IntentService läuft und Sie ihm eine weitere Anforderung schicken, wartet die Anforderung, bis der erste Vorgang beendet ist. Eine Operation, die in einem IntentService läuft, kann nicht unterbrochen werden. In den meisten Fällen jedoch

IntentService ist der bevorzugte Weg zu einfachen Hintergrundoperationen

**

Volley-Bibliothek

Es gibt eine Bibliothek namens volley-library für die Entwicklung von Android-Netzwerkanwendungen Der Quellcode ist für die Öffentlichkeit auf GitHub verfügbar.

Die offizielle Android-Dokumentation für Bewährte Verfahren für Hintergrundaufträge : hilft, den beabsichtigten Dienst, den Thread, den Handler und den Dienst besser zu verstehen. und auch Durchführung von Netzwerkoperationen

14voto

Stefan de Bruijn Punkte 6279

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

Einer der wichtigsten Unterschiede in diesem Beispiel ist, dass IntentService sich selbst beendet, sobald es fertig ist.

Einige (schnell erfundene) Beispiele könnten sein;

IntentService: Wenn Sie zu Beginn des Öffnens Ihrer Anwendung eine Reihe von Bildern herunterladen möchten. Es handelt sich um einen einmaligen Vorgang, der sich selbst auflöst, sobald alles heruntergeladen ist.

Dienst: Ein Dienst, der ständig für die Kommunikation zwischen Ihrer Anwendung und dem Back-End mit Web-API-Aufrufen verwendet wird. Selbst wenn er mit seiner aktuellen Aufgabe fertig ist, soll er ein paar Minuten später noch für weitere Kommunikation zur Verfügung stehen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X