Прикрепите уведомление к верхней части области уведомлений

#android #notifications

#Android #уведомления

Вопрос:

У меня есть уведомление, которое обновляется (т. Е. отправляется) каждые три секунды. Я установил флаги FLAG_ONGOING_EVENT и FLAG_NO_CLEAR, чтобы они отображались всегда. Проблема в том, что, например, если загрузка активна (которая отображает индикатор выполнения в области уведомлений), оба уведомления постоянно переключают позиции, поскольку они оба обновляются каждые несколько секунд.

Как я могу прикрепить свое уведомление к началу списка (или к некоторой статической позиции), чтобы оно перестало перемещаться каждый раз, когда я обновляю его с помощью вызова NotificationManager.notify() ?

Редактировать: Вот код для обновления уведомления. Оно запускается каждые три секунды.

 Notification notification = new Notification();
notification.contentView = appBarNotification; // this sets the changed notification content
notification.flags |= Notification.FLAG_ONGOING_EVENT;  
notification.flags |= Notification.FLAG_NO_CLEAR; 

Intent notificationIntent = new Intent();
PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);
notification.contentIntent = contentIntent;
notification.icon = R.drawable.icon;

nm.notify(APP_BAR_NOTIFICATION, notification);
  

Комментарии:

1. Используете ли вы один и тот же идентификатор при каждом вызове notify() ?

2. Да, именно это я и делаю. Я опубликую соответствующий код в вопросе.

Ответ №1:

Существует решение, которое делает именно то, что вы хотите.

В классе Notification есть общедоступное поле, которое называется when. В соответствии с API:

Временная метка для уведомления. Значки и расширенные представления сортируются по этому ключу.

Поведение по умолчанию (как для кода, так и для верстальщиков 🙂 заключается в том, чтобы указать, когда, временную метку уведомления:

 notification.when = System.currentTimeMillis();
  

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

 notification.when = previousTimestamp;
  

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

Комментарии:

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

2. mmmm — это тип Long … вы можете преобразовать в int, но в версиях> 5.0 всегда включен, 2012 работает, но в 2015 не работает!! извините, устарело

3. Я был очень рад найти решение именно той проблемы, которая у меня есть. Но … к сожалению, я не смог понять такой простой ответ: ( . Я просто не мог уловить суть … previousTimestamp — откуда взято? Является ли это отметкой времени, присвоенной предыдущему обновленному уведомлению, или это предыдущее время обновления того же уведомления или что это такое? Кто-нибудь может уточнить, пожалуйста?

4. @Lifhtier — временная метка исходного уведомления. Пока вы используете ту же временную метку, уведомление сохранит свое место в очереди.

5. @Vaiden — Я безуспешно пробовал это, и кажется, что решение устарело. По крайней мере, с API > = 21, уведомление, когда значение по умолчанию равно времени начала, поэтому установка его вручную на то же значение не имеет никакого эффекта. Это не влияет на порядок уведомлений. Тем не менее, я обнаружил, что установка высокого приоритета — это то, что заставило уведомления играть в чехарду, они переопределили приоритет каждого из них

Ответ №2:

Вы не должны продолжать отправлять уведомления. Просто используйте флаг текущего события, как у вас уже есть в вашем коде. Другие уведомления могут приходить и заслонять ваши, но именно так работает Android.

Комментарии:

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

2. Хм, действительно кажется, что в Android нет способа добиться желаемого поведения. Итак, этот ответ кажется наиболее подходящим.

3. На самом деле есть решение, по крайней мере, одно, которое работает для меня. Пожалуйста, ознакомьтесь с моим ответом внизу этой страницы.

Ответ №3:

Отправляете ли вы новое уведомление каждый раз или обновляете существующее? Можете ли вы опубликовать код?

В то же время, вы обычно можете ответить на вопросы типа «Могу ли я прикрепить свое уведомление к статическому положению или к началу списка», подумав: «Подождите, что произойдет, если две или более программы попытаются прикрепить свое уведомление к первому?» и понимая, что гонка вооружений, которая начнется среди программ, поскольку они все больше стараются обеспечить, чтобы их уведомление было первым, является причиной того, что такая функция не поддерживается.

Комментарии:

1. Nik прав — если каждый разработчик может заставить свое приложение отображать уведомления выше всех остальных, почему бы и нет?

2. Статической позиции было бы достаточно, она не обязательно должна быть в самом верху списка — просто как можно выше.

3. Я не знаю, как «обновить» существующее уведомление, не отправляя его повторно с тем же идентификатором, так что в основном это то, что я делаю каждые три секунды… Я опубликую код в вопросе.

4. Но если вы хотите не быть первым, а просто иметь статическую позицию, решение, которое не «украло бы первое место», было бы жизнеспособным (и ответом на вопрос). Итак, ответ на вопрос «что произошло бы, если» был бы таким: они получили бы случайное (но статическое) место в списке.

5. Да, статического положения было бы вполне достаточно.

Ответ №4:

Прошло некоторое время с тех пор, как я писал код для Android, но, если я правильно помню, всякий раз, когда вы звоните NotificationManager.notify() , это потому, что вы хотите предупредить пользователя перемещением или вспышкой значка. Однако существуют способы изменения фактических уведомлений, которые вы отправляете.

Вы также можете вызвать .cancel() это, если это поможет.

Вот документация Android API для справки, хотя вы, вероятно, уже видели их:

Уведомление

NotificationManager

Надеюсь, это помогло!

Комментарии:

1. Извините, но я ничего не нашел о фактическом «обновлении» запущенного уведомления. Повторная отправка (т. Е. вызов notify ()) с новым контентом — единственный известный мне способ…

Ответ №5:

Существует флаг текущего события. http://developer.android.com/reference/android/app/Notification.html#FLAG_ONGOING_EVENT

Вам не нужно уведомление.ФЛАГ_НО_ЧИСТКИ.

Комментарии:

1. Как вы можете видеть, я уже использую FLAG_ONGOING_EVENT в своем коде. Проблема в том, что, например, индикатор выполнения загрузки также использует его, и поэтому оба они меняются местами каждые несколько секунд в текущей области. Тем не менее, вы можете быть правы относительно флага FLAG_NO_CLEAR — нужно протестировать это, хотя это не решит мою основную проблему.

2. FLAG_ONGOING_EVENT предназначен только для указания Android не отклонять уведомление. Это не имеет никакого отношения к заказу

Ответ №6:

Вы говорите, что в вашем уведомлении отображается список запущенных в данный момент приложений. Почему вы повторно отправляете уведомление каждые 3 секунды? Почему бы не отправить уведомление повторно только тогда, когда список приложений изменился. Это напрямую не решает вашу проблему, но значительно уменьшает ее.

Комментарии:

1. Вы абсолютно правы — я уже реализовал такую функцию, но на данный момент она работает не так, как предполагалось. Поэтому я временно переключился обратно на решение за 3 минуты. Тем не менее, как вы сказали, это на самом деле не решило бы мою общую проблему…

Ответ №7:

Добавив setSortKey (строковый ключ сортировки) в свой конструктор уведомлений, вы сможете сохранять свои уведомления в постоянном лексикографическом / алфавитном порядке.

Комментарии:

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

Ответ №8:

Просто примечание для других людей, которые сталкиваются с этой проблемой —

Ответ Вайдена исправил мою проблему, из-за которой мое текущее уведомление продолжало перескакивать. По какой-то причине это произошло только с нашим приложением на ICS 4.0.3, я думаю, это связано с тем, что ICS обрабатывает уведомления иначе, чем в более старых версиях. Также следует отметить — на планшетах нет разделов «Текущие» по сравнению с обычными уведомлениями, как в более старых версиях (Gingerbread). Однако порядок сохраняется, просто он не классифицирован. Не уверен, применимо ли это к телефонам на ICS.