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?
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?
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>
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.
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.