Андроидное шоу с всплывающим окном любого приложения
В приведенном ниже коде мое уведомление добавляется только в панель уведомлений, не отображается сообщение типа всплывающего окна, как если бы вы получили сообщение whatsapp, когда находитесь в другом приложении. Что делает это с уведомлением?
private void sendNotification(int distance, ViewObject viewObject) {
Intent notificationIntent = new Intent(getApplicationContext(), MainActivity.class);
notificationIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP);
notificationIntent.putExtra("path", viewObject.getPath());
TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
stackBuilder.addParentStack(MainActivity.class);
stackBuilder.addNextIntent(notificationIntent);
PendingIntent notificationPendingIntent = stackBuilder.getPendingIntent(Integer.parseInt(viewObject.getRefId()), PendingIntent.FLAG_UPDATE_CURRENT);
NotificationCompat.BigTextStyle bigText = new NotificationCompat.BigTextStyle();
bigText.bigText(String.format(getString(R.string.notification), viewObject.getTitle()));
bigText.setBigContentTitle(getString(R.string.hello));
NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
builder.setSmallIcon(R.drawable.ic_wald_poi)
.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.ic_poi))
.setColor(getResources().getColor(R.color.primary))
.setContentTitle(getString(R.string.hello))
.setContentIntent(notificationPendingIntent)
.setContentText(String.format(getString(R.string.notification), viewObject.getTitle()))
.setDefaults(Notification.DEFAULT_ALL)
.setStyle(bigText);
builder.setAutoCancel(true);
NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
mNotificationManager.notify(0, builder.build());
}
Ответы
Ответ 1
Если вы хотите использовать Heads-up Notifications
следующим образом:
![enter image description here]()
Вы должны изменить приоритет Notification
или важность NotificationChannel
.
Приоритет уведомления, установленный setPriority()
. Приоритет определяет, насколько навязчивым должно быть уведомление на Android 7.1 и ниже. (Для Android 8.0 и выше вы должны установить важность канала)
На Android 7.1 (уровень API 25) и ниже:
- Установите приоритет уведомления на
NotificationCompat.PRIORITY_HIGH
или NotificationCompat.PRIORITY_MAX
.
- Установить мелодию звонка и вибрации - вы можете использовать
setDefaults(Notification.DEFAULT_ALL)
Android 8.0 (уровень API 26) и выше:
- Установите приоритет канала уведомлений на
NotificationManager.IMPORTANCE_HIGH
Уведомление:
NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
builder.setSmallIcon(R.drawable.ic_wald_poi)
.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.ic_poi))
.setColor(getResources().getColor(R.color.primary))
.setContentTitle(getString(R.string.hello))
.setContentIntent(notificationPendingIntent)
.setContentText(String.format(getString(R.string.notification), viewObject.getTitle()))
.setDefaults(Notification.DEFAULT_ALL)
.setStyle(bigText)
.setPriority(NotificationManager.IMPORTANCE_HIGH)
Канал уведомлений:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
// Create the NotificationChannel
val name = getString(R.string.notification_channel_name)
val descriptionText = getString(R.string.notification_channel_description)
val importance = NotificationManager.IMPORTANCE_HIGH
val mChannel = NotificationChannel(NOTIFICATION_CHANNEL_ID, name, importance)
mChannel.description = descriptionText
// Register the channel with the system; you can't change the importance
// or other notification behaviors after this
val notificationManager = getSystemService(NOTIFICATION_SERVICE) as NotificationManager
notificationManager.createNotificationChannel(mChannel)
}
Важно
Если вы хотите дополнительно настроить поведение уведомлений по умолчанию для своего канала, вы можете вызвать такие методы, как enableLights()
, setLightColor()
и setVibrationPattern()
на NotificationChannel
. Но помните, что когда вы создаете канал, вы не можете изменять эти настройки, и пользователь имеет окончательный контроль над активностью этого поведения. Другой вариант - удалить и установить приложение заново. Читать дальше
Примеры условий, которые могут вызывать хедз-ап уведомления:
- Активность пользователя в полноэкранном режиме (приложение использует fullScreenIntent).
- Уведомление имеет высокий приоритет и использует мелодии или вибрации на устройствах под управлением Android 7.1 (уровень API 25) и ниже.
- Канал уведомлений имеет большое значение на устройствах под управлением Android 8.0 (уровень API 26) и выше.
Приоритет:
Notification.PRIORITY_HIGH
и Notification.PRIORITY_MAX
was deprecated in API level 26. use NotificationCompat
instead.
Здесь больше информации :-)
Ответ 2
Вы должны установить приоритет уведомления Notification.PRIORITY_HIGH
или Notification.PRIORITY_MAX
. Мне также нужно было сделать .setDefaults(Notification.DEFAULT_ALL)
.
Ответ 3
Система Android решает, что уведомление отображается как Уведомление о Heads-up. Существует несколько условий, в которых может вызвать уведомление Heads-up:
Примерами условий, которые могут вызывать уведомления, могут быть:
- Активность пользователя находится в полноэкранном режиме (приложение использует fullScreenIntent).
- Уведомление имеет высокий приоритет и использует рингтоны или вибрации на устройствах под управлением Android 7.1 (уровень API 25) и ниже.
- Канал уведомлений имеет большое значение для устройств под управлением Android 8.0 (API уровня 26) и выше.
Источник: https://developer.android.com/guide/topics/ui/notifiers/notifications.html#Heads-up
Итак, если вы используете Android 7.1 и ниже, обязательно добавьте рингтон или вибрацию, а также высокий приоритет. Для Android 8.0 и выше измените приоритет на высокий уровень.
NotificationCompat.Builder builder = new NotificationCompat.Builder(context, CHANNEL_ID)
// ...
.setDefaults(DEFAULT_SOUND | DEFAULT_VIBRATE)
.setPriority(NotificationCompat.PRIORITY_HIGH); // or HIGH_IMPORTANCE for Android 8.0
Ответ 4
Ниже уровня API 26:
Установите Notification.PRIORITY_HIGH или Notification.PRIORITY_MAX в Builder при отправке сообщения.
Уровень API 26 или выше:
Установить высокий приоритет канала
Важно: если канал имеет установленный приоритет, его нельзя изменить. Если это было в НИЗКОМ, не покажет всплывающее окно, если вы не переустановите приложение.
Ответ 5
Я процитирую комментарий от @hermann-klecker, который помог мне после выполнения всех шагов:
... при изменении важности в коде довольно полезно удалить приложение и установить его с нуля. В противном случае вы можете не увидеть каких-либо изменений с точки зрения важности и внешнего вида виджета уведомлений.