Локальные уведомления в Android

В этом разделе показано, как реализовать локальные уведомления в Xamarin.Android. Он объясняет различные элементы пользовательского интерфейса уведомления Android и обсуждает API, участвующий в создании и отображении уведомления.

Общие сведения о локальных уведомлениях

Android предоставляет две управляемые системой области для отображения значков уведомлений и сведений о уведомлениях пользователю. При первой публикации уведомления его значок отображается в области уведомлений, как показано на следующем снимке экрана:

Example notification area on a device

Чтобы получить сведения об уведомлении, пользователь может открыть ящик уведомлений (который расширяет каждый значок уведомления для отображения содержимого уведомления) и выполнять все действия, связанные с уведомлениями. На следующем снимке экрана показан ящик уведомлений, соответствующий области уведомлений, показанной выше:

Example notification drawer displaying three notifications

Уведомления Android используют два типа макетов:

  • Базовый макет — компактный, фиксированный формат презентации.

  • Развернутый макет — формат презентации, который может расшириться до большего размера, чтобы отобразить дополнительные сведения.

Каждый из этих типов макетов (и способ их создания) описан в следующих разделах.

Примечание.

В этом руководстве рассматриваются API NotificationCompat из библиотеки поддержки Android. Эти API обеспечивают максимальную обратную совместимость с Android 4.0 (уровень API 14).

Базовый макет

Все уведомления Android основаны на базовом формате макета, который, как минимум, включает следующие элементы:

  1. Значок уведомления, представляющий исходное приложение или тип уведомления, если приложение поддерживает различные типы уведомлений.

  2. Название уведомления или имя отправителя, если уведомление является личным сообщением.

  3. Сообщение уведомления.

  4. Метка времени.

Эти элементы отображаются на следующей схеме:

Location of notification elements

Базовые макеты ограничены 64 плотностью независимо от плотности пикселей (dp) в высоту. Android создает этот базовый стиль уведомлений по умолчанию.

При необходимости уведомления могут отображать большой значок, представляющий приложение или фотографию отправителя. Если большой значок используется в уведомлении в Android 5.0 и более поздних версиях, маленький значок уведомления отображается в виде значка на большом значке:

Simple notification photo

Начиная с Android 5.0 уведомления также могут отображаться на экране блокировки:

Example lock screen notification

Пользователь может дважды коснитесь уведомления на экране блокировки, чтобы разблокировать устройство и перейти к приложению, которое возникло это уведомление, или проведите пальцем, чтобы закрыть уведомление. Приложения могут задать уровень видимости уведомления для управления тем, что отображается на экране блокировки, и пользователи могут выбрать, следует ли разрешать отображение конфиденциального содержимого в уведомлениях экрана блокировки.

Android 5.0 представил формат презентации с высоким приоритетом под названием Heads-up. Уведомления с головой вниз от верхней части экрана в течение нескольких секунд, а затем отступают обратно в область уведомлений:

Example heads-up notification

Уведомления о головах позволяют системный пользовательский интерфейс помещать важную информацию перед пользователем, не нарушая состояние текущего выполняемого действия.

Android включает поддержку метаданных уведомлений, чтобы отсортировать и отобразить уведомления интеллектуально. Метаданные уведомлений также управляют тем, как уведомления отображаются на экране блокировки и в формате "Головы". Приложения могут задавать следующие типы метаданных уведомлений:

  • Приоритет — уровень приоритета определяет, как и когда отображаются уведомления. Например, в Android 5.0 уведомления с высоким приоритетом отображаются в виде уведомлений о головах.

  • Видимость — указывает, сколько содержимого уведомления должно отображаться при отображении уведомления на экране блокировки.

  • Категория — сообщает системе, как обрабатывать уведомление в различных обстоятельствах, например, когда устройство находится в режиме "Не беспокоить ".

Примечание.

Видимость и категория появились в Android 5.0 и недоступны в более ранних версиях Android. Начиная с Android 8.0 каналы уведомлений используются для управления тем, как уведомления представлены пользователю.

Развернутые макеты

Начиная с Android 4.1, уведомления можно настроить с расширенными стилями макета, которые позволяют пользователю расширить высоту уведомления для просмотра большего количества содержимого. Например, в следующем примере показано расширенное уведомление о макете в контрактном режиме:

Contracted notification

При развертывании этого уведомления отображается все сообщение:

Expanded notification

Android поддерживает три расширенных стиля макета для уведомлений с одним событием:

  • Большой текст — в контрактном режиме отображает фрагмент первой строки сообщения, за которым следует два периода. В развернутом режиме отображается все сообщение (как показано в приведенном выше примере).

  • В папке "Входящие" — в контрактном режиме отображается количество новых сообщений. В развернутом режиме отображается первое сообщение электронной почты или список сообщений в папке "Входящие".

  • Изображение — в контрактном режиме отображает только текст сообщения. В развернутом режиме отображается текст и изображение.

Помимо базового уведомления (далее в этой статье) объясняется, как создавать уведомления о большом тексте, папке "Входящие" и "Изображения ".

Каналы уведомлений

Начиная с Android 8.0 (Oreo), вы можете использовать функцию каналов уведомлений для создания настраиваемого пользователем канала для каждого типа уведомления, которое требуется отобразить. Каналы уведомлений позволяют группировать уведомления, чтобы все уведомления, размещенные в канале, отображали одинаковое поведение. Например, у вас может быть канал уведомлений, предназначенный для уведомлений, требующих немедленного внимания, и отдельный "тихий" канал, используемый для информационных сообщений.

Приложение YouTube, установленное с Android Oreo, содержит две категории уведомлений: "Скачать уведомления" и "Общие уведомления":

Notification screens for YouTube in Android Oreo

Каждая из этих категорий соответствует каналу уведомлений. Приложение YouTube реализует канал уведомлений загрузки и канал "Общие уведомления ". Пользователь может касаться уведомлений о скачивании, в котором отображается экран параметров для канала уведомлений о скачивании приложения:

Download notifications screen for the YouTube app

На этом экране пользователь может изменить поведение канала уведомлений загрузки , выполнив следующие действия:

  • Задайте для уровня важности значение "Срочный", "Высокий", "Средний" или "Низкий", которое настраивает уровень прерывания звука и визуального прерывания.

  • Включите или отключите точку уведомления.

  • Включите или отключите мигающий свет.

  • Отображение или скрытие уведомлений на экране блокировки.

  • Переопределите параметр "Не беспокоить ".

Канал "Общие уведомления" имеет аналогичные параметры:

General notifications screen for the YouTube app

Обратите внимание, что у вас нет абсолютного контроля над взаимодействием каналов уведомлений с пользователем— пользователь может изменить параметры для любого канала уведомлений на устройстве, как показано на снимках экрана выше. Однако можно настроить значения по умолчанию (как описано ниже). Как показано в этих примерах, новая функция каналов уведомлений позволяет пользователям точно контролировать различные виды уведомлений.

Создание уведомлений

Чтобы создать уведомление в Android, используйте класс NotificationCompat.Builder из пакета NuGet Xamarin.Android.Support.v4 . Этот класс позволяет создавать и публиковать уведомления в более ранних версиях Android. NotificationCompat.Builder также обсуждается.

NotificationCompat.Builder предоставляет методы для настройки различных параметров в уведомлении, таких как:

  • Содержимое, включая заголовок, текст сообщения и значок уведомления.

  • Стиль уведомления, например "Большой текст", "Входящие" или "Стиль изображения ".

  • Приоритет уведомления: минимальный, низкий, по умолчанию, высокий или максимальный. В Android 8.0 и выше приоритет устанавливается через канал уведомлений.

  • Видимость уведомления на экране блокировки: общедоступная, частная или секретная.

  • Метаданные категорий, которые помогают Android классифицировать и фильтровать уведомление.

  • Необязательное намерение, указывающее действие для запуска при нажатии уведомления.

  • Идентификатор канала уведомлений, в котором будет опубликовано уведомление (Android 8.0 и выше).

После настройки этих параметров в построителе создается объект уведомления, содержащий параметры. Чтобы опубликовать уведомление, передайте этот объект уведомления диспетчеру уведомлений. Android предоставляет класс NotificationManager , который отвечает за публикацию уведомлений и отображение их пользователю. Ссылку на этот класс можно получить из любого контекста, например действия или службы.

Создание канала уведомлений

Приложения, работающие в Android 8.0, должны создавать канал уведомлений для их уведомлений. Для канала уведомлений требуются следующие три фрагмента информации:

  • Строка идентификатора, уникальная для пакета, который будет определять канал.
  • Имя канала, отображаемого пользователю. Имя должно быть от одного до 40 символов.
  • Важность канала.

Приложениям потребуется проверка версию Android, которую они работают. Устройства с версиями, работающими старше Android 8.0, не должны создавать канал уведомлений. Следующий метод является одним из примеров создания канала уведомлений в действии:

void CreateNotificationChannel()
{
    if (Build.VERSION.SdkInt < BuildVersionCodes.O)
    {
        // Notification channels are new in API 26 (and not a part of the
        // support library). There is no need to create a notification
        // channel on older versions of Android.
        return;
    }

    var channelName = Resources.GetString(Resource.String.channel_name);
    var channelDescription = GetString(Resource.String.channel_description);
    var channel = new NotificationChannel(CHANNEL_ID, channelName, NotificationImportance.Default)
                  {
                      Description = channelDescription
                  };

    var notificationManager = (NotificationManager) GetSystemService(NotificationService);
    notificationManager.CreateNotificationChannel(channel);
}

Канал уведомлений должен создаваться при каждом создании действия. CreateNotificationChannel Для метода его следует вызывать в OnCreate методе действия.

Создание и публикация уведомления

Чтобы создать уведомление в Android, выполните следующие действия.

  1. Создадите экземпляр объекта NotificationCompat.Builder.

  2. Вызовите различные методы объекта для NotificationCompat.Builder задания параметров уведомлений.

  3. Вызовите метод NotificationCompat.Builder Build объекта, чтобы создать экземпляр объекта уведомления.

  4. Вызовите метод notification диспетчера уведомлений, чтобы опубликовать уведомление.

Для каждого уведомления необходимо указать по крайней мере следующие сведения:

  • Маленький значок (размер 24x24 dp)

  • Короткое название

  • Текст уведомления

В следующем примере кода показано, как создать NotificationCompat.Builder базовое уведомление. Обратите внимание, что NotificationCompat.Builder методы поддерживают цепочку методов. То есть каждый метод возвращает объект построителя, чтобы использовать результат последнего вызова метода для вызова следующего вызова метода:

// Instantiate the builder and set notification elements:
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID)
    .SetContentTitle ("Sample Notification")
    .SetContentText ("Hello World! This is my first notification!")
    .SetSmallIcon (Resource.Drawable.ic_notification);

// Build the notification:
Notification notification = builder.Build();

// Get the notification manager:
NotificationManager notificationManager =
    GetSystemService (Context.NotificationService) as NotificationManager;

// Publish the notification:
const int notificationId = 0;
notificationManager.Notify (notificationId, notification);

В этом примере создается экземпляр нового NotificationCompat.Builder объекта builder , а также идентификатор используемого канала уведомлений. Заголовок и текст уведомления задаются, а значок уведомления загружается из ресурсов/рисования/ic_notification.png. Вызов метода построителя Build уведомлений создает объект уведомления с этими параметрами. Следующим шагом является вызов Notify метода диспетчера уведомлений. Чтобы найти диспетчер уведомлений, вызовите GetSystemService, как показано выше.

Метод Notify принимает два параметра: идентификатор уведомления и объект уведомления. Идентификатор уведомления — это уникальное целое число, определяющее уведомление для приложения. В этом примере идентификатор уведомления равен нулю (0); однако в рабочем приложении необходимо предоставить каждому уведомлению уникальный идентификатор. Повторное использованием предыдущего значения идентификатора в вызове приводит к Notify перезаписи последнего уведомления.

Когда этот код выполняется на устройстве Android 5.0, он создает уведомление, которое выглядит следующим образом:

Notification result for the sample code

Значок уведомления отображается в левой части уведомления — это изображение круглого "i" канала, чтобы Android может нарисовать серый циклический фон за ним. Вы также можете предоставить значок без альфа-канала. Чтобы отобразить фотографию в виде значка, см . раздел "Формат большого значка" далее в этом разделе.

Метка времени устанавливается автоматически, но вы можете переопределить этот параметр, вызвав метод SetWhen построителя уведомлений. Например, следующий пример кода задает метку времени в текущее время:

builder.SetWhen (Java.Lang.JavaSystem.CurrentTimeMillis());

Включение звука и вибрации

Если вы хотите, чтобы уведомление также воспроизводилось звуком, можно вызвать метод SetDefaults построителя уведомлений и передать флагNotificationDefaults.Sound:

// Instantiate the notification builder and enable sound:
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID)
    .SetContentTitle ("Sample Notification")
    .SetContentText ("Hello World! This is my first notification!")
    .SetDefaults (NotificationDefaults.Sound)
    .SetSmallIcon (Resource.Drawable.ic_notification);

Этот вызов приведет к тому, что SetDefaults устройство будет воспроизводить звук при публикации уведомления. Если вы хотите, чтобы устройство вибрирует, а не воспроизводит звук, вы можете передать NotificationDefaults.VibrateSetDefaults. его, если вы хотите, чтобы устройство воспроизводилось звуком и вибрируете устройство, вы можете передать оба флага SetDefaultsв:

builder.SetDefaults (NotificationDefaults.Sound | NotificationDefaults.Vibrate);

Если вы включаете звук без указания звука для воспроизведения, Android использует системный звук уведомления по умолчанию. Однако вы можете изменить звук, который будет воспроизводиться путем вызова метода SetSound построителя уведомлений. Например, чтобы воспроизвести звук сигнализации с уведомлением (вместо звука уведомления по умолчанию), вы можете получить универсальный код ресурса (URI) для звука сигнализации из RingtoneManager и передать его SetSoundв:

builder.SetSound (RingtoneManager.GetDefaultUri(RingtoneType.Alarm));

Кроме того, для уведомления можно использовать звук звонка по умолчанию по умолчанию:

builder.SetSound (RingtoneManager.GetDefaultUri(RingtoneType.Ringtone));

После создания объекта уведомления можно задать свойства уведомлений для объекта уведомления (а не настроить их заранее с помощью NotificationCompat.Builder методов). Например, вместо вызова SetDefaults метода для включения вибрации в уведомлении можно напрямую изменить битовый флаг свойства Defaults уведомления:

// Build the notification:
Notification notification = builder.Build();

// Turn on vibrate:
notification.Defaults |= NotificationDefaults.Vibrate;

В этом примере устройство вибрирует при публикации уведомления.

Обновление уведомления

Если вы хотите обновить содержимое уведомления после публикации, можно повторно использовать существующий NotificationCompat.Builder объект, чтобы создать новый объект уведомления и опубликовать это уведомление с идентификатором последнего уведомления. Например:

// Update the existing notification builder content:
builder.SetContentTitle ("Updated Notification");
builder.SetContentText ("Changed to this message.");

// Build a notification object with updated content:
notification = builder.Build();

// Publish the new notification with the existing ID:
notificationManager.Notify (notificationId, notification);

В этом примере существующий NotificationCompat.Builder объект используется для создания нового объекта уведомления с другим заголовком и сообщением. Новый объект уведомления публикуется с помощью идентификатора предыдущего уведомления и обновляет содержимое ранее опубликованного уведомления:

Updated notification

Текст предыдущего уведомления повторно используется — только заголовок и текст уведомления изменяется, пока уведомление отображается в ящике уведомлений. Текст заголовка изменяется с "Пример уведомления" на "Обновленное уведомление" и текст сообщения изменяется с "Hello World! Это мое первое уведомление!" на "Изменено на это сообщение".

Уведомление остается видимым до тех пор, пока не произойдет одно из трех действий:

  • Пользователь закрывает уведомление (или нажимает кнопку "Очистить все").

  • Приложение вызывает NotificationManager.Cancelуникальный идентификатор уведомления, назначенный при публикации уведомления.

  • Вызовы NotificationManager.CancelAllприложения.

Дополнительные сведения об обновлении уведомлений Android см. в разделе "Изменение уведомления".

Запуск действия из уведомления

В Android обычно уведомление связывается с действием — действие, которое запускается при касании уведомления. Это действие может находиться в другом приложении или даже в другой задаче. Чтобы добавить действие в уведомление, создайте объект PendingIntent и свяжите PendingIntent его с уведомлением. Это PendingIntent особый тип намерения, который позволяет приложению-получателю запускать предопределенный фрагмент кода с разрешениями отправляющего приложения. Когда пользователь нажимает уведомление, Android запускает действие, указанное в параметре PendingIntent.

В следующем фрагменте кода показано, как создать уведомление с PendingIntent помощью действия исходного приложения: MainActivity

// Set up an intent so that tapping the notifications returns to this app:
Intent intent = new Intent (this, typeof(MainActivity));

// Create a PendingIntent; we're only using one PendingIntent (ID = 0):
const int pendingIntentId = 0;
PendingIntent pendingIntent =
    PendingIntent.GetActivity (this, pendingIntentId, intent, PendingIntentFlags.OneShot);

// Instantiate the builder and set notification elements, including pending intent:
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID)
    .SetContentIntent (pendingIntent)
    .SetContentTitle ("Sample Notification")
    .SetContentText ("Hello World! This is my first action notification!")
    .SetSmallIcon (Resource.Drawable.ic_notification);

// Build the notification:
Notification notification = builder.Build();

// Get the notification manager:
NotificationManager notificationManager =
    GetSystemService (Context.NotificationService) as NotificationManager;

// Publish the notification:
const int notificationId = 0;
notificationManager.Notify (notificationId, notification);

Этот код очень похож на код уведомления в предыдущем разделе, за исключением того, что он PendingIntent добавляется в объект уведомления. В этом примере PendingIntent он связан с действием исходного приложения перед передачей в метод SetContentIntent построителя уведомлений. Флаг PendingIntentFlags.OneShot передается методу PendingIntent.GetActivity , чтобы PendingIntent он использовался только один раз. При выполнении этого кода отображается следующее уведомление:

First action notification

При нажатии этого уведомления пользователь вернется к исходному действию.

В рабочем приложении приложение должно обрабатывать стек назад, когда пользователь нажимает кнопку "Назад " в действии уведомления (если вы не знакомы с задачами Android и стеком назад, см . статью "Задачи и стек назад"). В большинстве случаев переход из действия уведомления должен вернуть пользователя из приложения и вернуться на начальный экран. Чтобы управлять стеком назад, приложение использует класс TaskStackBuilder для создания PendingIntent стека с задней частью.

Другое реальное соображение заключается в том, что исходное действие может потребоваться отправить данные в действие уведомления. Например, уведомление может указывать на то, что текстовое сообщение получено, а действие уведомления (экран просмотра сообщений) требует идентификатор сообщения для отображения сообщения пользователю. Действие, создающее PendingIntentметод Intent.PutExtra для добавления данных (например, строки) в намерение, чтобы эти данные передаются в действие уведомления.

В следующем примере кода показано, как использовать TaskStackBuilder для управления стеком назад, и в нем приведен пример отправки одной строки сообщения в действие SecondActivityуведомления:

// Setup an intent for SecondActivity:
Intent secondIntent = new Intent (this, typeof(SecondActivity));

// Pass some information to SecondActivity:
secondIntent.PutExtra ("message", "Greetings from MainActivity!");

// Create a task stack builder to manage the back stack:
TaskStackBuilder stackBuilder = TaskStackBuilder.Create(this);

// Add all parents of SecondActivity to the stack:
stackBuilder.AddParentStack (Java.Lang.Class.FromType (typeof (SecondActivity)));

// Push the intent that starts SecondActivity onto the stack:
stackBuilder.AddNextIntent (secondIntent);

// Obtain the PendingIntent for launching the task constructed by
// stackbuilder. The pending intent can be used only once (one shot):
const int pendingIntentId = 0;
PendingIntent pendingIntent =
    stackBuilder.GetPendingIntent (pendingIntentId, PendingIntentFlags.OneShot);

// Instantiate the builder and set notification elements, including
// the pending intent:
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID)
    .SetContentIntent (pendingIntent)
    .SetContentTitle ("Sample Notification")
    .SetContentText ("Hello World! This is my second action notification!")
    .SetSmallIcon (Resource.Drawable.ic_notification);

// Build the notification:
Notification notification = builder.Build();

// Get the notification manager:
NotificationManager notificationManager =
    GetSystemService (Context.NotificationService) as NotificationManager;

// Publish the notification:
const int notificationId = 0;
notificationManager.Notify (notificationId, notification);

В этом примере кода приложение состоит из двух действий: MainActivity (который содержит приведенный выше код уведомления), а SecondActivityэкран, который пользователь видит после нажатия уведомления. При выполнении этого кода отображается простое уведомление (аналогично предыдущему примеру). При нажатии на уведомление пользователь перейдет на SecondActivity экран:

Second activity screenshot

Строковое сообщение (передано в метод намерения PutExtra ) извлекается через SecondActivity следующую строку кода:

// Get the message from the intent:
string message = Intent.Extras.GetString ("message", "");

Это полученное сообщение "Приветствие от MainActivity!", отображается на SecondActivity экране, как показано на снимке экрана выше. Когда пользователь нажимает кнопку "Назад " SecondActivity, навигация выходит из приложения и возвращается на экран, предшествующий запуску приложения.

Дополнительные сведения о создании ожидающих намерений см. в разделе PendingIntent.

За пределами базового уведомления

Уведомления по умолчанию — простой базовый формат макета в Android, но вы можете улучшить этот базовый формат, выполнив дополнительные NotificationCompat.Builder вызовы методов. В этом разделе вы узнаете, как добавить большой значок фотографии в уведомление, и вы увидите примеры создания развернутых уведомлений макета.

Формат большого значка

Уведомления Android обычно отображают значок исходного приложения (слева от уведомления). Однако уведомления могут отображать изображение или фотографию ( большой значок) вместо стандартного небольшого значка. Например, приложение для обмена сообщениями может отображать фотографию отправителя, а не значок приложения.

Ниже приведен пример базового уведомления Android 5.0. Он отображает только маленький значок приложения:

Example normal notification

И вот снимок экрана: уведомление после изменения, отображающего большой значок, использует значок, созданный на основе изображения обезьяны кода Xamarin:

Example large icon notification

Обратите внимание, что при отображении уведомления в большом формате значка маленький значок приложения отображается в виде значка в правом нижнем углу большого значка.

Чтобы использовать изображение как большой значок в уведомлении, вызовите метод SetLargeIcon построителя уведомлений и передайте растровое изображение изображения. В отличие от SetSmallIconэтого, SetLargeIcon принимает только растровое изображение. Чтобы преобразовать файл изображения в растровое изображение, используйте класс BitmapFactory . Например:

builder.SetLargeIcon (BitmapFactory.DecodeResource (Resources, Resource.Drawable.monkey_icon));

Этот пример кода открывает файл изображения в Resources/drawable/monkey_icon.png, преобразует его в растровое изображение и передает результирующее растровое изображение NotificationCompat.Builderв . Как правило, разрешение исходного изображения больше небольшого значка, но не намного больше. Изображение, слишком большое, может привести к ненужным операциям изменения размера, которые могут отложить размещение уведомления.

Стиль большого текста

Стиль большого текста — это расширенный шаблон макета, используемый для отображения длинных сообщений в уведомлениях. Как и все развернутые уведомления о макете, уведомление большого текста изначально отображается в компактном формате презентации:

Example Big Text notification

В этом формате отображается только фрагмент сообщения, завершаемый двумя периодами. Когда пользователь перетаскивает уведомление вниз, он расширяется, чтобы отобразить все сообщение об уведомлении:

Expanded Big Text notification

Этот расширенный формат макета также содержит сводный текст в нижней части уведомления. Максимальная высота уведомления "Большой текст" составляет 256 dp.

Чтобы создать уведомление big Text , создайте экземпляр NotificationCompat.Builder объекта, как и раньше, а затем создадите экземпляр и добавьте объект BigTextStyle в NotificationCompat.Builder объект. Рассмотрим пример:

// Instantiate the Big Text style:
Notification.BigTextStyle textStyle = new Notification.BigTextStyle();

// Fill it with text:
string longTextMessage = "I went up one pair of stairs.";
longTextMessage += " / Just like me. ";
//...
textStyle.BigText (longTextMessage);

// Set the summary text:
textStyle.SetSummaryText ("The summary text goes here.");

// Plug this style into the builder:
builder.SetStyle (textStyle);

// Create the notification and publish it ...

В этом примере текст сообщения и сводный текст хранятся в объекте (textStyle) перед передачей BigTextStyle вNotificationCompat.Builder.

Стиль изображения

Стиль изображения (также называемый стилем большого рисунка ) — это расширенный формат уведомлений, который можно использовать для отображения изображения в тексте уведомления. Например, приложение снимка экрана или фото приложение может использовать стиль уведомления "Изображение ", чтобы предоставить пользователю уведомление о последнем изображении, которое было записано. Обратите внимание, что максимальная высота уведомления об изображении составляет 256 dp — Android изменит размер изображения, чтобы он соответствовал этому максимальному ограничению высоты, в пределах доступной памяти.

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

Compact image notification shows no image

Когда пользователь перетаскивает уведомление "Изображение ", он расширяется, чтобы отобразить изображение. Например, ниже приведена расширенная версия предыдущего уведомления:

Expanded image notification reveals image

Обратите внимание, что при отображении уведомления в компактном формате отображается текст уведомления (текст, передаваемый методу построителя SetContentText уведомлений, как показано ранее). Однако при развертывании уведомления для отображения изображения отображается сводный текст над изображением.

Чтобы создать уведомление Image , создайте экземпляр NotificationCompat.Builder объекта, как и раньше, а затем создадите и вставьте объект BigPictureStyle в NotificationCompat.Builder объект. Например:

// Instantiate the Image (Big Picture) style:
Notification.BigPictureStyle picStyle = new Notification.BigPictureStyle();

// Convert the image to a bitmap before passing it into the style:
picStyle.BigPicture (BitmapFactory.DecodeResource (Resources, Resource.Drawable.x_bldg));

// Set the summary text that will appear with the image:
picStyle.SetSummaryText ("The summary text goes here.");

// Plug this style into the builder:
builder.SetStyle (picStyle);

// Create the notification and publish it ...

Как и метод SetLargeIconNotificationCompat.Builder, методу BigPictureBigPictureStyle требуется точечный рисунок изображения, которое должно отображаться в тексте уведомления. В этом примере метод BitmapFactory DecodeResource считывает файл изображения, расположенный в resources/drawable/x_bldg.png, и преобразует его в растровое изображение.

Вы также можете отображать изображения, которые не упаковываются в качестве ресурса. Например, следующий пример кода загружает изображение из локальной карта SD и отображает его в уведомлении о изображении:

// Using the Image (Big Picture) style:
Notification.BigPictureStyle picStyle = new Notification.BigPictureStyle();

// Read an image from the SD card, subsample to half size:
BitmapFactory.Options options = new BitmapFactory.Options();
options.InSampleSize = 2;
string imagePath = "/sdcard/Pictures/my-tshirt.jpg";
picStyle.BigPicture (BitmapFactory.DecodeFile (imagePath, options));

// Set the summary text that will appear with the image:
picStyle.SetSummaryText ("Check out my new T-Shirt!");

// Plug this style into the builder:
builder.SetStyle (picStyle);

// Create notification and publish it ...

В этом примере файл изображения, расположенный по адресу /sd карта/Pictures/my-tshirt.jpg, загружается, изменяется на половину исходного размера, а затем преобразуется в растровое изображение для использования в уведомлении:

Example T-shirt image in notification

Если вы заранее не знаете размер файла изображения, рекомендуется упаковать вызов BitmapFactory.DecodeFile в обработчик исключений. OutOfMemoryError Исключение может быть вызвано, если изображение слишком велико для изменения размера Android.

Дополнительные сведения о загрузке и декодировании больших растровых изображений см. в разделе "Эффективная загрузка больших растровых карт".

Стиль папки "Входящие"

Формат папки "Входящие" — это развернутый шаблон макета, предназначенный для отображения отдельных строк текста (например, сводки по электронной почте) в тексте уведомления. Уведомление о формате папки "Входящие" сначала отображается в компактном формате:

Example compact inbox notification

Когда пользователь перетаскивает уведомление, он расширяется, чтобы отобразить сводку по электронной почте, как показано на снимке экрана ниже:

Example inbox notification expanded

Чтобы создать уведомление папки «Входящие», создайте экземпляр NotificationCompat.Builder объекта, как и раньше, и добавьте InboxStyle в NotificationCompat.Builder. Рассмотрим пример:

// Instantiate the Inbox style:
Notification.InboxStyle inboxStyle = new Notification.InboxStyle();

// Set the title and text of the notification:
builder.SetContentTitle ("5 new messages");
builder.SetContentText ("chimchim@xamarin.com");

// Generate a message summary for the body of the notification:
inboxStyle.AddLine ("Cheeta: Bananas on sale");
inboxStyle.AddLine ("George: Curious about your blog post");
inboxStyle.AddLine ("Nikko: Need a ride to Evolve?");
inboxStyle.SetSummaryText ("+2 more");

// Plug this style into the builder:
builder.SetStyle (inboxStyle);

Чтобы добавить новые строки текста в текст уведомления, вызовите метод Addline объекта (максимальная высота уведомления в папке "Входящие" составляет 256 InboxStyle dp). Обратите внимание, что в отличие от стиля "Большой текст", стиль папки "Входящие" поддерживает отдельные строки текста в тексте уведомления.

Вы также можете использовать стиль папки "Входящие" для любого уведомления, которое должно отображать отдельные строки текста в расширенном формате. Например, стиль уведомлений в папке "Входящие" можно использовать для объединения нескольких ожидающих уведомлений в сводное уведомление. Вы можете обновить одно уведомление в стиле "Входящие " с новыми строками содержимого уведомления (см . статью "Обновление уведомления выше"), а не создавать непрерывный поток новых, в основном аналогичных уведомлений.

Настройка метаданных

NotificationCompat.Builder включает методы, которые можно вызвать для задания метаданных о уведомлении, таких как приоритет, видимость и категория. Android использует эти сведения вместе с параметрами предпочтения пользователя, чтобы определить, как и когда отображать уведомления.

Параметры приоритета

Приложения, работающие в Android 7.1 и ниже, должны задать приоритет непосредственно в самом уведомлении. Параметр приоритета уведомления определяет два результата при публикации уведомления:

  • Где уведомление отображается в связи с другими уведомлениями. Например, уведомления с высоким приоритетом отображаются выше оповещений с низким приоритетом в ящике уведомлений независимо от того, когда было опубликовано каждое уведомление.

  • Отображается ли уведомление в формате уведомлений "Головы" (Android 5.0 и более поздних версий). Отображаются только уведомления с высоким и максимальным приоритетом.

Xamarin.Android определяет следующие перечисления для задания приоритета уведомлений:

  • NotificationPriority.Max — оповещает пользователя о срочном или критическом состоянии (например, входящих звонках, направлениях поворота или оповещении о чрезвычайных ситуациях). На устройствах Android 5.0 и более поздних версий уведомления о максимальном приоритете отображаются в формате "Головы".

  • NotificationPriority.High — сообщает пользователю важных событий (например, важных сообщений электронной почты или прибытия сообщений чата в режиме реального времени). На устройствах Android 5.0 и более поздних версий уведомления с высоким приоритетом отображаются в формате "Головы".

  • NotificationPriority.Default — уведомляет пользователя об условиях, имеющих средний уровень важности.

  • NotificationPriority.Low — для несрочных сведений о том, что пользователю необходимо сообщить (например, напоминания об обновлении программного обеспечения или обновления социальных сетей).

  • NotificationPriority.Min — для фоновых сведений, которые пользователь замечает только при просмотре уведомлений (например, сведения о расположении или погоде).

Чтобы задать приоритет уведомления, вызовите метод NotificationCompat.Builder SetPriority объекта, передавая уровень приоритета. Например:

builder.SetPriority (NotificationPriority.High);

В следующем примере в верхней части ящика уведомлений отображается уведомление с высоким приоритетом: "Важное сообщение!"

Example high-priority notification

Так как это уведомление с высоким приоритетом, оно также отображается в виде уведомления "Головы" над текущим экраном действия пользователя в Android 5.0:

Example Heads-up notification

В следующем примере уведомление с низким приоритетом "Мысль за день" отображается под уведомлением уровня батареи с более высоким приоритетом:

Example low-priority notification

Так как уведомление "Мысль за день" является низкоприоритетным уведомлением, Android не будет отображать его в формате "Головы".

Примечание.

В Android 8.0 и более поздних версиях приоритет канала уведомлений и параметров пользователя определяет приоритет уведомления.

Параметры видимости

Начиная с Android 5.0 , параметр видимости доступен для управления объемом содержимого уведомлений на экране безопасной блокировки. Xamarin.Android определяет следующие перечисления для настройки видимости уведомлений:

  • NotificationVisibility.Public — На экране безопасной блокировки отображается полное содержимое уведомления.

  • NotificationVisibility.Private — На экране безопасной блокировки отображаются только важные сведения (например, значок уведомления и имя приложения, размещенного в нем), но остальные сведения уведомления скрыты. Все уведомления по умолчанию NotificationVisibility.Private.

  • NotificationVisibility.Secret — На экране безопасной блокировки ничего не отображается, даже значок уведомления. Содержимое уведомления доступно только после того, как пользователь разблокирует устройство.

Чтобы задать видимость уведомления, приложения вызывают SetVisibility метод NotificationCompat.Builder объекта, передавая параметр видимости. Например, этот вызов для SetVisibility отправки уведомления Private:

builder.SetVisibility (NotificationVisibility.Private);

Private При публикации уведомления на экране безопасной блокировки отображается только имя и значок приложения. Вместо сообщения уведомления пользователь видит сообщение "Разблокировать устройство, чтобы увидеть это уведомление":

Unlock your device notification message

В этом примере NotificationsLab — это имя исходного приложения. Эта редактированная версия уведомления отображается только в том случае, если экран блокировки защищен (т. е. защищенный с помощью ПИН-кода, шаблона или пароля) — если экран блокировки не защищен, на экране блокировки доступно полное содержимое уведомления.

Параметры категории

Начиная с Android 5.0 предопределенные категории доступны для ранжирования и фильтрации уведомлений. Xamarin.Android предоставляет следующие перечисления для следующих категорий:

  • Notification.CategoryCall — входящий телефонный звонок.

  • Notification.CategoryMessage — входящее текстовое сообщение.

  • Notification.CategoryAlarm — условие тревоги или истечение срока действия таймера.

  • Notification.CategoryEmail — входящее сообщение электронной почты.

  • Notification.CategoryEvent — событие календаря.

  • Notification.CategoryPromo — рекламное сообщение или объявление.

  • Notification.CategoryProgress — Ход выполнения фоновой операции.

  • Notification.CategorySocial — обновление социальных сетей.

  • Notification.CategoryError — сбой фоновой операции или процесса проверки подлинности.

  • Notification.CategoryTransport — обновление воспроизведения мультимедиа.

  • Notification.CategorySystem — зарезервировано для использования системы (состояние системы или устройства).

  • Notification.CategoryService — указывает, что фоновая служба запущена.

  • Notification.CategoryRecommendation — сообщение рекомендации, связанное с текущим запущенным приложением.

  • Notification.CategoryStatus — сведения об устройстве.

При сортировке уведомлений приоритет уведомления имеет приоритет над параметром категории. Например, уведомление с высоким приоритетом будет отображаться как "Голова", даже если оно относится к Promo категории. Чтобы задать категорию уведомления, вызовите SetCategory метод NotificationCompat.Builder объекта, передавая параметр категории. Например:

builder.SetCategory (Notification.CategoryCall);

Функция "Не беспокоить " (новая в Android 5.0) фильтрует уведомления на основе категорий. Например, экран "Не беспокоить" в Параметры позволяет пользователю освобождать уведомления о телефонных звонках и сообщениях:

Do not disturb screen switches

Когда пользователь настраивает не беспокоить , чтобы заблокировать все прерывания, кроме телефонных звонков (как показано на снимке экрана выше), Android разрешает отображать уведомления с параметром Notification.CategoryCall категории, пока устройство находится в режиме "Не беспокоить ". Обратите внимание, что Notification.CategoryAlarm уведомления никогда не блокируются в режиме "Не беспокоить ".

В примере LocalNotifications показано, как использовать NotificationCompat.Builder для запуска второго действия из уведомления. Этот пример кода описан в пошаговом руководстве по использованию локальных уведомлений Xamarin.Android .

Стили уведомлений

Чтобы создать уведомления NotificationCompat.Builderв стиле "Большой текст", "Изображение" или "Входящие", приложение должно использовать версии этих стилей совместимости. Например, чтобы использовать стиль big Text , создайте NotificationCompat.BigTextstyleэкземпляр:

NotificationCompat.BigTextStyle textStyle = new NotificationCompat.BigTextStyle();

// Plug this style into the builder:
builder.SetStyle (textStyle);

Аналогичным образом приложение может использовать NotificationCompat.InboxStyle и для стилей "Входящие" NotificationCompat.BigPictureStyle и "Изображения" соответственно.

Приоритет и категория уведомлений

NotificationCompat.BuilderSetPriority поддерживает метод (доступен начиная с Android 4.1). SetCategory Однако метод не поддерживаетсяNotificationCompat.Builder, так как категории являются частью новой системы метаданных уведомлений, которая появилась в Android 5.0.

Чтобы поддерживать более старые версии Android, где SetCategory недоступно, код может проверка уровне API во время выполнения, чтобы условно вызыватьSetCategory, если уровень API равен или больше Android 5.0 (уровень API 21):

if (Android.OS.Build.VERSION.SdkInt >= Android.OS.BuildVersionCodes.Lollipop) {
    builder.SetCategory (Notification.CategoryEmail);
}

В этом примере для целевой платформы приложения задано значение Android 5.0, а минимальная версия Android имеет значение Android 4.1 (уровень API 16). Так как SetCategory он доступен на уровне API 21 и более поздних версий, этот пример кода будет вызываться только в том случае, если он доступен, он не будет вызываться SetCategorySetCategory , если уровень API меньше 21.

Видимость экрана блокировки

Так как Android не поддерживает уведомления о блокировке экрана до Android 5.0 (уровень API 21), NotificationCompat.Builder метод не поддерживается SetVisibility . Как описано вышеSetCategory, код может проверка уровень API во время выполнения и вызывать SetVisiblity только в том случае, если он доступен:

if (Android.OS.Build.VERSION.SdkInt >= Android.OS.BuildVersionCodes.Lollipop) {
    builder.SetVisibility (Notification.Public);
}

Итоги

В этой статье объясняется, как создавать локальные уведомления в Android. В ней описывается анатомия уведомления, в ней описывается, как создавать NotificationCompat.Builder уведомления, как создавать уведомления в больших значках, форматах большого текста, изображения и папки "Входящие", как задать параметры метаданных уведомлений, такие как приоритет, видимость и категория, а также как запустить действие из уведомления. В этой статье также описано, как эти параметры уведомлений работают с новыми окнами "Головы", "Блокировка" и "Не беспокоить " в Android 5.0. Наконец, вы узнали, как использовать NotificationCompat.Builder для обеспечения совместимости уведомлений с более ранними версиями Android.

Рекомендации по проектированию уведомлений для Android см. в разделе "Уведомления".