47 Stimmen

Wie kann ich den Dienst selbständig anhalten?

Ich starte einen Dienst in einer Aktivität und möchte dann, dass der Dienst nach einer Weile von selbst aufhört.

Ich habe stopSelf() im Dienst aufgerufen, aber es funktioniert nicht.

Wie lässt sich der Dienst selbst anhalten?

2voto

Vignesh VRT Punkte 391

Damit Ihr Dienst sich selbst anhalten kann, erstellen Sie eine BroadcastReceiver Klasse. In Ihrem Dienst rufen Sie Ihren Empfänger so auf

Im Dienst

sendBroadcast(new Intent("MyReceiver"));

Im Rundfunkempfänger

 public class MyReceiver extends BroadcastReceiver {

     @Override
     public void onReceive(Context context, Intent intent) {

         context.stopService(new Intent(context,NotificationService.class));
     }
 }

Manifest-Datei

    <receiver
        android:name="MyReceiver"
        android:enabled="true"
        android:exported="true">
        <intent-filter>
            <action android:name="MyReceiver"/>
        </intent-filter>
    </receiver>

2voto

Ich weiß, dies ist eine alte Frage, aber in meinem Fall (schwebendes Fenster als Dienst) musste ich zuerst die Ansicht entfernen und dann stopSelf() .

windowManager.removeView(floatingView);
stopSelf();

1voto

Arunmani Punkte 109

Verwenden Sie stopSelf(), um einen Dienst von sich aus zu stoppen.

0voto

Simon Punkte 3150

Ich bin gerade auf das gleiche Problem gestoßen. In meinem Fall habe ich einen Singleton-Dienstmanager, den ich zur Kommunikation mit dem Dienst verwende. In dem Manager wird der Dienst wie folgt gestartet:

context.bindService(new Intent(context, MyService.class), serviceConnection, Context.BIND_AUTO_CREATE); 

Durch das Entfernen von Context.BIND_AUTO_CREATE, wie von Alik Elzin vorgeschlagen, konnte ich den Dienst mit this.stopSelf() beenden und dabei onDestroy() aufrufen lassen. Das Problem ist, dass ich danach nicht in der Lage war, den Dienst über den Manager mit dem obigen Befehl neu zu starten.

Schließlich habe ich dieses Problem mit einem Rückruf des Dienstes behoben, der den Manager auffordert, den Dienst zu beenden. Auf diese Weise ist der Manager immer verantwortlich, wenn es darum geht, den Dienst zu starten/stoppen, und alles scheint gut zu funktionieren. Ich weiß nicht, ob es irgendwelche Gegenanzeigen gibt, wenn man es so macht.

Der Code ist wirklich einfach. Erstellen Sie einen Callback im Dienst und setzen Sie ihn im Manager wie folgt in Ihrer Verbindungsklasse:

private ServiceConnection mServiceConnection = new ServiceConnection() {
    public void onServiceConnected(ComponentName className, IBinder service) {
        myService = ((MyService.LocalBinder)service).getService();

        myService.setCallback(new MyService.MyServiceCallback() {
            @Override
            public void onStop() {
                stopService();
            }
        });
    }

    public void onServiceDisconnected(ComponentName className) {
        myService = null;
    }
};

und beenden Sie den Dienst:

public void stopService()
{
    if(mServiceConnection != null){
        try {
            mContext.unbindService(mServiceConnection);
        } catch (Exception e) {}
    }

     mContext.stopService(new Intent(mContext, BleDiscoveryService.class));
}

Rufen Sie im Dienst einfach myCallback.onStop() auf, wenn Sie ihn anhalten müssen.

0voto

yuliskov Punkte 1312

Ein weiterer, hier nicht erwähnter Hack ist das Auslösen einer Ausnahme wie NPE. Eines Tages musste ich InputMethodService stoppen und dieser Hack war nützlich.

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