Wenn Sie in einem Service etwas tun, wird es nicht im Hintergrund ausgeführt. Sie müssen auch einen Thread in Ihrem Dienst erstellen, um auf den Abschluss des Downloads zu warten.
Wenn Sie einen Thread verwenden, der für eine Aktivität lokal ist, haben Sie Probleme beim Verlassen der Aktivität, beim Senden in den Hintergrund oder bei einer Unterbrechung wegen eines eingehenden Anrufs usw. Dies kann dazu führen, dass Ihre App vom Betriebssystem gelöscht wird um Speicher freizugeben. In diesem Fall ist Ihr Thread verloren und wird möglicherweise nicht neu gestartet und führt zum Absturz Ihrer App.
Wenn Sie einen Dienst erstellen, der nicht so wahrscheinlich beendet wird, dann nur ein Thread, und Sie können das Betriebssystem angeben, um den Dienst neu zu starten, nachdem es vom Betriebssystem beendet wurde. Dies macht den Service zu einer sichereren Wahl für sehr lange Downloads. Ich verwende einen Dienst in einer meiner Apps, um eine 20 MB-Datei herunterzuladen und in diesem Dienst einen Thread zu erstellen, der den Download durchführt.
Ein Service hilft Ihnen nur, den Download zu kapseln und entkoppelt ihn von der Aktivität und gibt Ihnen einen anderen Zustand im Betriebssystem, der verhindert, dass der Thread einfach wegen zu wenig Arbeitsspeichers verschwindet.
Was sollte ich in dieser Situation Thread oder Dienste wählen?
Es ist kein "oder". Es ist ein "und". Sie verwenden einen Hintergrundthread und einen Service.
Ein Service ist aus Sicht der Benutzeroberfläche "im Hintergrund", da er keine Benutzeroberfläche hat. Ein Service ist nicht automatisch "im Hintergrund" von einem Threading-Standpunkt, in dem onCreate()
, onDestroy()
, onStart()
und onBind()
alle im Hauptanwendungs-Thread aufgerufen werden, derselbe Thread, der von allen Aktivitäten geteilt wird dieser Anwendung. Alles, was lange läuft, wie ein Download, muss außerhalb des Hauptanwendungs-Threads erfolgen, z. B. mit AsyncTask
.
Wenn Ihre Downloads fortgesetzt werden müssen, selbst wenn die Aktivität, die sie ausgelöst hat, zerstört wird, müssen Sie einen Dienst verwenden, wobei der Dienst einen AsyncTask
- oder Hintergrundthread verwendet, um den Download abzuschließen. Noch besser ist es, ein IntentService
zu verwenden, das einen regulären Dienst mit einem Hintergrundthread kombiniert.
Ihre Frage befindet sich bereits in der Dokumentation . Überprüfen Sie die rechte Spalte.
Tags und Links android