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

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

8 ответов

Решение

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

В классе Notification есть открытое поле, называемое когда. Согласно API:

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

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

notification.when = System.currentTimeMillis();

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

notification.when = previousTimestamp;

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

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

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

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

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

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

Вам не нужен флаг Notification.FLAG_NO_CLEAR.

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

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

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

уведомление

NotificationManager

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

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

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

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

Другие вопросы по тегам