web-dev-qa-db-fra.com

Est-il possible de vérifier si une notification est visible ou annulée?

J'aimerais mettre à jour les données de notification, mais le seul moyen que j'ai trouvé est de lancer une nouvelle avec le même identifiant.

Le problème est que je ne veux pas en créer un nouveau si l'original a été annulé ... Est-il possible de savoir si une notification est visible ou annulée? Ou un moyen de mettre à jour une notification uniquement si elle existe?

31
Asaf Pinhassi

Voici comment je l'ai résolu:

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

Voici comment je génère la notification:

    /**
 * 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);
}
32
Asaf Pinhassi

Si vous utilisez API >= 23 pouvez utiliser cette méthode pour obtenir une notification active:

NotificationManager mNotificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
StatusBarNotification[] notifications = mNotificationManager.getActiveNotifications();
for (StatusBarNotification notification : notifications) {
  if (notification.getId() == 100) {
    // Do something.
  }
}
16

Voici une alternative à deleteIntent qui s’est avérée bénéfique dans ma propre application:

Fondamentalement, vous créez une intention avec votre notification qui démarre un IntentService (ou tout autre service) et dans onHandleIntent, vous pouvez définir un indicateur indiquant si la notification est active.
Vous pouvez définir le déclenchement de cette intention lorsque l'utilisateur appuie sur la notification ( contentIntent ) et/ou lorsqu'il la supprime de la liste ( deleteIntent ).

Pour illustrer cela, voici ce que je fais dans ma propre application. Lors de la création de la notification, je mets

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

Lorsque la notification est exploitée, ma CleanupIntentService est lancée, en définissant un indicateur (dans le service qui a créé la notification):

@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);
}
1
stemadsen

Je pense que vous pouvez utiliser deleteIntent of Notification class.

Je me souviens que dans l'une de mes applications, je l'utilisais pour déclencher une diffusion (diffusion personnalisée) lorsqu'une notification était annulée ou que le plateau de notification était vide.

1
Vishal Vyas

Dans ma situation, je voulais vérifier si une notification était déjà affichée avant d'en afficher une autre. Et il s'avère qu'il existe un moyen simple de le faire sans écouter lorsque la notification a été supprimée ou rejetée avec .setAutoCancel(true) sur NotificationManagerCompat.Builder.

 private val NOTIF_ID = 80085
 private val CHANNEL_ID = "com.package.name.ClassName.WhatNotifycationDoes"  
 private lateinit var mNotificationManagerCompat: NotificationManagerCompat
 private lateinit var mNotificationManager: NotificationManager // this is for creating Notification Channel in newer APIs

override fun onCreate() {
    super.onCreate()

    mNotificationManagerCompat = NotificationManagerCompat.from(this)

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
       mNotificationManager = getSystemService(NotificationManager::class.Java)

    showNotification()
    startWatching()
}

private fun showNotification() {
        val contentIntent = Intent(this, MainActivity::class.Java)
                .apply { flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK }
        val contentPendingIntent = PendingIntent.getActivity(this, 1, contentIntent, 0)

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        val name = getString(R.string.app_name)
        val importance = NotificationManager.IMPORTANCE_HIGH
        val channel = NotificationChannel(CHANNEL_ID, name, importance)
        channel.description = getString(R.string.your_custom_description)
        mNotificationManager.createNotificationChannel(channel)
    }

    val mNewStatusNotificationBuilder = NotificationCompat.from(this)
    mNewStatusNotificationBuilder = NotificationCompat.Builder(this, CHANNEL_ID)
            .setContentTitle(getString(R.string.app_name))
            .setContentText(getString(R.string.simple_text))
            .setPriority(NotificationCompat.PRIORITY_DEFAULT)
            .setContentIntent(contentPendingIntent)
            .setAutoCancel(true) // This dismisses the Notification when it is clicked
            .setOnlyAlertOnce(true) //this is very important, it pops up the notification only once. Subsequent notify updates are muted. unless it is loaded again    

    if (Build.VERSION.SDK_INT > Build.VERSION_CODES.Lollipop)
        mNewStatusNotificationBuilder.setSmallIcon(R.drawable.ic_notification)

    notification = mNewStatusNotificationBuilder.build()

    mNotificationManagerCompat.notify(NOTIF_ID, notification)
}
0
Micklo_Nerd