page.title=Уведомления page.tags=notifications helpoutsWidget=true page.image=/preview/images/notifications-card.png trainingnavtop=true @jd:body

Содержание:

  1. Прямой ответ
  2. Группы уведомлений
  3. Собственные представления

В 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.

Добавление действий внутренних ответов

Создание действия уведомления, которое поддерживает прямой ответ:

  1. Создайте экземпляр класса {@link android.support.v4.app.RemoteInput.Builder}, который можно добавить в действие уведомления. Конструктор класса принимает строку, которую система использует как ключ для введенного текста. Потом ваше приложение использует этот ключ для получения текста.
    // 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();
    
  2. Прикрепите объект {@link android.support.v4.app.RemoteInput} к действию с помощью метода 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();
    
  3. Примените действие к уведомлению и отправьте его.
    // 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. Пользователь вводит текст в панели уведомлений.

Получение введенного пользователем текста из внутреннего ответа

Получение введенного пользователем текста из интерфейса уведомлений в операции, объявленной в намерении действия:

  1. Вызовите метод {@link android.support.v4.app.RemoteInput#getResultsFromIntent getResultsFromIntent()}, передав намерение действия уведомления в качестве входного параметра. Этот метод возвращает объект {@link android.os.Bundle}, содержащий текст ответа.
  2. Bundle remoteInput = RemoteInput.getResultsFromIntent(intent);
    
  3. Запросите группу, используя ключ результата (предоставленный конструктору {@link android.support.v4.app.RemoteInput.Builder}).

В следующем фрагменте кода показано, как метод извлекает введенный текст из группы:

// 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-интерфейсы, позволяющие настраивать собственные представления.

{@code DecoratedCustomViewStyle()}
Определяет стиль для всех уведомлений, кроме уведомлений мультимедиа.
{@code DecoratedMediaCustomViewStyle()}
Определяет стиль для уведомлений мультимедиа.

Чтобы воспользоваться этим новым 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();