gebundener Dienst versus gestarteter Dienst auf Android und wie man beides macht

9

Ich stelle eine ärgerliche Frage, die (teilweise, meiner Meinung nach) adressiert wurde: hier und hier . Nehmen wir an, wir möchten in vielen Beispielen eine Musikanwendung erstellen, die beispielsweise eine einzelne Aktivität und einen Dienst verwendet. Wir möchten, dass der Service beibehalten wird, wenn die Aktivität gestoppt oder zerstört wird. Diese Art von Lebenszyklus schlägt einen gestarteten Dienst vor:

  

Ein Dienst wird "gestartet", wenn eine Anwendungskomponente (wie z. B. ein   Aktivität) startet es durch Aufruf von startService (). Einmal gestartet, ein Service   kann unbegrenzt im Hintergrund laufen, auch wenn die Komponente   gestartet wurde es zerstört

Ok, aber wir wollen auch mit dem Service kommunizieren können, also brauchen wir eine Service-Bindung. Kein Problem, wir haben sowohl einen gebundenen als auch einen gestarteten Service, wie diese Antwort suggeriert :

So weit, so gut, aber ein Problem ergibt sich aus der Tatsache, dass wenn die Aktivität beginnt, wir nicht wissen, ob der Dienst in der Nähe ist oder nicht. Es wurde möglicherweise begonnen oder es ist möglicherweise nicht gewesen. Die Antwort könnte etwas wie sein:

  • Versuchen Sie beim Start, sich an den Dienst zu binden (verwenden Sie bindService () ohne BIND_AUTO_CREATE Flagge)
  • Wenn dies fehlschlägt, starten Sie den Dienst mit startService() und binden Sie dann daran.

Diese Idee basiert auf einem bestimmten Lesen der Dokumente für bindService() :

  

Verbinden Sie sich mit einem Anwendungsdienst und erstellen Sie ihn bei Bedarf.

Wenn Null-Flag bedeutet "Service wird nicht wirklich benötigt" als wir sind OK. Also versuchen wir etwas mit dem folgenden Code:

%Vor%

Und was wir bekommen ist eine erfolgreiche Bindung jedes Mal: ​​

%Vor%

Die globale Frage lautet: "Bin ich falsch verstanden, gebundene oder begonnene Dienste und wie verwende ich sie?" Speziellere Fragen sind:

  • Ist es das richtige Verständnis der Dokumente zu denken, dass das Null-Flag, das an bindService() übergeben wurde, bedeutet "Starten Sie den Dienst nicht"? Wenn nicht, gibt es keine Möglichkeit, bindService() aufzurufen, ohne den Dienst zu starten?
  • Warum gibt bindService() true zurück, auch wenn der Dienst nicht ausgeführt wird? In diesem Fall scheint der Dienst nicht gestartet worden zu sein, basierend auf Log calls.
  • Wenn der vorhergehende Punkt das richtige / erwartete Verhalten von bindService() ist, gibt es eine Problemumgehung (d. h. irgendwie sicherstellen, dass startService nur aufgerufen wird, wenn der Service nicht läuft?)

P.S. Ich habe von dem Problem in meinem eigenen Code weitergemacht: Ich gebe startService() Aufrufe unabhängig aus, da wiederholte startService() einfach ignoriert werden. Trotzdem würde ich die Probleme gerne noch besser verstehen.

    
angelatlarge 23.04.2013, 05:58
quelle

1 Antwort

2
___ tag123android ___ Android ist das mobile Betriebssystem von Google, das zum Programmieren oder Entwickeln von digitalen Geräten (Smartphones, Tablets, Automobile, Fernseher, Wear, Glass, IoT) verwendet wird. Verwenden Sie für Themen rund um Android Android-spezifische Tags wie android-intent, nicht intent, android-activity, nicht activity, android-adapter, nicht adapter usw. Bei anderen Fragen als der Entwicklung oder Programmierung, aber im Zusammenhang mit Android Framework, verwenden Sie Der Link: https://android.stackexchange.com. ___ qstnhdr ___ gebundener Dienst versus gestarteter Dienst auf Android und wie man beides macht ___ tag123service ___ Ein Dienst ist eine ausführbare Datei mit langer Laufzeit, die bestimmte Funktionen ausführt und keine Benutzereingriffe erfordert. ___ tag123binding ___ Dieses Tag bedeutet verschiedene Dinge in verschiedenen Kontexten; Erwägen Sie, stattdessen oder zusätzlich zweideutige Tags zu verwenden. Häufige Bedeutungen sind: Dependency-Injection und Datenbindung an Objekte und Bindungen zwischen Komponenten einer Anwendung. ___ qstntxt ___

Ich stelle eine ärgerliche Frage, die (teilweise, meiner Meinung nach) adressiert wurde: hier und hier . Nehmen wir an, wir möchten in vielen Beispielen eine Musikanwendung erstellen, die beispielsweise eine einzelne Aktivität und einen Dienst verwendet. Wir möchten, dass der Service beibehalten wird, wenn die Aktivität gestoppt oder zerstört wird. Diese Art von Lebenszyklus schlägt einen gestarteten Dienst vor:

  

Ein Dienst wird "gestartet", wenn eine Anwendungskomponente (wie z. B. ein   Aktivität) startet es durch Aufruf von startService (). Einmal gestartet, ein Service   kann unbegrenzt im Hintergrund laufen, auch wenn die Komponente   gestartet wurde es zerstört

Ok, aber wir wollen auch mit dem Service kommunizieren können, also brauchen wir eine Service-Bindung. Kein Problem, wir haben sowohl einen gebundenen als auch einen gestarteten Service, wie diese Antwort suggeriert :

So weit, so gut, aber ein Problem ergibt sich aus der Tatsache, dass wenn die Aktivität beginnt, wir nicht wissen, ob der Dienst in der Nähe ist oder nicht. Es wurde möglicherweise begonnen oder es ist möglicherweise nicht gewesen. Die Antwort könnte etwas wie sein:

  • Versuchen Sie beim Start, sich an den Dienst zu binden (verwenden Sie bindService () ohne BIND_AUTO_CREATE Flagge)
  • Wenn dies fehlschlägt, starten Sie den Dienst mit %code% und binden Sie dann daran.

Diese Idee basiert auf einem bestimmten Lesen der Dokumente für %code% :

  

Verbinden Sie sich mit einem Anwendungsdienst und erstellen Sie ihn bei Bedarf.

Wenn Null-Flag bedeutet "Service wird nicht wirklich benötigt" als wir sind OK. Also versuchen wir etwas mit dem folgenden Code:

%Vor%

Und was wir bekommen ist eine erfolgreiche Bindung jedes Mal: ​​

%Vor%

Die globale Frage lautet: "Bin ich falsch verstanden, gebundene oder begonnene Dienste und wie verwende ich sie?" Speziellere Fragen sind:

  • Ist es das richtige Verständnis der Dokumente zu denken, dass das Null-Flag, das an %code% übergeben wurde, bedeutet "Starten Sie den Dienst nicht"? Wenn nicht, gibt es keine Möglichkeit, %code% aufzurufen, ohne den Dienst zu starten?
  • Warum gibt %code% %code% zurück, auch wenn der Dienst nicht ausgeführt wird? In diesem Fall scheint der Dienst nicht gestartet worden zu sein, basierend auf %code% calls.
  • Wenn der vorhergehende Punkt das richtige / erwartete Verhalten von %code% ist, gibt es eine Problemumgehung (d. h. irgendwie sicherstellen, dass %code% nur aufgerufen wird, wenn der Service nicht läuft?)

P.S. Ich habe von dem Problem in meinem eigenen Code weitergemacht: Ich gebe %code% Aufrufe unabhängig aus, da wiederholte %code% einfach ignoriert werden. Trotzdem würde ich die Probleme gerne noch besser verstehen.

    
___
Hoan Nguyen 23.04.2013 06:28
quelle

Tags und Links