Vergleich eines lokalen, in Bearbeitung befindlichen Basisklassendienstes ✱ mit einem AsyncTask:
✱ (Diese Antwort bezieht sich nicht auf exportierte Dienste oder Dienste, die in einem anderen Prozess als dem des Kunden ausgeführt werden, da sich die erwarteten Anwendungsfälle erheblich von denen eines unterscheiden AsyncTask. Im Interesse der Kürze auch die Art bestimmter spezialisierter Dienste ServiceUnterklassen (zB IntentService, JobService) wird hier ignoriert.)
Prozesslebensdauer
A Servicesteht für das Betriebssystem für "den Wunsch einer Anwendung, einen länger laufenden Vorgang auszuführen, ohne mit dem Benutzer zu interagieren" [ ref ].
Während Sie Servicelaufen, versteht Android, dass Sie nicht möchten, dass Ihr Prozess beendet wird. Dies gilt auch, wenn Sie einen ActivityBildschirm haben, und dies gilt insbesondere dann, wenn Sie einen Vordergrunddienst ausführen . (Wenn alle Ihre Anwendungskomponenten verschwunden sind, denkt Android: "Oh, jetzt ist ein guter Zeitpunkt, um diese App zu beenden, damit ich Ressourcen freisetzen kann.")
Abhängig vom letzten Rückgabewert von Service.onCreate()kann Android außerdem versuchen, Apps / Dienste "wiederzubeleben", die aufgrund des Ressourcendrucks beendet wurden [ ref ].
AsyncTasksTu nichts davon. Es spielt keine Rolle, wie viele Hintergrund-Threads Sie ausführen oder wie hart sie arbeiten: Android hält Ihre App nicht am Leben, nur weil Ihre App die CPU verwendet. Es muss eine Möglichkeit geben zu wissen, dass Ihre App noch Arbeit zu erledigen hat. Deshalb Servicessind sie beim Betriebssystem registriert und AsyncTasksnicht.
Multithreading
AsyncTasks Es geht darum, einen Hintergrund-Thread zu erstellen, an dem gearbeitet werden soll, und dann das Ergebnis dieser Arbeit dem UI-Thread threadsicher zu präsentieren.
Jede neue AsyncTaskAusführung führt im Allgemeinen zu mehr Parallelität (mehr Threads), vorbehaltlich der Einschränkungen des AsyncTasks'sThread-Pools [ ref ].
ServiceMethoden hingegen werden immer im UI-Thread [ ref ] aufgerufen . Dies gilt für onCreate(), onStartCommand(), onDestroy(), onServiceConnected(), etc. Also, in gewissem Sinne Servicesnicht "run" im Hintergrund. Sobald sie start ( onCreate()) sind, "sitzen" sie einfach da - bis es Zeit ist, aufzuräumen, eine auszuführen onStartCommand()usw.
Mit anderen Worten, das Hinzufügen von zusätzlichen Servicesführt nicht zu mehr Parallelität. Servicemethoden sind kein guter Ort, um viel Arbeit zu erledigen, da sie auf dem UI-Thread ausgeführt werden .
Natürlich können Sie erweitern Service, Ihre eigenen Methoden hinzufügen und sie von jedem gewünschten Thread aus aufrufen. Wenn Sie dies tun, liegt die Verantwortung für die Thread-Sicherheit bei Ihnen - nicht beim Framework.
Wenn Sie Ihrem Hintergrund einen Hintergrund-Thread (oder eine andere Art von Worker) hinzufügen möchten Service, können Sie dies tun. Sie könnten beispielsweise einen Hintergrund-Thread / AsyncTaskin starten Service.onCreate(). Dies ist jedoch nicht in allen Anwendungsfällen erforderlich. Beispielsweise:
- Möglicherweise möchten
ServiceSie weiterhin ausgeführt werden, damit Sie weiterhin Standortaktualisierungen im "Hintergrund" erhalten (dh ohne unbedingt einen ActivitiesBildschirm zu haben).
- Oder Sie möchten Ihre App möglicherweise am Leben erhalten, damit Sie ein "implizites"
BroadcastReceiverMitglied langfristig registrieren können (nach API 26 können Sie dies nicht immer über das Manifest tun, sodass Sie sich stattdessen zur Laufzeit registrieren müssen [ ref ]).
Keiner dieser Anwendungsfälle erfordert viel CPU-Aktivität. Sie verlangen lediglich, dass die App nicht getötet wird .
Als Arbeiter
Servicessind nicht aufgabenorientiert. Sie sind nicht so eingerichtet, dass sie "eine Aufgabe ausführen" und "ein Ergebnis liefern" AsyncTasks. ServicesLösen Sie keine Thread-Sicherheitsprobleme (ungeachtet der Tatsache, dass alle Methoden auf einem einzelnen Thread ausgeführt werden). AsyncTasksBehandeln Sie diese Komplexität andererseits für Sie.
Beachten Sie, dass AsyncTaskist für deprecation geplant . Aber das bedeutet nicht , Ihr sollte Ihre ersetzen AsyncTasksmit Services! (Wenn Sie aus dieser Antwort etwas gelernt haben, sollte so viel klar sein.)
TL; DR
Servicessind meistens da, um "zu existieren". Sie sind wie ein Off-Screen-Bildschirm Activityund bieten einen Grund, warum die App am Leben bleibt, während andere Komponenten sich um die "Arbeit" kümmern. AsyncTasks"arbeiten", aber sie werden an und für sich keinen Prozess am Leben erhalten.