Sie können es so machen. Eine Voraussetzung für diese Methode ist, dass Ihre Aktivität den Dienst binden muss.
Zuerst starten Sie den Dienst Vordergrund.
private Notification mNotification;
public void onCreate() {
...
startForeground(1, mNotification);
}
Dann binden und lösen Sie in Ihrer Aktivität den Dienst wie unten gezeigt. BIND_ADJUST_WITH_ACTIVITY
ist wichtig, um den Dienst für die Zeit aufrecht zu erhalten, in der er an sichtbare Aktivitäten gebunden ist.
public void onStart() {
...
Intent intent = new Intent(this, PlayerService.class);
bindService(intent, mConnection, BIND_ADJUST_WITH_ACTIVITY);
}
public void onStop() {
...
unbindService(mConnection);
}
Jetzt ist hier die letzte Vergangenheit. Sie beenden den Vordergrund, wenn mindestens ein Client mit dem Dienst verbunden ist, und Sie starten den Vordergrund, wenn der letzte Client die Verbindung trennt.
@Override
public void onRebind(Intent intent) {
stopForeground(true); // <- remove notification
}
@Override
public IBinder onBind(Intent intent) {
stopForeground(true); // <- remove notification
return mBinder;
}
@Override
public boolean onUnbind(Intent intent) {
startForeground(1, mNotification); // <- show notification again
return true; // <- important to trigger future onRebind()
}
Wenn eine Dienstbindung, müssen Sie Regeln von Android angewendet betrachten. Wenn Sie einen nicht gestarteten Dienst binden, wird der Dienst nicht automatisch gestartet, es sei denn, Sie geben BIND_AUTO_CREATE
zusätzlich zum Flag BIND_ADJUST_WITH_ACTIVITY
an.
Wenn der Dienst mit automatischem Erstellungs-Flag gestartet wurde und der letzte Client die Verbindung aufhebt, wird der Dienst automatisch beendet. Wenn Sie den Dienst am Laufen halten möchten, müssen Sie ihn mit der Methode startService()
starten. Grundsätzlich sieht Ihr Code wie der folgende aus.
Intent intent = new Intent(this, PlayerService.class);
startService(intent);
bindService(intent, mConnection, BIND_ADJUST_WITH_ACTIVITY);
startService()
Aufruf für bereits begonnen Dienst hat keine Wirkung auf sie, da wir nicht onCommand()
Methode außer Kraft setzen.
scheint zu tun, was ich will ... nur ein Nachteil, ich muss den Dienst starten, bevor ich es tatsächlich brauche ... – prom85
Just beendete die Implementierung. Es sollte gut funktionieren. Die Antwort wurde aktualisiert. –
Ich habe es vorher versucht, hat nicht perfekt funktioniert ... Ich werde die Änderungen überprüfen und es nochmal anschauen ...Übrigens würde es nicht funktionieren, den Dienst nicht zu binden und eine Absicht in den Aktivitäten onPause/onResume zu senden, um den Vordergrundzustand des Dienstes zu ändern, weil der Dienst möglicherweise getötet wird, während die Aktivität aktiv ist? Kann das wirklich passieren? Oder würde das auch funktionieren? – prom85