6

Ho cercato per ore per rimuovere una notifica persistente set di un servizio utilizzando:NotificationManager.cancel() non funziona per me

startForeground(1337, notification); 

Il codice che sto usando per annullarla:

NotificationManager nManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); 
nManager.cancel(1337); // cancel existing service notification, doesn't take effect 
nManager.cancelAll(); //surpluous, but also doesn't take effect 

Cosa mi manca qui? Sono sconcertato.

Per chiarire perché sto facendo questo: il servizio inizia con una notifica persistente predefinita. Quando viene eseguita la mia app, è necessario sostituire questa notifica con un'altra. L'utilizzo di notify() sulla notifica esistente funziona perfettamente, tuttavia, ho bisogno che mostri anche il testo del ticker per la nuova notifica. Questo è il motivo per cui ho deciso di rimuovere la notifica esistente (usando il codice sopra), crearne una nuova, e poi chiamo di nuovo startForeground() e di passare la nuova notifica ad esso, quindi il mio servizio persiste.

+0

Stai tentando di rimuovere una notifica che è stata avviata da un'altra applicazione? – matt5784

+0

no, è la stessa applicazione – slinden77

risposta

11

Il problema è che si sta emettendo la notifica in modo indiretto usando startForeground(). Non è possibile annullare la notifica per lo stesso motivo per cui il sistema insiste su di te che fornisce una notifica all'avvio di un servizio in primo piano. Finché il servizio in primo piano è in esecuzione, tale notifica sarà presente.

Nella maggior parte dei casi, i servizi in realtà non dovrebbero essere in primo piano. Se è possibile utilizzare una normale priorità per il servizio, è possibile avviare e interrompere normalmente la notifica.

Se in realtà stai facendo qualcosa che richiede veramente un servizio in primo piano e se vuoi davvero mostrare all'utente un testo ticker, credo che la tua unica possibilità sia quella di emettere un'altra notifica.

+7

dovrebbero davvero metterlo nella documentazione o lanciare un errore quando questo è tentato ... – slinden77

6

È sempre possibile rimuovere la notifica da un servizio di foreground richiamando stopForeground (boolean removeNotification). Quindi un servizio esce dal suo foregroundState e ancora una volta può essere ucciso dal sistema quando è necessaria la memoria.

0

È possibile aggiornare la notifica passando in un generatore vuoto.

if(showNotification){ 
    NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this) 
      .setVisibility(Notification.VISIBILITY_SECRET) 
      .setSmallIcon(R.mipmap.ic_spotify_white_24dp) 
      .setTicker("Playing Now") 
      .setContentTitle("Spotify") 
      .setContentText("Preview"); 
    return mBuilder; 
}else{ 
    NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this); 
    return mBuilder; 
}