2017-06-03 4 views
0

Kann mir jemand helfen, Android Service oder IntentService korrekt zu verwenden? Die Dokumentation scheint sich hier zu widersprechen:So verwenden Sie Android Service oder ServiceIntent

Caution: A service runs in the same process as the application in which it is 
declared and in the main thread of that application by default. If your service 
performs intensive or blocking operations while the user interacts with an 
activity from the same application, the service slows down activity performance. 
To avoid impacting application performance, start a new thread inside the service. 

und hier

public class HelloIntentService extends IntentService { 

    /** 
    * A constructor is required, and must call the super IntentService(String) 
    * constructor with a name for the worker thread. 
    */ 
    public HelloIntentService() { 
     super("HelloIntentService"); 
    } 

    /** 
    * The IntentService calls this method from the default worker thread with 
    * the intent that started the service. When this method returns, IntentService 
    * stops the service, as appropriate. 
    */ 
    @Override 
    protected void onHandleIntent(Intent intent) { 
     // Normally we would do some work here, like download a file. 
     // For our sample, we just sleep for 5 seconds. 
     try { 
      Thread.sleep(5000); 
     } catch (InterruptedException e) { 
      // Restore interrupt status. 
      Thread.currentThread().interrupt(); 
     } 
    } 
} 

der ganze Zweck des Dienstes gegeben oder ServiceIntent ist lang laufenden Aufträge im Hintergrund laufen zu lassen, ohne die Benutzeroberfläche zu beeinflussen, warum dann funktioniert das Beispielcode tut genau das, was die Vorsicht angezeigt hat, was Sie nicht tun sollten - und ich nehme an, dass ein Aufruf von Thread.sleep() den Hauptthread blockiert.

Bin ich im folgenden Verständnis korrigieren:

  1. Der Service selbst läuft noch auf dem Hauptanwendungsthread hat aber keine UI-Komponente (Aktivität) und läuft weiter, auch wenn die Anwendung nicht vom Benutzer verwendet wird, eine Aktivität, anders als die nicht
    1. Jede lange laufende Arbeit Hintergrund muss noch einen separaten Thread erstellen die Hauptanwendung zu vermeiden Gewinde blockiert
    2. AsyncTask mit einer Aktivität verknüpft ist vermutlich bei dem der Stop wird läuft, wenn die Anwendung nicht mehr läuft r die aktive Anwendung (d.h. wenn der Benutzer zu einer anderen Anwendung wechselt), würde man Service oder ServiceIntent verwenden, wenn die Aufgabe weiter ausgeführt werden soll.
    3. IntentService führt die Aufgabe in einem separaten Thread zum Hauptthread aus, so dass Sie sich keine Sorgen darüber machen müssen, den Hauptthread mit langen Aufgaben zu blockieren oder Thread.sleep() aufzurufen.

Habe ich etwas mit der Beschreibung von Android-Service oder ServiceIntents falsch verstanden?

Antwort

0

Ihr erster Kommentar stammt aus der Dokumentation über services allgemein.

Es gibt nichts in Android namens ServiceIntent. Ihr Code-Snippet ist ein IntentService.

In Java haben wir Klassen und Vererbung. Service ist die Basisklasse, von der alle Dienste erben. IntentService erweitert Service.

Wenn Sie startService() nennen, zu einer Klasse von Ihnen zeigen, die direkt von Service erbt, müssen Sie sich einen Hintergrund-Thread, implementieren, wie Service wird, dass nicht für Sie tun.

Wenn Sie startService() jedoch nennen, zu einer Klasse von Ihnen zeigen, die von IntentService erbt, Sie dann wird einen Hintergrund-Thread für Sie automatisch von IntentService erstellt bekommen. Dies ist Code hinzugefügt von IntentService, darüber hinaus, was Service bietet.

und ich nehme an, ein Aufruf von Thread.sleep() wird dazu führen, dass der Haupt-Thread blockiert.

Nein, weil onHandleIntent() auf dem IntentService -supplied Hintergrund Thread aufgerufen wird.

Der Service selbst läuft noch auf dem Hauptanwendungsthread

Nr In Java-Objekte laufen nicht auf Threads. Methoden werden auf Threads ausgeführt.

auf einem Hintergrund-Thread ausgeführt werden Jede Arbeit, lange Lauf Hintergrund muss noch einen separaten Thread zu vermeiden, erstellen Sie das Hauptanwendungsthread

Jede langlaufende Hintergrundarbeit muss zu blockieren. Ob das ein Thread ist, den Sie erstellen (z. B. in einer direkten Unterklasse von Service) oder ob es sich um einen Thread handelt, der Ihnen bereitgestellt wird (z. B. in einer direkten Unterklasse von IntentService), variiert.

AsyncTask ist mit einer Aktivität verbunden, die ausgeführt wird aufhören vermutlich, wenn die Anwendung nicht mehr die aktive Anwendung ist

Die primäre Rolle eines Dienstes ist Android zu sagen, dass wir Hintergrund Arbeit tun, dass sollte für eine Weile fortgesetzt werden, auch wenn die Benutzeroberfläche der App in den Hintergrund verschoben wird. Das liegt daran, dass Android Ihren Prozess schließlich beendet, um System-RAM für andere Anwendungen freizugeben.

Die Verwendung eines Dienstes wird dazu führen, dass Ihr Prozess für eine Weile länger erhalten bleibt. Eine AsyncTask, oder eine bare Thread, tut dies nicht. Wenn die Benutzeroberfläche der App in den Hintergrund verschoben wird, wird Ihr Prozess nicht sofort beendet , aber es kann beendet werden bald, und wenn Sie größere Sicherheit, dass Ihre Arbeit erledigt werden soll, verwenden Sie einen Dienst, um diese Arbeit zu verwalten.

+0

Awesome - danke, was ich Bestätigung benötigt - Sie sollten helfen, die Dokumentation zu schreiben. –

+0

@DuncanGrenewald: Entschuldigung. Du musst dich mit [einem Buch] begnügen (https://commonsware.com/Android). :-) – CommonsWare

Verwandte Themen