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

У меня есть уведомление, которое обновляется (т.е. отправляется) каждые три секунды. Я установил флаг 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

Есть решение, которое делает именно то, что вы хотите.

В классе Notification существует общедоступное поле под названием when. Согласно API:

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

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

notification.when = System.currentTimeMillis();

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

notification.when = previousTimestamp;

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

Ответ 2

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

Ответ 3

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

Тем временем вы можете в целом отвечать на такие вопросы, как "Могу ли я привязывать свое уведомление к статической позиции или к началу списка", думая "Подождите, что произойдет, если две или более программы попытаются прикрепить их уведомление будет первым?" и осознавая, что гонка вооружений, которая будет возникать среди программ, когда они будут пытаться все труднее убедиться, что их уведомление является первым, - почему эта функция не поддерживается.

Ответ 4

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

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

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

Notification

NotificationManager

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

Ответ 6

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

Ответ 7

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

Ответ 8

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

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