page.title=Уведомления page.tags=notifications helpoutsWidget=true page.image=/preview/images/notifications-card.png trainingnavtop=true @jd:body
В Android N представлено несколько новых API-интерфейсов, позволяющих публиковать заметные и интерактивные уведомления.
Существующий API-интерфейс уведомлений {@link android.support.v4.app.RemoteInput} в Android N расширен для поддержки внутренних ответов на смартфонах. С помощью этой возможности пользователи могут быстро отвечать на сообщения в панели уведомлений, не открывая приложение.
Android N также позволяет группировать несколько похожих уведомлений, чтобы они отображались как одно. Для этого в Android N используется существующий метод {@link android.support.v4.app.NotificationCompat.Builder#setGroup NotificationCompat.Builder.setGroup()}. Пользователи могут развернуть все уведомления и выполнить различные действия, например ответить на сообщение или закрыть каждое из уведомлений по отдельности в панели уведомлений.
Наконец, в Android N представлены новые API-интерфейсы, позволяющие использовать системные элементы в собственных представлениях уведомлений вашего приложения. Благодаря им уведомления отображаются единообразно на основе стандартных шаблонов.
В этом документе рассматриваются некоторые наиболее важные изменения, которые следует учитывать при использовании новых уведомлений в приложениях.
С помощью прямых ответов пользователи
Android N могут быстро отвечать на текстовые сообщения и обновлять списки задач непосредственно в интерфейсе
уведомлений. На мобильных устройствах действие внутреннего ответа обозначается
как дополнительная кнопка в уведомлении. Если пользователь набирает ответ на клавиатуре, система
прикрепляет текст ответа к намерению,
указанному для действия уведомления, и передает намерение в ваше
приложение.
Рисунок 1. В Android N добавлена кнопка Reply.
Создание действия уведомления, которое поддерживает прямой ответ:
// Key for the string that's delivered in the action's intent
private static final String KEY_TEXT_REPLY = "key_text_reply";
String replyLabel = getResources().getString(R.string.reply_label);
RemoteInput remoteInput = new RemoteInput.Builder(KEY_TEXT_REPLY)
.setLabel(replyLabel)
.build();
addRemoteInput().
// Create the reply action and add the remote input
Notification.Action action =
new Notification.Action.Builder(R.drawable.ic_reply_icon,
getString(R.string.label), replyPendingIntent)
.addRemoteInput(remoteInput)
.build();
// Build the notification and add the action
Notification notification =
new Notification.Builder(mContext)
.setSmallIcon(R.drawable.ic_message)
.setContentTitle(getString(R.string.title))
.setContentText(getString(R.string.content))
.addAction(action))
.build();
// Issue the notification
NotificationManager notificationManager =
NotificationManager.from(mContext);
notificationManager.notify(notificationId, notification);
Система запрашивает у пользователя ввод ответа, если он инициирует действие уведомления.
Рисунок 2. Пользователь вводит текст в панели уведомлений.
Получение введенного пользователем текста из интерфейса уведомлений в операции, объявленной в намерении действия:
Bundle remoteInput = RemoteInput.getResultsFromIntent(intent);
В следующем фрагменте кода показано, как метод извлекает введенный текст из группы:
// Obtain the intent that started this activity by calling
// Activity.getIntent() and pass it into this method to
// get the associated string.
private CharSequence getMessageText(Intent intent) {
Bundle remoteInput = RemoteInput.getResultsFromIntent(intent);
if (remoteInput != null) {
return remoteInput.getCharSequence(KEY_TEXT_REPLY);
}
return null;
}
Приложения могут применять логику, чтобы определить, какие действия следует выполнить с полученным текстом. Для интерактивных приложений (например, чатов) предоставьте больше контекста в самом уведомлении (например, несколько строк истории чата, в том числе собственные сообщения пользователя), чтобы у пользователя было достаточно информации для ответа. Когда пользователь отвечает через {@link android.support.v4.app.RemoteInput}, добавьте текст в историю ответов, применив метод {@code setRemoteInputHistory()}.
Android N предоставляет разработчикам новый способ отображения очереди уведомлений: группы уведомлений. Они похожи на стеки уведомлений в Android Wear. Например, если приложение создает уведомления для входящих сообщений и получено несколько сообщений, объедините уведомления в одну группу. Для группировки похожих уведомлений используйте существующий метод {@link android.support.v4.app.NotificationCompat.Builder#setGroup Builder.setGroup()}.
Уведомления в группе формируют иерархию, на вершине которой находится родительское уведомление, отображающее сводную информацию о группе. Пользователь может постепенно раскрывать группу уведомлений, при этом система показывает дополнительные сведения. Если пользователь раскрывает группу, система отображает больше информации о всех дочерних уведомлениях. Если же пользователь развернет одно из уведомлений, его содержимое показывается полностью.
Рисунок 3. Пользователь может постепенно раскрывать группу уведомлений.
Добавление уведомлений в группу описано в разделе Добавление каждого уведомления в группу.
В этом разделе описываются рекомендации по использованию групп уведомлений вместо уведомлений {@link android.app.Notification.InboxStyle InboxStyle}, которые были доступны в предыдущих версиях платформы Android.
Вам следует использовать группы уведомлений, только если выполняются все следующие условия.
Примером использования групп уведомлений может служить приложение для обмена сообщениями, которое показывает список входящих сообщений, или почтовое приложение, отображающее список полученных писем.
К примерам ситуаций, когда предпочтительнее использовать одно уведомление, относятся отдельные сообщения от одного пользователя или списочное представление однострочных текстовых элементов. Для них можно использовать {@link android.app.Notification.InboxStyle InboxStyle} или {@link android.app.Notification.BigTextStyle BigTextStyle}.
Приложение всегда должно публиковать сводную информацию группы, даже если эта группа содержит всего одно дочернее уведомление. В этом случае система не показывает сводную информацию, а непосредственно отображает это уведомление. Это обеспечивает единообразие интерфейса при пролистывании дочернего элемента группы.
Примечание. Эта версия Android N пока еще не блокирует отображение сводной информации для групп уведомлений, содержащих только один дочерний элемент. Эта возможность будет добавлена в следующих версиях Android N.
Хотя система обычно отображает дочерние уведомления в виде группы, их можно временно показывать в виде всплывающих уведомлений. Эта возможность очень удобна, так как позволяет быстро получить доступ к последнему дочернему уведомлению и связанным с ним действиям.
И группы уведомлений, и удаленный ввод входили в состав API {@link android.app.Notification} для поддержки устройств Android Wear, начиная с Android 5.0 (уровень API 21). Если вы уже использовали эти API-интерфейсы для создания уведомлений, вам нужно только убедиться, что поведение приложения соответствует описанным выше рекомендациям, и рассмотреть возможность реализации {@code setRemoteInputHistory()}.
Для поддержки обратной совместимости те же API-интерфейсы доступны в классе {@link android.support.v4.app.NotificationCompat} вспомогательной библиотеки, что позволяет реализовать уведомления, работающие в предыдущих версиях Android. На смартфонах и планшетах пользователи видят только сводное уведомление, поэтому в приложении все равно должно быть уведомление в стиле Inbox или аналогичное уведомление, содержащее всю информацию о группе. Так как устройства Android Wear позволяют пользователям видеть все дочерние уведомления даже на более ранних уровнях платформы, эти уведомления следует создавать независимо от уровня API.
Начиная с Android N, вы можете настраивать представления уведомлений и по-прежнему получать системные элементы, такие как заголовки уведомлений, действия и расширяемые макеты.
Для этого в Android N добавлены следующие API-интерфейсы, позволяющие настраивать собственные представления.
Чтобы воспользоваться этим новым API-интерфейсом, вызовите метод {@code setStyle()}, передав в него нужный стиль собственного представления.
В этом фрагменте показано, как создать собственный объект уведомления с помощью метода {@code DecoratedCustomViewStyle()}.
Notification noti = new Notification.Builder()
.setSmallIcon(R.drawable.ic_stat_player)
.setLargeIcon(albumArtBitmap))
.setCustomContentView(contentView);
.setStyle(new Notification.DecoratedCustomViewStyle())
.build();