Уведомление о контакте в верхней части области уведомлений
У меня есть уведомление, которое обновляется (т.е. отправляется) каждые три секунды. Я установил флаг 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
Надеюсь, что это помогло!
Ответ 5
Существует флаг текущего события.
http://developer.android.com/reference/android/app/Notification.html#FLAG_ONGOING_EVENT
Вам не нужен флаг Notification.FLAG_NO_CLEAR.
Ответ 6
Вы сказали, что ваше уведомление отображает список запущенных приложений. Почему вы повторно отправляете уведомление каждые 3 секунды? Почему бы не повторно отправить уведомление, только когда список приложений изменился. Это не решает вашу проблему напрямую, но это резко сокращает ее.
Ответ 7
Добавив файл .setSortKey(String) к вашему строителю уведомлений, вы можете получать уведомления в постоянном лексикографическом/алфавитном порядке.
Ответ 8
Просто заметьте для других людей, которые столкнулись с этой проблемой -
Вайден ответил на исправление моей проблемы, когда мое текущее уведомление продолжало прыгать. Это произошло только с нашим приложением по ICS 4.0.3 по какой-то причине, я думаю, это связано с тем, что ICS обрабатывает уведомления по-разному от более старых версий. Также следует отметить, что на планшетах нет "текущих" и обычных разделов уведомлений, например, в более старых версиях (Gingerbread). Приказ сохраняется, хотя и не классифицируется. Не уверен, что это относится к телефонам на ICS.