Android onCreate oder onStartCommand zum Starten des Dienstes

105

Normalerweise implementiere ich beim Erstellen eines Android-Dienstes die onCreateMethode, aber in meinem letzten Projekt funktioniert dies nicht. Ich habe versucht zu implementieren onStartCommand, und das scheint zu funktionieren.

Die Frage ist: Wenn ich einen Dienst implementieren muss, welche Methode ist erforderlich? Welche Methoden muss ich implementieren? onCreate, onStartCommandOder beides? Und welche Rolle spielt jeder?

GVillani82
quelle
onCreatewird immer genannt
IgorGanapolsky

Antworten:

189

onCreate()wird aufgerufen, wenn das ServiceObjekt instanziiert wird (dh wenn der Dienst erstellt wird ). Sie sollten in dieser Methode Dinge tun, die Sie nur einmal tun müssen (z. B. einige Variablen initialisieren usw.). onCreate()wird immer nur einmal pro instanziiertem Objekt aufgerufen .

Sie müssen nur implementieren, onCreate()wenn Sie etwas nur einmal initialisieren möchten / müssen .

onStartCommand()wird jedes Mal aufgerufen, wenn ein Client den Dienst mit startet startService(Intent intent). Dies bedeutet, dass onStartCommand()mehrfach aufgerufen werden kann. Sie sollten die Dinge in dieser Methode tun, die jedes Mal benötigt werden, wenn ein Client etwas von Ihrem Service anfordert. Dies hängt stark davon ab, was Ihr Service tut und wie er mit den Kunden kommuniziert (und umgekehrt).

Wenn Sie nicht implementieren onStartCommand(), können Sie keine Informationen von dem IntentClient abrufen, an den der Client übergibt, onStartCommand()und Ihr Dienst kann möglicherweise keine nützliche Arbeit leisten.

David Wasser
quelle
6
Können in einer Anwendung zwei Instanzen desselben Dienstes vorhanden sein?
Jacktrades
1
@jacktrades Theoretisch und gemäß der Dokumentation: Nein. Es scheint jedoch einen Fehler in Android zu geben, bei dem unter bestimmten Umständen mehrere Instanzen eines Dienstes erstellt werden. Wie gesagt, dies ist jedoch ein Fehler, und wir konnten ihn nicht nach Belieben zuverlässig reproduzieren. Warum fragst du?
David Wasser
3
@Mr_and_Mrs_D Soweit ich weiß, wurden keine offiziellen Fehler gemeldet. Es gibt jedoch mehrere Berichte darüber, und ich habe eine Anwendung, in der ich weiß, dass dies geschieht. Ich konnte das Problem nicht auf etwas Kleines und Wiederholbares reduzieren, daher habe ich selbst keinen Fehler gemeldet. In der Dokumentation wird nicht ausdrücklich angegeben, dass Dienste Singletons sind, aber es ist sehr klar, dass dies beabsichtigt ist. Schauen Sie sich die Dokumente für 'startService ()' an: Gibt eindeutig an, dass der Dienst
David Wasser,
6
@Diffy Wenn Sie aufrufen startService()und der Dienst nicht ausgeführt wird, erstellt Android eine Instanz der Dienstklasse (dies ist ein Dienstobjekt) und ruft onCreate()dieses Objekt dann auf. Es wird dann onStartCommand()dieses Objekt aufrufen . Wenn Sie einige Zeit später erneut anrufen startService()und der Dienst noch ausgeführt wird, erstellt Android kein neues Dienstobjekt. Stattdessen wird nur onStartCommand()das vorhandene Serviceobjekt aufgerufen . Ist das klar?
David Wasser
1
Ich liebe dich! (y) arbeitete wie Magie (y) sehr einfache und gute Erklärung
Hilton Khadka
11

Der Dienst verhält sich wie die Aktivität. Was auch immer Sie associateeinmal mit einem Dienst tun möchten, wird onCreatewie eine Initialisierung ausgeführt

und wann immer das servicemit startService aufgerufen wird . onStartCommandwird angerufen werden. und Sie können jede auszuführende Aktion übergeben. Wie bei einem Musikplayer können Sie spielen, pausieren und die Aktion beenden

Und Sie tun dies, operation in serviceindem Sie eine Aktion senden und weiterleitenonStartCommand

onCreate arbeite wie ein Konstruktor.

Kurz bearbeiten

onCreate()Anrufe nur zum ersten Mal, wenn Sie einen starten, Servicewährend onStartCommand()Anrufe jedes Mal, wenn Sie den startServiceerneut anrufen . Damit können Sie eine Aktion wie Abspielen, Stoppen, Musik anhalten einstellen.

public void onStartCommand()
{
     if(intent.getAction.equals("any.play")
     {
        //play song
     }
     else if(intent.getAction.equals("any.stop")
     {}
}
Zar E Ahmer
quelle
Wenn ich also einen Dienst mit startService (intent) aufrufe, wird onCreate () nicht aufgerufen? Ich habe Zweifel, was ein 'Service-Objekt' ist, weil ich immer einen Service von startSevice (Absicht) gestartet habe.
Diffy
Haben Sie das Serviceobjekt ordnungsgemäß instanziiert oder haben Sie den Service wahrscheinlich nicht in Ihrem Manifest
Zar E Ahmer,
Dienst starten wie startService (new Intent (this, ServiceName.class));
Zar E Ahmer
Aber heißt diese Methode Instanziieren des Dienstes? Wo ist dann das Service-Objekt?
Diffy
Es ist eine Möglichkeit, Aktivität und Dienst mit Absicht aufzurufen. Dies ist für das Öffnen von Aktivität und Dienst in Android verantwortlich. Was Sie mit dem Objekt des Dienstes tun möchten, können Sie auch mit Absicht tun. Ich meine, Daten an Service zu übergeben
Zar E Ahmer