Mehrfacher Aufruf von startforeground?

8

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)

    
yeahman 30.06.2013, 19:34
quelle

2 Antworten

2

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%

Ссылка

    
Michael Powell 26.02.2015 00:02
quelle
0

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 .

    
ZeekHuge 02.11.2017 07:37
quelle

Tags und Links