blob: 54b3bc36f5d4616a13f2de49d4f5d080d613f85d [file] [log] [blame]
page.title=Уведомления
page.tags=notifications
helpoutsWidget=true
page.image=/preview/images/notifications-card.png
trainingnavtop=true
@jd:body
<div id="qv-wrapper">
<div id="qv">
<!-- table of contents -->
<h2>Содержание:</h2>
<ol>
<li><a href="#direct">Прямой ответ</a></li>
<li><a href="#bundle">Группы уведомлений</a></li>
<li><a href="#custom">Собственные представления</a></li>
</ol>
</div>
</div>
<p>В Android N представлено несколько новых API-интерфейсов, позволяющих
публиковать заметные и интерактивные уведомления.</p>
<p>Существующий API-интерфейс уведомлений {@link android.support.v4.app.RemoteInput}
в Android N расширен для поддержки внутренних ответов на смартфонах. С помощью этой возможности
пользователи могут быстро отвечать на сообщения в панели уведомлений, не открывая приложение.</p>
<p>
Android N также позволяет группировать несколько похожих
уведомлений, чтобы они отображались как одно. Для этого в Android N используется существующий метод {@link
android.support.v4.app.NotificationCompat.Builder#setGroup
NotificationCompat.Builder.setGroup()}. Пользователи могут развернуть все
уведомления и выполнить различные действия, например ответить на сообщение
или закрыть каждое из уведомлений по отдельности в панели уведомлений.
</p>
<p>Наконец, в Android N представлены новые API-интерфейсы, позволяющие
использовать системные элементы в собственных представлениях уведомлений вашего приложения. Благодаря им
уведомления отображаются единообразно на основе
стандартных шаблонов.</p>
<p>В этом документе рассматриваются некоторые наиболее важные изменения,
которые следует учитывать при использовании новых уведомлений в приложениях.</p>
<h2 id="direct">Прямой ответ</h2>
<p>С помощью прямых ответов пользователи
Android N могут быстро отвечать на текстовые сообщения и обновлять списки задач непосредственно в интерфейсе
уведомлений. На мобильных устройствах действие внутреннего ответа обозначается
как дополнительная кнопка в уведомлении. Если пользователь набирает ответ на клавиатуре, система
прикрепляет текст ответа к намерению,
указанному для действия уведомления, и передает намерение в ваше
приложение.
<img id="fig-reply-button" src="{@docRoot}preview/images/inline-reply.png" srcset="{@docRoot}preview/images/inline-reply.png 1x,
{@docRoot}preview/images/inline-reply_2x.png 2x" width="400">
<p class="img-caption">
<strong>Рисунок 1.</strong> В Android N добавлена кнопка <strong>Reply</strong>.
</p>
<h3>Добавление действий внутренних ответов</h3>
<p>Создание действия уведомления, которое поддерживает прямой ответ:
</p>
<ol>
<li>Создайте экземпляр класса {@link android.support.v4.app.RemoteInput.Builder},
который можно добавить в действие
уведомления. Конструктор класса принимает строку, которую система использует как
ключ для введенного текста. Потом ваше приложение использует этот ключ для получения
текста.
<pre>
// 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();
</pre>
</li>
<li>Прикрепите объект {@link android.support.v4.app.RemoteInput}
к действию с помощью метода <code>addRemoteInput()</code>.
<pre>
// 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();
</pre>
</li>
<li>Примените действие к уведомлению и отправьте его.
<pre>
// 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);
</pre>
</li>
</ol>
<p> Система запрашивает у пользователя ввод ответа, если он инициирует
действие уведомления. </p>
<img id="fig-user-input" src="{@docRoot}preview/images/inline-type-reply.png" srcset="{@docRoot}preview/images/inline-type-reply.png 1x,
{@docRoot}preview/images/inline-type-reply_2x.png 2x" width="300">
<p class="img-caption">
<strong>Рисунок 2.</strong> Пользователь вводит текст в панели уведомлений.
</p>
<h3>Получение введенного пользователем текста из внутреннего ответа</h3>
<p>Получение введенного пользователем текста из интерфейса
уведомлений в операции, объявленной в намерении действия:</p>
<ol>
<li> Вызовите метод {@link android.support.v4.app.RemoteInput#getResultsFromIntent
getResultsFromIntent()}, передав намерение действия уведомления
в качестве входного параметра. Этот метод возвращает объект {@link android.os.Bundle},
содержащий текст ответа.
</li>
<pre>
Bundle remoteInput = RemoteInput.getResultsFromIntent(intent);
</pre>
<li>Запросите группу, используя ключ результата (предоставленный конструктору {@link
android.support.v4.app.RemoteInput.Builder}).
</li>
</ol>
<p>В следующем фрагменте кода показано, как метод извлекает введенный
текст из группы:</p>
<pre>
// 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;
}
</pre>
<p>Приложения могут применять логику, чтобы определить, какие действия следует выполнить с полученным
текстом.
Для интерактивных приложений (например, чатов) предоставьте больше контекста в самом уведомлении
(например, несколько строк истории чата, в том числе собственные сообщения пользователя),
чтобы у пользователя было достаточно информации для ответа.
Когда пользователь отвечает через {@link android.support.v4.app.RemoteInput},
добавьте текст в историю ответов, применив метод {@code setRemoteInputHistory()}.
</p>
<h2 id="bundle">Группы уведомлений</h2>
<p>Android N предоставляет разработчикам новый способ отображения
очереди уведомлений: <i>группы уведомлений</i>. Они похожи на
<a href="{@docRoot}training/wearables/notifications/stacks.html">стеки
уведомлений</a> в Android Wear. Например, если приложение создает уведомления
для входящих сообщений и получено несколько сообщений, объедините
уведомления в одну группу. Для группировки похожих уведомлений используйте
существующий метод {@link android.support.v4.app.NotificationCompat.Builder#setGroup
Builder.setGroup()}.</p>
<p>
Уведомления в группе формируют иерархию,
на вершине которой находится родительское уведомление, отображающее
сводную информацию о группе. Пользователь может постепенно
раскрывать группу уведомлений, при этом система показывает дополнительные
сведения. Если пользователь раскрывает группу, система отображает больше
информации о всех дочерних уведомлениях. Если же пользователь
развернет одно из уведомлений, его содержимое показывается полностью.
</p>
<img id="fig-bundles" src="{@docRoot}preview/images/bundles.png" srcset="{@docRoot}preview/images/bundles.png 1x,
{@docRoot}preview/images/bundles_2x.png 2x" width="300">
<p class="img-caption">
<strong>Рисунок 3.</strong> Пользователь может постепенно раскрывать группу уведомлений.
</p>
<p>Добавление уведомлений в группу описано в разделе
<a href="{@docRoot}training/wearables/notifications/stacks.html#AddGroup">Добавление
каждого уведомления в группу</a>.</p>
<h3 id="best-practices">Рекомендации по работе с группами уведомлений</h3>
<p>В этом разделе описываются рекомендации по использованию групп
уведомлений вместо уведомлений {@link android.app.Notification.InboxStyle InboxStyle},
которые были доступны в предыдущих версиях платформы
Android.</p>
<h3>Ситуации, в которых следует использовать группы уведомлений</h3>
<p>Вам следует использовать группы уведомлений, только если выполняются
все следующие условия.</p>
<ul>
<li>Дочерние уведомления являются полноценными уведомлениями, которые можно
показать отдельно без сводной информации о группе.</li>
<li>Отображение дочерних уведомлений по отдельности имеет смысл. Например:
</li>
<ul>
<li>в дочерних уведомлениях можно выполнять какие-либо соответствующие им действия;</li>
<li>дочернему уведомлению предшествует больше информации, чем требуется пользователю.</li>
</ul>
</ul>
<p>Примером использования групп уведомлений может служить приложение
для обмена сообщениями, которое показывает список входящих сообщений,
или почтовое приложение, отображающее список полученных писем.</p>
<p>
К примерам ситуаций, когда предпочтительнее использовать одно
уведомление, относятся отдельные сообщения от одного пользователя или
списочное представление однострочных текстовых элементов. Для них можно использовать
{@link android.app.Notification.InboxStyle InboxStyle} или
{@link android.app.Notification.BigTextStyle BigTextStyle}.
</p>
<h3 id ="post">Отображение группы уведомлений</h3>
<p>
Приложение всегда должно публиковать сводную информацию группы, даже если эта группа содержит
всего одно дочернее уведомление. В этом случае система не показывает сводную информацию, а
непосредственно отображает это уведомление. Это обеспечивает
единообразие интерфейса при
пролистывании дочернего элемента группы.
</p>
<p class="note">
<strong>Примечание.</strong> Эта версия Android N пока еще не
блокирует отображение сводной информации для групп уведомлений, содержащих только один дочерний элемент. Эта
возможность будет добавлена в следующих версиях Android N.
</p>
<h3>Всплывающие уведомления</h3>
<p>Хотя система обычно отображает дочерние уведомления в виде группы,
их можно временно показывать в виде
<a href="{@docRoot}guide/topics/ui/notifiers/notifications.html#Heads-up">всплывающих
уведомлений</a>. Эта возможность очень удобна, так как позволяет
быстро получить доступ к последнему дочернему уведомлению и связанным с ним действиям.
</p>
<h3>Обратная совместимость</h3>
<p>
И группы уведомлений, и удаленный ввод входили в состав API {@link
android.app.Notification} для поддержки устройств
Android Wear, начиная с Android 5.0 (уровень API 21). Если вы уже использовали эти API-интерфейсы для создания уведомлений,
вам нужно только убедиться, что поведение приложения соответствует
описанным выше рекомендациям, и рассмотреть возможность реализации {@code
setRemoteInputHistory()}.
</p>
<p>
Для поддержки обратной совместимости те же API-интерфейсы доступны в
классе {@link android.support.v4.app.NotificationCompat}
вспомогательной библиотеки, что позволяет реализовать уведомления, работающие в предыдущих версиях Android.
На смартфонах и планшетах пользователи видят только сводное уведомление,
поэтому в приложении все равно должно быть уведомление
в стиле Inbox или аналогичное уведомление, содержащее всю информацию о группе. Так как устройства Android
Wear позволяют пользователям видеть все дочерние уведомления даже
на более ранних уровнях платформы, эти уведомления следует создавать независимо от уровня API.
</p>
<h2 id="custom"> Собственные представления</h2>
<p>Начиная с Android N, вы можете настраивать представления уведомлений
и по-прежнему получать системные элементы, такие как заголовки уведомлений, действия и
расширяемые макеты.</p>
<p>Для этого в Android N добавлены следующие API-интерфейсы, позволяющие
настраивать собственные представления.</p>
<dl>
<dt>
{@code DecoratedCustomViewStyle()}</dt>
<dd> Определяет стиль для всех уведомлений, кроме
уведомлений мультимедиа.</dd>
<dt>
{@code DecoratedMediaCustomViewStyle()}</dt>
<dd> Определяет стиль для уведомлений мультимедиа.</dd>
</dl>
<p>Чтобы воспользоваться этим новым API-интерфейсом, вызовите метод {@code setStyle()}, передав в него
нужный стиль собственного представления.</p>
<p>В этом фрагменте показано, как создать собственный объект уведомления с помощью метода
{@code DecoratedCustomViewStyle()}.</p>
<pre>
Notification noti = new Notification.Builder()
.setSmallIcon(R.drawable.ic_stat_player)
.setLargeIcon(albumArtBitmap))
.setCustomContentView(contentView);
.setStyle(new Notification.DecoratedCustomViewStyle())
.build();
</pre>