web-dev-qa-db-fra.com

Mise à jour silencieuse d'une notification en cours

J'ai un service qui se connecte à d'autres appareils sans fil. Lorsque le service est activé, j'ai une notification en cours qui indique qu'il est activé.

Une fois le service activé, l'utilisateur se connecte ensuite à un autre appareil. À ce stade, je voudrais mettre à jour ma notification en cours pour indiquer le nom de l'appareil auquel vous êtes connecté. C'est assez facile à faire en appelant à nouveau startForeground(ONGOING_NOTIFICATION, notification) avec les informations mises à jour; cependant, cela fait clignoter la notification sur la barre chaque fois qu'elle est appelée. Ce que j'aimerais vraiment, c'est que la notification soit mise à jour silencieusement en arrière-plan sans clignoter sur la barre de notification afin que l'utilisateur ne sache pas la différence jusqu'à ce qu'il ouvre la zone de notification pour regarder.

Est-il possible de mettre à jour la notification sans appeler startForeground()?

Ce problème se produit uniquement dans Honeycomb. Les appareils en pain d'épice (et je suppose que Froyo, etc.) se comportent de la manière souhaitée.

38
howettl
23
denis.solonenko

Moi aussi, j'ai rencontré ce problème, et avec l'aide des commentaires précédents et un peu de fouille, j'ai trouvé la solution.

Si vous ne souhaitez pas que les notifications clignotent lors de la mise à jour ou monopolisent continuellement la barre d'état de l'appareil, vous devez:

  • Utilisez setOnlyAlertOnce (true) sur le générateur
  • Utilisez le même constructeur pour chaque mise à jour.

Si vous utilisez un nouveau générateur à chaque fois, je suppose que Android doit reconstruire la vue à nouveau, la faisant brièvement disparaître.

Un exemple de bon code:

class NotificationExample extends Activity {

  private NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this);
  private mNotificationManager =
    (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

  //Different Id's will show up as different notifications
  private int mNotificationId = 1;    

  //Some things we only have to set the first time.
  private boolean firstTime = true;

  private updateNotification(String message, int progress) {
    if (firstTime) {
      mBuilder.setSmallIcon(R.drawable.icon)
      .setContentTitle("My Notification")
      .setOnlyAlertOnce(true);
      firstTime = false;
    }
    mBuilder.setContentText(message)
    .setProgress(100, progress, true);

    mNotificationManager.notify(mNotificationId, mBuilder.build());
  }
}

Avec le code ci-dessus, vous pouvez simplement appeler updateNotification (String, int) avec un message et une progression (0-100) et il mettra à jour la notification sans ennuyer l'utilisateur.

59
Chris Noldus

Cela a fonctionné pour moi, grâce auquel une notification d'activité en cours (et non de SERVICE) est mise à jour "silencieusement".

NotificationManager notifManager; // notifManager IS GLOBAL
note = new NotificationCompat.Builder(this)
    .setContentTitle(YOUR_TITLE)
    .setSmallIcon(R.drawable.yourImageHere);

note.setOnlyAlertOnce(true);
note.setOngoing(true);
note.setWhen( System.currentTimeMillis() );

note.setContentText(YOUR_MESSAGE);

Notification notification = note.build();
notifManager.notify(THE_ID_TO_UPDATE, notification );
7
Britc