Подтвердить что ты не робот

Как правильно обновить сообщение уведомления api 11?

  • До Notification.Builder появился способ обновить уведомление, которое уже было в лотке уведомлений, состояло в вызове setLatestEventInfo(), а затем отправить уведомление обратно через вызов NotificationManager.notify() с идентификатором, который соответствует первому вызову notify(), который вы сделали.

  • Теперь setLatestEventInfo() устарел с сообщением: Use Notification.Builder. Но я не могу найти документацию о том, как правильно обновлять уведомление, используя Notification.Builder.

  • Вы только можете создать новый экземпляр Notification каждый раз, когда вам нужно обновить уведомление? Затем просто перейдите к NotificationManager.notify() с идентификатором, который вы использовали до этого?

  • Кажется, что это работает, но я хотел посмотреть, не было ли у кого-либо официальной проверки, что это новый "способ сделать это"?

Есть настоящая причина, по которой я спрашиваю об этом, потому что в Android 4.1.1 Jelly Bean уведомление теперь мигает каждый раз, когда вызывается notify(). При обновлении индикатора выполнения с setProgress() это выглядит очень плохо и затрудняет доступ к уведомлению. Это было не так в 4.1 или предыдущих версиях. Поэтому я хочу убедиться, что делаю это правильно, прежде чем я напишу ошибку.

4b9b3361

Ответ 1

Я решил эту проблему, вызвав setWhen(0) на моем Notification.Builder. Кажется, что значение по умолчанию для Android по умолчанию для этого аргумента не соответствует обновлению битов представления уведомлений без полного исчезновения уведомления.

Notification.Builder builder = new Notification.Builder(c)
                .setContentTitle("Notification Title")
                .setSmallIcon(R.drawable.ic_notification_icon)
                .setProgress(max_progress,current_progress,false)
                .setWhen(0);
                notification = builder.getNotification();

mNotificationManager.notify(NOTIFICATION_ID, notification);

Обновление:

Как WolframRittmeyer, использование when=0 не является изящным способом. Я сформировал решение, подобное следующему:

if(mNotif == null) {
//either setting mNotif first time
//or was lost when app went to background/low memory
    mNotif = createNewNotification();
}
else {
    long oldWhen = mNotif.when;
    mNotif = createNewNotification();
    mNotif.when = oldWhen;
}
mNotificationManager.notify(NOTIFICATION_ID, mNotif);

Ответ 2

То, что вы делаете, правильно, вы просто не указали флаги, которые вы можете установить. Я не знаю вашей конкретной реализации уведомления, но вы можете подумать о том, чтобы использовать:

setOngoing(boolean ongoing)

или

setOnlyAlertOnce(boolean onlyAlertOnce)

Ответ 3

Я предполагаю (поскольку у меня была такая же проблема только сейчас), что вы используете RemoteView в своем уведомлении. Мне удалось обновить уведомление без его мигания следующим образом:

RemoteViews views;
if( this.mNotification == null) {
    views = new RemoteViews(getPackageName(), R.layout.notification);
    this.mNotification = new Notification.Builder(this)
        .setContent(views)
        .setSmallIcon(R.drawable.status_icon)
        .setContentIntent(mNotificationAction)
        .setOngoing(true)
        .setOnlyAlertOnce(true)
        .getNotification();
} else {
    views = this.mNotification.contentView;
}

Спасибо @seanmonstar за ответ Обновить индикатор выполнения в панели уведомлений.

Ответ 4

Решение, описанное здесь, хорошо работает: Непосредственно обновляющее уведомление

Ключ должен использоваться для повторного использования компоновщика и setOnlyAlertOnce (true):

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