6

He estado tratando durante horas para retirar una notificación permanente establecido por un servicio usando:NotificationManager.cancel() no funciona para mí

startForeground(1337, notification); 

El código que estoy usando para cancelarlo:

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 

¿Qué es lo que falta aquí? Estoy desconcertado.

Para aclarar por qué estoy haciendo esto: el Servicio comienza con una Notificación persistente predeterminada. Cuando se ejecuta mi aplicación, debe reemplazar esta Notificación por otra. Sin embargo, el uso de notify() en la notificación existente funciona perfectamente; también necesito que se muestre el texto de la nueva notificación. Es por eso que decidí eliminar la Notificación existente (usando el código anterior), crear una nueva, y luego llamo al startForeground() nuevamente y le paso la nueva Notificación, por lo que mi Servicio continúa.

+0

¿Está tratando de eliminar una notificación que se inició desde otra aplicación? – matt5784

+0

no, es la misma aplicación – slinden77

Respuesta

11

El problema es que está emitiendo la Notificación de forma indirecta utilizando startForeground(). No puede simplemente cancelar esa Notificación por el mismo motivo por el que el sistema le insiste a que proporcione una Notificación al iniciar un Servicio en primer plano. Mientras su Servicio en primer plano se esté ejecutando, esa Notificación estará allí.

En la mayoría de los casos, los servicios realmente no deberían estar en primer plano. Si puede utilizar una prioridad normal para su Servicio, entonces puede comenzar y detener su Notificación normalmente.

Si realmente está haciendo algo que realmente requiere un servicio en primer plano, y si realmente desea mostrarle al usuario un ticker, creo que su única opción es emitir otra Notificación.

+7

que realmente deberían poner esto en la documentación o hacer que arroje un error cuando se intenta ... – slinden77

6

Siempre puede eliminar las notificaciones de un servicio en primer plano llamando a stopForeground (boolean removeNotification). Luego, un servicio sale de su primer plano y una vez más puede ser eliminado por el sistema cuando se necesita memoria.

0

Puede actualizar la notificación ingresando un Constructor vacío.

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; 
} 
Cuestiones relacionadas