2013-06-30 13 views
8

ho creato un servizio (EmailService) che invia email ... ogni volta che ho bisogno di inviare un'e-mail con la mia app, avvia il servizio e passa l'id dell'email tramite un intento ...chiamata multipla a startforeground?

i Sto usando startforeground(id_of_email, mynotifcation); per evitare che venga ucciso e per mostrare all'utente una notifica dello stato dell'invio dell'e-mail.

ho bisogno di consentire all'utente di inviare più e-mail al momento, quindi quando l'utente deve inviare un'altra e-mail, chiama di nuovo startservice con un nuovo intento (diverso id di e-mail) ... quindi chiama startforeground(new_id_of_email, mynotifcation); di nuovo .

il problema è che la nuova chiamata alla startforeground sovrascrive la precedente notifica ... (quindi l'utente perde la precedente notifica e non sa che cosa sta succedendo con la sua e-mail precedente)

+0

Non è meglio mettere in coda le attività nel database o qualcosa del genere? in questo modo, una volta che il primo è stato fatto, il servizio dovrebbe aggiornarlo per farlo o cancellarlo e verificare se c'è qualcos'altro da fare. Forse un messaggio per continuare ad alimentare il servizio con più compiti – eduyayo

risposta

2

Guardando il Service.startForeground() fonte mostra che più chiamate a startForeground sostituiranno solo la notifica attualmente visualizzata. In effetti, la chiamata a startForeground è identica a stopForeground(), solo con removeNotification set impostato sempre su true.

Se si desidera che il servizio visualizzi una notifica per ciascuna e-mail in corso, sarà necessario gestire ciascuna notifica singolarmente dal servizio.

public final void startForeground(int id, Notification notification) { 
    try { 
     mActivityManager.setServiceForeground(
       new ComponentName(this, mClassName), mToken, id, 
       notification, true); 
    } catch (RemoteException ex) { 
    } 
} 

public final void stopForeground(boolean removeNotification) { 
    try { 
     mActivityManager.setServiceForeground(
       new ComponentName(this, mClassName), mToken, 0, 
       null, removeNotification); 
    } catch (RemoteException ex) { 
    } 
} 

http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.3_r1/android/app/Service.java#Service.startForeground%28int%2Candroid.app.Notification%29

0

Si può anche utilizzare STOP_FOREGROUND_DETACH bandiera.

Citando dal documentation:

STOP_FOREGROUND_DETACH

aggiunto a livello di API 24 int STOP_FOREGROUND_DETACH Flag per stopForeground (int): se impostata, la notifica precedentemente fornite al startForeground (int, Notification) sarà staccato dal servizio. Ha senso solo quando STOP_FOREGROUND_REMOVE non è impostato - in questo caso , la notifica rimarrà mostrata, ma verrà completamente staccato dal servizio e quindi non sarà più modificato se non attraverso le chiamate dirette al gestore delle notifiche.

Costante Valore: 2 (0x00000002)

Quindi, prima di una chiamata ripetuta per startForeground() è possibile chiamare stopForeground(STOP_FOREGROUND_DETACH);. Ciò scollegherà la notifica e le chiamate ripetute a startForeground() non modificheranno, se si utilizza un id di notifica diverso.

Inoltre, la notifica "staccato", ora, non rappresenta il "servizio in corso" e quindi può essere rimosso dall'utente con un passaggio.

BONUS:

Per compatibilità, si può usare ServiceCompat classe e il metodo staticServiceCompat.stopForeground(MyService.this, STOP_FOREGROUND_DETACH) come documentato here.

Problemi correlati