Текущее уведомление в сотах Android имеет непоследовательное поведение

У меня есть постоянное уведомление о загрузке файлов в фоновом режиме. Мне удалось создать несколько одновременных уведомлений об обновлении индикатора выполнения, которые также можно отменить. Это прекрасно работает на всех протестированных устройствах, за исключением некоторых последних Android-планшетов с Honeycomb.

Эффект заключается в том, что исходное сообщение уведомления постоянно отображается повторно, что не позволяет пользователю щелкнуть часы, чтобы открыть список текущих уведомлений. Таким образом, индикаторы выполнения даже не видны. Кому-нибудь удалось по существу создать уведомления индикатора выполнения на Honeycomb?

Кроме того, я также обнаружил, что мой черный текст уведомлений больше не читается на черном фоне списка уведомлений. Есть ли способ установить белый текст для сотовых устройств?

Примечание. Это было протестировано на Optimus Pad L-06C под управлением Android 3.0.1 и Motorola Xoom.

Ниже показано создание уведомления

// Create new notification for downloading
mNotification = new Notification(R.drawable.owl_icon, getNotificationText(R.string.notification_content_downloading), 0);
mNotification.flags |= (Notification.FLAG_NO_CLEAR | Notification.FLAG_ONGOING_EVENT);

// Create custom progress bar view
RemoteViews contentView = new RemoteViews(CourseSyncService.this.getPackageName(), R.layout.notification_downloading);
contentView.setTextViewText(R.id.notificationTitle, mCourseTitle);
contentView.setProgressBar(R.id.notificationProgressBar, 100, 0, false);
contentView.setTextViewText(R.id.notificationPercentage, "0%");
mNotification.contentView = contentView;

// Create pending intent for the notification
Intent notificationIntent = new Intent(CourseSyncService.this, CancelDownloadActivity.class);
notificationIntent.putExtra(CourseSyncService.KEY_USER_ID, mUserId);
notificationIntent.putExtra(CourseSyncService.KEY_COURSE_ID, mCourseId);
notificationIntent.putExtra(CourseSyncService.KEY_COURSE_TITLE, mCourseTitle);
PendingIntent contentIntent = PendingIntent.getActivity(CourseSyncService.this, mCourseId, notificationIntent, PendingIntent.FLAG_CANCEL_CURRENT);
mNotification.contentIntent = contentIntent;

// Launch notification
mNotificationManager.notify(mCourseId, mNotification);

И вот как я обновляю уведомление:

// Update the progress bar of the notification view 
mNotification.contentView.setProgressBar(R.id.notificationProgressBar, mItemCount, mProgressCount, false);
mNotification.contentView.setTextViewText(R.id.notificationPercentage, String.valueOf(mProgress) + "%");
mNotificationManager.notify(mCourseId, mNotification);

person Chase    schedule 06.06.2011    source источник
comment
notify(id, уведомление) имеет документы, в которых говорится, что для того же идентификатора уведомление будет заменено обновленной информацией. Кажется, Honeycomb добавляет ужасное повторное отображение, которого не было в предыдущих версиях.   -  person Rene    schedule 07.08.2011
comment
Поздравляю с пробегом 1500! Мой голос подтолкнул вас к краю ... Но в основном спасибо за то, что задали эту проблему, у меня была такая же проблема, и это решило ее.   -  person JPM    schedule 23.03.2012


Ответы (4)


Чтобы решить эту проблему, вам нужно установить побитовое Notification.FLAG_ONLY_ALERT_ONCE. в вашем текущем уведомлении. Это гарантирует, что пользователь будет уведомлен только при первом отображении уведомления. После этого им нужно будет открыть панель уведомлений, чтобы просмотреть статус уведомления.

Notification notification = new Notification();
notification.flags |= Notification.FLAG_ONGOING_EVENT;
notification.flags |= Notification.FLAG_ONLY_ALERT_ONCE;
person twaddington    schedule 24.08.2011
comment
Ты мой герой! В комментариях к этому флагу говорится, что бит должен быть побитовым в поле флагов, которое следует установить, если вы хотите, чтобы звук и/или вибрация воспроизводились каждый раз при отправке уведомления, даже если оно не было отменено до этого. так что, может быть, поэтому я никогда не пробовал его использовать. Спасибо! - person Chase; 26.08.2011

Я думаю, что нашел проблему в этом, если кто-то все еще ищет. Проблема в том, что когда вы создаете новое уведомление, когда устанавливается текущее системное время. Если вы посмотрите на: http://developer.android.com/reference/android/app/Notification.html#when вы прочтете, что операция загрузки, когда должна быть отмечена в начале. Если вы этого не сделаете (как я делал) и у вас есть несколько уведомлений о загрузке, они будут продолжать переупорядочиваться в зависимости от поля «когда».

person ralepinski    schedule 31.08.2012

Список уведомлений не имеет черного фона на GB; только строка состояния была изменена на черную. Какое устройство вызывает проблемы? Вы пробовали это на стандартном GB, чтобы убедиться, что это не проблема, связанная с этим устройством, а не с чем-то, что изменилось на платформе? Знаете ли вы, есть ли у этого устройства хоть что-то, совместимое с CDD и прошедшее CTS?

person hackbod    schedule 06.06.2011
comment
Я знал, что должен был упомянуть модель. В настоящее время я работаю с Optimus Pad L-06C под управлением Android 3.0.1. Я не тестировал другие устройства, но сделаю это, как только получу одно из них. Я не знаю, соответствует ли это устройство стандартам CDD или нет. Я обновлю вопрос с соответствующей информацией. Спасибо. - person Chase; 06.06.2011
comment
Кроме того, я ошибочно поставил Gingerbread, когда имел в виду Honeycomb. И я сейчас проверил это на двух устройствах. - person Chase; 08.06.2011
comment
Ах да, как часть нового пользовательского интерфейса в Android 3.0 изменился фон. Этот ответ о переполнении стека должен помочь: stackoverflow. com/questions/4867338/ - person hackbod; 23.06.2011
comment
Но решили ли вы свою первую проблему многократного непрерывного уведомления? - person CeccoCQ; 21.07.2011

Чтобы решить эту проблему (на 4.0.3, на предыдущих уровнях API не пробовал) мне пришлось хранить ссылку на мой Notification, обновлять ее каждый раз, когда что-то менялось, а затем отправлять тот же объект Notification на NotificationManager.notify().

Хотя я устанавливал flags, как указано в ответе @twaddingtion, и отправлял тот же id в NotificationManager, мое уведомление искажалось в SystemBar.

person Ovidiu Latcu    schedule 20.06.2012