1064 Stimmen

Wie prüft man, ob ein Dienst auf Android läuft?

Wie kann ich überprüfen, ob ein Hintergrunddienst läuft?

Ich möchte eine Android-Aktivität, die den Status des Dienstes umschaltet - ich kann ihn einschalten, wenn er ausgeschaltet ist, und ausschalten, wenn er eingeschaltet ist.

2 Stimmen

Überprüfen Sie dieser deutsche Leitfaden .

23 Stimmen

Die richtige Antwort steht unten und nicht die markierte: stackoverflow.com/a/5921190/2369122

2 Stimmen

@toidiu Wenn das nicht schon nerfed worden ist wie getRunningTasks() dann wird es wahrscheinlich so sein.

9voto

Zunächst einmal sollten Sie den Dienst nicht über die ActivityManager . (Erörtert aquí )

Dienste können eigenständig laufen, an eine Aktivität gebunden sein oder beides. Der Weg, um in einer Activity zu überprüfen, ob Ihr Dienst läuft oder nicht, besteht darin, eine Schnittstelle zu erstellen (die Binder erweitert), in der Sie Methoden deklarieren, die sowohl die Activity y el Service verstehen. Sie können dies tun, indem Sie Ihre eigene Schnittstelle erstellen, in der Sie z.B. deklarieren " isServiceRunning() ". Sie können dann Ihre Activity an Ihren Service binden, die Methode isServiceRunning() ausführen, der Service prüft selbst, ob er läuft oder nicht und gibt einen booleschen Wert an Ihre Activity zurück.

Sie können diese Methode auch verwenden, um Ihren Dienst anzuhalten oder auf andere Weise mit ihm zu interagieren.

4 Stimmen

Diese Diskussion fand am 26.12.07 statt. Entweder ist das der Juli dieses Jahres (also in der Zukunft), oder das war, bevor Android überhaupt veröffentlicht wurde. In jedem Fall traue ich dem Ganzen nicht.

0 Stimmen

Diese Diskussion ist vom 26. Dezember 2007. Es geht um eine Vorabversion, glaube ich ( developer.Android.com/sdk/OLD_RELEASENOTES.html#m3-rc37a ), das am 14. Dezember 2007 veröffentlicht wurde.

9voto

Paul Punkte 506

Ich möchte nur eine Anmerkung zu der Antwort von @Snicolas hinzufügen. Die folgenden Schritte können verwendet werden, um den Stoppdienst mit/ohne Aufruf zu überprüfen onDestroy() .

  1. onDestroy() genannt: Gehen Sie zu Einstellungen -> Anwendung -> Laufende Dienste -> Wählen Sie Ihren Dienst aus und stoppen Sie ihn.

  2. onDestroy() nicht angerufen: Gehen Sie zu Einstellungen -> Anwendung -> Anwendungen verwalten -> Wählen Sie die Anwendung aus, in der Ihr Dienst ausgeführt wird, und erzwingen Sie das Anhalten. Da Ihre Anwendung hier gestoppt wird, werden auch die Dienstinstanzen gestoppt.

Abschließend möchte ich erwähnen, dass der dort erwähnte Ansatz, eine statische Variable in einer Singleton-Klasse zu verwenden, bei mir funktioniert.

0 Stimmen

Der Dienst könnte auf verschiedenen Prozessen beruhen, was zu berücksichtigen ist

9voto

Snicolas Punkte 37333

Auch hier gibt es eine Alternative, die man sauberer finden könnte, wenn man anhängige Intents verwendet (zum Beispiel mit dem AlarmManager :

public static boolean isRunning(Class<? extends Service> serviceClass) {
    final Intent intent = new Intent(context, serviceClass);
    return (PendingIntent.getService(context, CODE, intent, PendingIntent.FLAG_NO_CREATE) != null);
}

Wo CODE ist eine Konstante, die Sie privat in Ihrer Klasse definieren, um die ausstehenden Intents zu identifizieren, die mit Ihrem Dienst verbunden sind.

1 Stimmen

Kombinieren oder aktualisieren Sie Ihre vorherige Antwort. Bitte veröffentlichen Sie nicht mehr als eine Antwort pro Beitrag.

0 Stimmen

Kann diese Antwort noch erweitert werden, d. h. wie wird der Wert für CODE mit der Dienstleistung in Verbindung gebracht?

0 Stimmen

Wo findet man den Kontext?

8voto

Kevin Parker Punkte 16483

onDestroy wird nicht immer im Dienst aufgerufen, daher ist dies nutzlos!

Zum Beispiel: Führen Sie die Anwendung einfach noch einmal mit einer Änderung von Eclipse aus. Die Anwendung wird mit SIG zwangsweise beendet: 9.

8voto

TheRealChx101 Punkte 1363

Im Folgenden finden Sie einen eleganten Hack, der alle Ifs . Dies gilt nur für lokale Dienste.

    public final class AService extends Service {

        private static AService mInstance = null;

        public static boolean isServiceCreated() {
            try {
                // If instance was not cleared but the service was destroyed an Exception will be thrown
                return mInstance != null && mInstance.ping();
            } catch (NullPointerException e) {
                // destroyed/not-started
                return false;
            }
        }

        /**
         * Simply returns true. If the service is still active, this method will be accessible.
         * @return
         */
        private boolean ping() {
            return true;
        }

        @Override
        public void onCreate() {
            mInstance = this;
        }

        @Override
        public void onDestroy() {
            mInstance = null;
        }
    }

Und dann später:

    if(AService.isServiceCreated()){
        ...
    }else{
        startService(...);
    }

0 Stimmen

Das einzige Problem dabei ist, wenn der Dienst ein Sticky-Dienst ist und sich selbst neu startet. Der Aufruf von isServiceCreated() wird nach dem Neustart des Dienstes false zurückgeben, da mInstance dann null ist.

2 Stimmen

Würde onCreate dann nicht aufgerufen werden, wenn der Dienst sich selbst neu startet?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X