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.

7voto

Nima Punkte 429

Xamarin C#-Version:

private bool isMyServiceRunning(System.Type cls)
{
    ActivityManager manager = (ActivityManager)GetSystemService(Context.ActivityService);

    foreach (var service in manager.GetRunningServices(int.MaxValue)) {
        if (service.Service.ClassName.Equals(Java.Lang.Class.FromType(cls).CanonicalName)) {
            return true;
        }
    }
    return false;
}

0 Stimmen

Sie benötigen den 'Context' für GetSystemService .

6voto

rahulrvp Punkte 1496

Für den hier beschriebenen Anwendungsfall können wir einfach die stopService() den Rückgabewert der Methode. Sie gibt zurück true wenn der angegebene Dienst existiert und er beendet wird. Andernfalls gibt es false . Sie können also den Dienst neu starten, wenn das Ergebnis false sonst ist sichergestellt, dass der aktuelle Dienst eingestellt wurde :) Es wäre besser, wenn Sie einen Blick auf ce .

3voto

Luis Moreno Punkte 425

Die Antwort von geekQ, aber in der Kotlin-Klasse. Danke geekQ

fun isMyServiceRunning(serviceClass : Class<*> ) : Boolean{
    var manager = getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager
    for (service in manager.getRunningServices(Integer.MAX_VALUE)) {
        if (serviceClass.name.equals(service.service.className)) {
            return true
        }
    }
    return false
}

Der Aufruf

isMyServiceRunning(NewService::class.java)

8 Stimmen

ActivityManager.getRunningServices ist seit Android O veraltet

3voto

LekeOpe Punkte 2245

Verwenden Sie in Ihrer Dienstunterklasse einen statischen Booleschen Wert, um den Zustand des Dienstes zu ermitteln, wie unten gezeigt.

MeinDienst.kt

class MyService : Service() {
    override fun onCreate() {
        super.onCreate()
        isServiceStarted = true
    }
    override fun onDestroy() {
        super.onDestroy()
        isServiceStarted = false
    }
    companion object {
        var isServiceStarted = false
    }
}

MainActivity.kt

class MainActivity : AppCompatActivity(){
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val serviceStarted = FileObserverService.isServiceStarted
        if (!serviceStarted) {
            val startFileObserverService = Intent(this, FileObserverService::class.java)
            ContextCompat.startForegroundService(this, startFileObserverService)
        }
    }
}

3voto

P A Gosai Punkte 453

Für Kotlin können Sie den folgenden Code verwenden.

fun isMyServiceRunning(calssObj: Class<SERVICE_CALL_NAME>): Boolean {
    val manager = requireActivity().getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager
    for (service in manager.getRunningServices(Integer.MAX_VALUE)) {
        if (calssObj.getName().equals(service.service.getClassName())) {
            return true
        }
    }
    return false
}

0 Stimmen

Dies ist eine großartige Lösung für das Schreiben von Tests, da Sie sie verwenden können, ohne Ihren Arbeitscode zu ändern.

0 Stimmen

Können wir diesen Flow<Boolean> zurückgeben lassen?

0 Stimmen

Warum verwenden equals für Kotlin hier?

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