Пошаговое руководство. Использование локальных уведомлений в Xamarin.Android

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

Обзор

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

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

Примеры снимков экрана с уведомлением

Примечание.

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

Создание проекта

Для начала создадим проект Android с помощью шаблона приложения Android. Давайте вызовем этот проект LocalNotifications. (Если вы не знакомы с созданием проектов Xamarin.Android, см. статью Привет, Android.)

Измените значения файла ресурсов/Strings.xml , чтобы он содержал два дополнительных строковых ресурса, которые будут использоваться при создании канала уведомлений:

<?xml version="1.0" encoding="utf-8"?>

<resources>
  <string name="Hello">Hello World, Click Me!</string>
  <string name="ApplicationName">Notifications</string>

  <string name="channel_name">Local Notifications</string>
  <string name="channel_description">The count from MainActivity.</string>
</resources>

Добавление пакета NuGet для Android.Support.V4

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

Затем давайте отредактируем MainActivity.cs и добавьте следующую using инструкцию, чтобы типы доступны Android.Support.V4.App в нашем коде:

using Android.Support.V4.App;

Кроме того, мы должны четко указать компилятору, что мы используем Android.Support.V4.App версию TaskStackBuilder , а не версию Android.App . Добавьте следующую using инструкцию, чтобы устранить любую неоднозначность:

using TaskStackBuilder = Android.Support.V4.App.TaskStackBuilder;

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

Затем добавьте метод, в MainActivity который будет создан канал уведомлений (при необходимости):

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 name = Resources.GetString(Resource.String.channel_name);
    var description = GetString(Resource.String.channel_description);
    var channel = new NotificationChannel(CHANNEL_ID, name, NotificationImportance.Default)
                  {
                      Description = description
                  };

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

OnCreate Обновите метод для вызова этого нового метода:

protected override void OnCreate(Bundle bundle)
{
    base.OnCreate(bundle);
    SetContentView(Resource.Layout.Main);

    CreateNotificationChannel();
}

Определение идентификатора уведомления

Нам потребуется уникальный идентификатор для нашего канала уведомлений и уведомлений. Давайте изменим MainActivity.cs и добавим в класс следующую переменную статического экземпляра MainActivity :

static readonly int NOTIFICATION_ID = 1000;
static readonly string CHANNEL_ID = "location_notification";
internal static readonly string COUNT_KEY = "count";

Добавление кода для создания уведомления

Затем необходимо создать новый обработчик событий для события кнопки Click . Добавьте следующий метод к MainActivity:

void ButtonOnClick(object sender, EventArgs eventArgs)
{
    // Pass the current button press count value to the next activity:
    var valuesForActivity = new Bundle();
    valuesForActivity.PutInt(COUNT_KEY, count);

    // When the user clicks the notification, SecondActivity will start up.
    var resultIntent = new Intent(this, typeof(SecondActivity));

    // Pass some values to SecondActivity:
    resultIntent.PutExtras(valuesForActivity);

    // Construct a back stack for cross-task navigation:
    var stackBuilder = TaskStackBuilder.Create(this);
    stackBuilder.AddParentStack(Class.FromType(typeof(SecondActivity)));
    stackBuilder.AddNextIntent(resultIntent);

    // Create the PendingIntent with the back stack:
    var resultPendingIntent = stackBuilder.GetPendingIntent(0, (int) PendingIntentFlags.UpdateCurrent);

    // Build the notification:
    var builder = new NotificationCompat.Builder(this, CHANNEL_ID)
                  .SetAutoCancel(true) // Dismiss the notification from the notification area when the user clicks on it
                  .SetContentIntent(resultPendingIntent) // Start up this activity when the user clicks the intent.
                  .SetContentTitle("Button Clicked") // Set the title
                  .SetNumber(count) // Display the count in the Content Info
                  .SetSmallIcon(Resource.Drawable.ic_stat_button_click) // This is the icon to display
                  .SetContentText($"The button has been clicked {count} times."); // the message to display.

    // Finally, publish the notification:
    var notificationManager = NotificationManagerCompat.From(this);
    notificationManager.Notify(NOTIFICATION_ID, builder.Build());

    // Increment the button press count:
    count++;
}

Метод OnCreate MainActivity должен выполнить вызов для создания канала уведомлений и назначить ButtonOnClick метод Click событию кнопки (замените обработчик событий делегата, предоставленный шаблоном):

protected override void OnCreate(Bundle bundle)
{
    base.OnCreate(bundle);
    SetContentView(Resource.Layout.Main);

    CreateNotificationChannel();

    // Display the "Hello World, Click Me!" button and register its event handler:
    var button = FindViewById<Button>(Resource.Id.MyButton);
    button.Click += ButtonOnClick;
}

Создание второго действия

Теперь нам нужно создать другое действие, которое будет отображаться Android, когда пользователь щелкает наше уведомление. Добавьте другое действие Android в проект с именем SecondActivity. Откройте SecondActivity.cs и замените его содержимое следующим кодом:

using System;
using Android.App;
using Android.OS;
using Android.Widget;

namespace LocalNotifications
{
    [Activity(Label = "Second Activity")]
    public class SecondActivity : Activity
    {
        protected override void OnCreate(Bundle bundle)
        {
            base.OnCreate(bundle);

            // Get the count value passed to us from MainActivity:
            var count = Intent.Extras.GetInt(MainActivity.COUNT_KEY, -1);

            // No count was passed? Then just return.
            if (count <= 0)
            {
                return;
            }

            // Display the count sent from the first activity:
            SetContentView(Resource.Layout.Second);
            var txtView = FindViewById<TextView>(Resource.Id.textView1);
            txtView.Text = $"You clicked the button {count} times in the previous activity.";
        }
    }
}

Необходимо также создать макет ресурса для SecondActivity. Добавьте новый файл макета Android в проект с именем Second.axml. Измените second.axml и вставьте следующий код макета:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:minWidth="25px"
    android:minHeight="25px">
    <TextView
        android:text=""
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:id="@+id/textView1" />
</LinearLayout>

Значок добавления уведомления

Наконец, добавьте небольшой значок, который появится в области уведомлений при запуске уведомления. Этот значок можно скопировать в проект или создать собственный пользовательский значок . Назовите файл значка ic_stat_button_click.png и скопируйте его в папку Resources/drawable . Не забудьте использовать добавление > существующего элемента ... для включения этого файла значка в проект.

Выполнение приложения

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

Снимок экрана первого действия

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

Появится значок уведомления

Если проводите пальцем вниз и предоставляете панель уведомлений, вы увидите следующее:

Сообщение с уведомлением

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

Снимок экрана второго действия

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

Итоги

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