Новые уведомления отображаются двумя способами: если уведомление первое в списке, то для него отводится больше места и оно отображается целиком, если оно располагается вторым или третьим, то для его отображения будет использоваться более компактный вариант.
Для разработчиков появился ряд шаблонных стилей, которые можно использовать при отображении уведомления: Notification.BigPictureStyle, Notification.BigTextStyle, Notification.InboxStyle. Каждый из данных стилей имеет свои дизайнерские особенности. Рассмотрим каждый из них отдельно.
BigTextStyle
Данный стиль предназначен для отображения объемных текстовых сообщений.Resources resources = context.getResources();
// set intent action in notification
Intent i = new Intent(NotificationBroadcastReceiver.ACTION_NOTIFICATION_CLICK);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context,0, i, 0);
Notification notification = new Notification.BigTextStyle(
new Notification.Builder(context)
.setContentTitle("Text title")
.setContentText("Text, shown when notification isn't expanded")
.setSmallIcon(R.drawable.ic_launcher)// Image, shown in notification bar
.setLargeIcon(BitmapFactory.decodeResource(resources,
R.drawable.ic_launcher))// Bitmap Shown in notification
.setAutoCancel(true)
.addAction(R.drawable.action_icon, "Action text",pendingIntent))
.bigText("Long Text, shown in expanded viewn\n"
+ "Long Text, shown in expanded viewn\n"
+ "Long Text, shown in expanded viewn\n"
+ "Long Text, shown in expanded viewn\n")
.build();
NotificationManager nm = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
nm.notify(NTF_ID_TEST, notification);
После вызова данного Notification-а получаем сообщение следующего вида:
BigPictureStyle
Данный стиль удобен для отображения обновления галереи того или иного приложения, например, отслеживание обновления фотографий в Facebook или других социальных сетях и сервисах.Notification notification = new Notification.BigPictureStyle(
new Notification.Builder(context)
.setContentTitle("Text title")
.setContentText("Text, shown when notification isn't expanded")
.setSmallIcon(R.drawable.ic_launcher)// image, shown in notification bar
.setLargeIcon(BitmapFactory.decodeResource(resources,
R.drawable.jelly_bean_android))// Bitmap Shown in notification
.setAutoCancel(true)
.addAction(R.drawable.action_icon, "Action text",pendingIntent))
.bigPicture(BitmapFactory.decodeResource(resources, R.drawable.jelly_beans))
.build();
После вызова данного Notification-а получаем сообщение следующего вида:
InboxStyle
Данный стиль предназначен для отображения списков, например списка полученных писем, или списка запланированных покупок.Notification notification = new Notification.InboxStyle(
new Notification.Builder(context)
.setContentTitle("Shopping list")
.setSmallIcon(R.drawable.shopping_bag_icon)
.setLargeIcon(BitmapFactory.decodeResource(resources,
R.drawable.shopping_bag_icon))
.setAutoCancel(true)
.addAction(R.drawable.action_icon, "View whole list",pendingIntent))
.addLine("apples")
.addLine("mellon")
.addLine("coca-cola")
.build();
После вызова данного Notification-а получаем сообщение следующего вида:
Уведомления с произвольным UI
Наиболее интересным нововведением для разработчиков является возможность использования различных компонентов, относящихся к классу RemoteView. Это позволяет наиболее гибко использовать систему уведомлений.Не очевидным моментом при использовании RemoteView оказался способ задания расширенного уведомления. Эта возможность отсутствует в Notification.Builder и после нескольких экспериментов выяснилось, что созданный нами RemoteView требуется напрямую указывать полю bigContentView, который находится в классе Notification.
Создадим короткий пример. Уменьшенное уведомление (notification_layout) будет содержать заголовок и короткий текст. Расширенное уведомление (notification_layout_expanded) будет содержать заголовок, длинный текст и кнопку для перехода.
Создание и вызов уведомления выглядит следущим образом:
RemoteViews view = new RemoteViews(context.getPackageName(),
R.layout.notification_layout);
RemoteViews viewExpanded = new RemoteViews(context.getPackageName(),
R.layout.notification_layout_expanded);
// set intent and register onclick
Intent i = new Intent(
NotificationBroadcastReceiver.ACTION_NOTIFICATION_BUTTON_CLICK);
PendingIntent pi = PendingIntent.getBroadcast(context, 0, i, 0);
viewExpanded.setOnClickPendingIntent(R.id.NotificationAppButton, pi);
Notification notification = new Notification.Builder(context).setContent(view)
.setSmallIcon(R.drawable.ic_launcher).setAutoCancel(true)
.build();
notification.bigContentView = viewExpanded; // <---- the most tricky moment
NotificationManager nm = (NotificationManager) context
.getSystemService(Context.NOTIFICATION_SERVICE);
nm.notify(NTF_ID_TEST, noti);
При нажатии на кнопку, отображенную на уведомлении, отправляется широковещательный intent, который обрабатывается обычным BroadcastReveiver-ом. После вызова данного Notification-а получаем:
Приоритет уведомлений
В Jelly Bean появилась возможность задать приоритет уведомления, что влияет на очерёдность их отображения. Команда андроид-разработчиков выделила приоритеты от PRIORITY_MIN до PRIORITY_MAX (значения от -2 до 2), где приоритетом по умолчанию является PRIORITY_DEFAULT (значение 0).Также для отображения экстренных уведомлений можно воспользоваться методом setFullScreenIntent(PendingIntent, boolean). При вызове таких уведомлений сразу же отработает Intent, прикреплённый к уведомлению, минуя Notification Bar.
В целом данные нововведения являются довольно простыми, чтобы их нужно было рассматривать детально, но при экспериментировании с этой функциональностью возник ряд морально–этических вопросов: а кто будет пользоваться низкими приоритетами для уведомлений, если есть вероятность, что в определённых ситуациях такие уведомления вообще отображаться не будут?! Не станут ли разработчики эксплуатировать только PRIORITY_MAX и игнорировать ранжирование остальных приоритетов? Не станет ли функциональность setFullScreenIntent излюбленной среди рекламодателей?
Ответы на данные вопросы покажет нам только время. Но стоит напомнить, что в ответ на использование приоритета уведомлений у пользователей появился простой способ отключить показ уведомления любой программы.



Комментариев нет:
Отправить комментарий