Обновление текущего уведомления тихо - PullRequest
37 голосов
/ 20 июня 2011

У меня есть служба, которая подключается к другим устройствам по беспроводной сети. Когда служба включена, у меня есть текущее уведомление о том, что она включена.

После включения службы пользователь затем подключается к другому устройству. На этом этапе я хотел бы обновить свое текущее уведомление, указав имя устройства, к которому было подключено. Это достаточно просто сделать, позвонив startForeground(ONGOING_NOTIFICATION, notification) снова с обновленной информацией; однако при этом каждый раз, когда он вызывается, на панели появляется сообщение. То, что я действительно хотел бы, чтобы уведомление тихо обновлялось в фоновом режиме, не мигая на панели уведомлений, чтобы пользователь не знал разницу, пока он или она не откроет область уведомлений для просмотра.

Есть ли способ обновить уведомление без звонка startForeground()?

Такое поведение наблюдается только в сотах. Пряничные устройства (и я полагаю, Froyo и т. Д.) Ведут себя желаемым образом.

Ответы [ 4 ]

59 голосов
/ 21 марта 2013

Я тоже сталкивался с этой проблемой, и с помощью предыдущих комментариев и небольшого количества копаний я нашел решение.

Если вы не хотите, чтобы уведомления обновлялись при обновлении, или постоянно перегружали строку состоянияустройства, вы должны:

  • Использовать setOnlyAlertOnce (true) на компоновщике
  • Использовать один и тот же построитель для каждого обновления.

Если вы используетекаждый раз новый строитель, тогда я предполагаю, что Android должен перестраивать вид заново, вызывая его кратковременное исчезновение.

Пример хорошего кода:

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

С учетом вышеизложенногокод, вы можете просто вызвать updateNotification (String, int) с сообщением и прогрессом (0-100), и он обновит уведомление, не раздражая пользователя.

23 голосов
/ 20 июня 2011

Вы должны обновить существующее уведомление https://developer.android.com/training/notify-user/build-notification.html#Updating

7 голосов
/ 20 января 2014

Это сработало для меня, в результате чего уведомление о текущей активности (не СЕРВИС) обновляется «тихо».

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 );
0 голосов
/ 15 февраля 2016

Попробуйте это

    int id = (int) Calendar.getInstance().getTimeInMillis();

Используйте этот идентификатор в методе notify ().Время вашей системы Android само создает уникальный идентификатор

...