2012-09-29 20 views
24

Me gustaría actualizar los datos de notificación, pero la única forma que encontré es lanzar uno nuevo con el mismo Id.¿Es posible verificar si una notificación es visible o cancelada?

El problema es que no quiero subir uno nuevo si el original ha sido cancelado. ¿Hay alguna manera de saber si una notificación está visible o cancelada? ¿O una forma de actualizar una notificación solo si existe?

Respuesta

29

Esto es cómo lo resolví:

private boolean isNotificationVisible() { 
    Intent notificationIntent = new Intent(context, MainActivity.class); 
    PendingIntent test = PendingIntent.getActivity(context, MY_ID, notificationIntent, PendingIntent.FLAG_NO_CREATE); 
    return test != null; 
} 

Ésta es la forma en que genero la notificación:

/** 
* Issues a notification to inform the user that server has sent a message. 
*/ 
private void generateNotification(String text) { 

    int icon = R.drawable.notifiaction_icon; 
    long when = System.currentTimeMillis(); 
    NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); 
    Notification notification = new Notification(icon, text, when); 
    String title = context.getString(R.string.app_name); 
    Intent notificationIntent = new Intent(context, MainActivity.class); 

    // set intent so it does not start a new activity 
    //notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); 
    PendingIntent intent = PendingIntent.getActivity(context, MY_ID, notificationIntent, 0); 
    notification.setLatestEventInfo(context, title, text, intent); 

    notification.flags |= Notification.FLAG_AUTO_CANCEL; //PendingIntent.FLAG_ONE_SHOT 

    notificationManager.notify(MY_ID, notification); 
} 
+0

tiene que haber algo que está mal. cuando escribo en mi método '' 'onResume()' '' que '' 'if (isNotificationVisible())' '' mi notificación debe cancelarse con: '' '((NotificationManager) getSystemService (NOTIFICATION_SERVICE)) cancel (MY_ID); '' 'y después de eso' '' finish(); startActivity (getIntent()); '' 'Recibo un bucle que me lleva a reiniciar mi teléfono. por lo que este método debe tratarse con precaución ... – maysi

+5

No funciona para mí. Esto siempre vuelve verdadero para mí. – Saket

+1

No funcionó para mí en Android 4.3. El 'PendingIntent' se mantuvo después de descartar la notificación, e incluso después de matar toda la aplicación. Solo al reiniciar el teléfono se deshizo de él. Además, 'setLatestEventInfo()' ya no parece existir, así que acabo de usar 'setContentIntent()' en su lugar. – Sam

1

Creo que puede usar deleteIntent de la clase Notification.

Recuerdo que en una de las aplicaciones que uso uso para disparar una difusión (transmisión personalizada) cuando se cancela una notificación o se borra la bandeja de notificaciones.

1

Una alternativa a la deleteIntent es la continuación de lo cual ha demostrado ser beneficiosa en mi propia aplicación:

Básicamente, crea un intento con su notificación que inicia un IntentService (o cualquier otro servicio) y en onHandleIntent puede establecer una bandera que indica si la notificación está activa.
Puede configurar esta intención para que se active cuando el usuario toque la notificación (contentIntent) y/o cuando el usuario la borre de la lista (deleteIntent).

Para ilustrarlo, esto es lo que hago en mi propia aplicación. Cuando la construcción de la notificación puse

Intent intent = new Intent(this, CleanupIntentService.class); 
Notification n = NotificationCompat.Builder(context).setContentIntent(
     PendingIntent.getActivity(this, 0, intent, 0)).build(); 

Cuando se toca la notificación, mi CleanupIntentService se pone en marcha, el establecimiento de una bandera (en el servicio que creó la notificación):

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    super.onCreate(); // If removed, onHandleIntent is not called 
    return super.onStartCommand(intent, flags, startId); 
} 


@Override 
protected void onHandleIntent(Intent intent) { 
    OtherService.setNotificationFlag(false); 
} 
6

Salam. Si está utilizando API >= 23 puede utilizar este método para obtener notificación activo:

StatusBarNotification[] notifications = mNotificationManager.getActiveNotifications(); 
for (StatusBarNotification notification : notifications) { 
    if (notification.getId() == 100) { 
    // Do something. 
    } 
} 
Cuestiones relacionadas