Как проверить, какие уведомления активны в строке состояния в Android Dev?
Я сделал приложение, которое устанавливает уведомления в раскрывающейся строке состояния телефонов Android. Однако в моем коде есть ошибка (иногда уведомления устанавливаются, а иногда нет). Я хочу иметь возможность ПРОВЕРИТЬ (в коде), ЕСЛИ УВЕДОМЛЕНИЕ ВИДИМО ДЛЯ ПОЛЬЗОВАТЕЛЯ. (т.е. может ли пользователь видеть уведомление в строке состояния?).
Как я могу это сделать? (Заранее спасибо).
Пример кода с благодарностью.
8 ответов
Я хочу иметь возможность ПРОВЕРИТЬ (в коде), ЕСЛИ УВЕДОМЛЕНИЕ ВИДИМО ДЛЯ ПОЛЬЗОВАТЕЛЯ. (т.е. может ли пользователь видеть уведомление в строке состояния?).
Как я могу это сделать?
Ты не можешь, прости. Обновление: теперь возможно с Android 4.3+ http://developer.android.com/reference/android/service/notification/NotificationListenerService.html
Тем не менее, вы всегда можете просто cancel()
это - отмена Notification
это не на экране совершенно нормально. И наоборот, вы всегда можете безопасно позвонить notify()
опять за то же самое Notification
и это тоже не вызовет проблем, если Notification
уже на экране.
РЕДАКТИРОВАТЬ:
NotificationManager.getActiveNotifications() был добавлен в API 23, если вы не хотите использовать NotificationListenerService
Просто собрать все вместе. Вот как это работает
Чтобы создать уведомление,
Notification n = new Notification.Builder(MyService.this)
.setContentTitle("Notification Title")
.setContentText("Notification Message")
.setSmallIcon(R.drawable.myicon).build();
Чтобы сделать уведомление звуковой звонок setSound()
уведомлений,
Uri alarmSound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
Notification n = new Notification.Builder(MyService.this)
.setContentTitle("Notification Title")
.setContentText("Notification Message")
.setSound(alarmSound)
.setSmallIcon(R.drawable.myicon).build();
Чтобы отменить уведомление после того, как пользователь выбрал и запустил намерение получателя, позвоните setAutoCancel()
,
Notification n = new Notification.Builder(MyService.this)
.setContentTitle("Notification Title")
.setContentText("Notification Message")
.setSound(alarmSound)
.setAutoCancel(true)
.setSmallIcon(R.drawable.myicon).build();
Чтобы сделать звук / вибрировать только один раз для конкретного использования уведомления Notification.FLAG_ONLY_ALERT_ONCE
, С этим флагом ваше уведомление будет звучать только один раз, пока оно не будет отменено, и вы можете вызывать notify() столько раз, сколько хотите, с идентификатором уведомления. Обратите внимание, что если вы вызываете метод cancel() или пользователь отменил уведомление или автоматически отменил его, вызов notify() снова сделает звук уведомления.
n.flags |= Notification.FLAG_ONLY_ALERT_ONCE; // Dont vibrate or make notification sound
Наконец, чтобы разместить уведомление на панели уведомлений,
NotificationManager notificationManager =
(NotificationManager) getSystemService(NOTIFICATION_SERVICE);
notificationManager.notify(notification_id, n);
Обратите внимание, что notification_id
это важно, если вы хотите эффективно использовать уведомление.(сохранить один звук / вибрацию для уведомления или отменить определенное уведомление).
Чтобы отменить определенное уведомление,
NotificationManager notificationManager =
(NotificationManager) getSystemService(NOTIFICATION_SERVICE);
notificationManager.cancel(notification_id);
Вы можете cancel()
уведомление, даже если оно не существует или вы можете позвонить notify()
столько раз, сколько вы хотите с тем же идентификатором. Обратите внимание, что вызов notify с другим идентификатором создаст новые уведомления.
Таким образом, независимо от того, существует ли уведомление или нет, если вы позвоните notify()
снова с правильным notification_id
с Notification.FLAG_ONLY_ALERT_ONCE
флаг установлен, вы можете сохранить свое уведомление, не мешая пользователю повторяющимися звуками.
Вам нужно установить идентификатор для каждого уведомления, которое вы делаете.
так что вы делаете уведомление..
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, notId + selectedPosition, intent, 0);
AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
alarmManager.set(AlarmManager.RTC_WAKEUP, rightNow.getTimeInMillis() - offset, pendingIntent);
Notification notification = new Notification(R.drawable.icon, "TVGuide Υπενθύμιση", System.currentTimeMillis());
NotificationManager manger = (NotificationManager) context.getSystemService(context.NOTIFICATION_SERVICE);
notification.setLatestEventInfo(context, "Κανάλι: " + b.getString("channel"), "Εκπομπή: " + showname, pendingIntent);
manger.notify(notId, notification);
очистить это..
PendingIntent pendingIntent = PendingIntent.getBroadcast(context,notId, intent, 0);
pendingIntent.cancel();
и проверить, если активен..( existAlarm возвращает ноль, если нет доступных намерений)
public PendingIntent existAlarm(int id) {
Intent intent = new Intent(this, alarmreceiver.class);
intent.setAction(Intent.ACTION_VIEW);
PendingIntent test = PendingIntent.getBroadcast(this, id + selectedPosition, intent, PendingIntent.FLAG_NO_CREATE);
return test;
}
Таким образом, все сводится к инициализации идентификатора для каждого уведомления и того, как вы делаете его уникальным.
Новый метод введен в класс NotificationManager в API 23:
public StatusBarNotification[] getActiveNotifications()
Для этого существует флаг.
Notification notification = new Notification(icon, tickerText, when);
notification.flags |= Notification.FLAG_ONLY_ALERT_ONCE;
FLAG_ONLY_ALERT_ONCE:
... должен быть установлен, если вы хотите, чтобы звук и / или вибрация воспроизводились при каждой отправке уведомления, даже если оно не было отменено до этого.
Хотя уведомление будет мигать при повторной отправке, но звука и вибрации не будет.
Теперь можно проверить выдающиеся уведомления в Android 4.3 и выше
Посмотреть здесь:
http://developer.android.com/reference/android/service/notification/NotificationListenerService.html
Кажется, что из Android M (API 23) можно получить такой процесс, не используя NotificationListenerService и не требуя дополнительных разрешений:
notificationManager.getActiveNotifications()
Начиная с Android Marshmallow (API 23), вы можете восстановить список активных уведомлений, опубликованных вашим приложением. Этот метод NotificationManager getActiveNotifications()
, Более подробная информация здесь: https://developer.android.com/reference/android/app/NotificationManager.html