Ich habe einen Dienst (EmailService) erstellt, der E-Mails sendet ... jedes Mal, wenn ich eine E-Mail mit meiner App senden möchte, startet er den Dienst und übergibt die ID der E-Mail über eine Absicht ...
Ich verwende startforeground(id_of_email, mynotifcation);
, um zu verhindern, dass es gelöscht wird, und um dem Benutzer eine Benachrichtigung über den Status der sendenden E-Mail zu senden.
Ich muss dem Benutzer erlauben, zu diesem Zeitpunkt mehrere E-Mails zu senden. Wenn der Benutzer also eine weitere E-Mail senden muss, ruft er startservice
mit einer neuen Absicht (andere ID der E-Mail) erneut an ... co_de% wieder.
Das Problem ist, dass der neue Aufruf von startforeground(new_id_of_email, mynotifcation);
die vorherige Benachrichtigung überschreibt ... (so verliert der Benutzer die vorherige Benachrichtigung und weiß nicht, was mit seiner vorherigen E-Mail passiert)
Wenn Sie die Quelle Service.startForeground()
betrachten, werden mehrere Aufrufe von startForeground nur die aktuell angezeigte Benachrichtigung ersetzen. Tatsächlich ist der Aufruf von startForeground identisch mit stopForeground()
, nur mit removeNotification
set wird immer auf true gesetzt.
Wenn Sie möchten, dass Ihr Dienst für jede laufende E-Mail eine Benachrichtigung anzeigt, müssen Sie jede Benachrichtigung einzeln vom Dienst verwalten.
%Vor% Man kann auch STOP_FOREGROUND_DETACH
flag verwenden.
Zitat aus der Dokumentation :
STOP_FOREGROUND_DETACH
wurde in der API-Ebene 24 int hinzugefügt STOP_FOREGROUND_DETACH Flag für stopForeground (int): falls festgelegt, die zuvor bereitgestellte Benachrichtigung startForeground (int, Notification) wird vom Dienst getrennt. Nur sinnvoll wenn STOP_FOREGROUND_REMOVE nicht gesetzt ist - in diesem In diesem Fall wird die Benachrichtigung weiterhin angezeigt, aber vollständig getrennt aus dem Service und so nicht mehr verändert, außer durch direkte Anrufe an den Benachrichtigungsmanager.
Konstanter Wert: 2 (0x00000002)
Vor einem erneuten Aufruf von startForeground()
können Sie also stopForeground(STOP_FOREGROUND_DETACH);
aufrufen. Dadurch wird die Benachrichtigung getrennt und wiederholte Aufrufe an startForeground()
werden nicht geändert, wenn Sie eine andere Benachrichtigungs-ID verwenden.
Außerdem stellt die "gelöste" Benachrichtigung jetzt nicht den "fortlaufenden Dienst" dar und kann daher vom Benutzer mit einem Swipe entfernt werden.
BONUS:
Aus Gründen der Kompatibilität kann ServiceCompat
class und dessen static
method ServiceCompat.stopForeground(MyService.this, STOP_FOREGROUND_DETACH)
verwendet werden, wie dokumentiert ist hier .