Пошаговое руководство. Использование локальных уведомлений в 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
для создания и отображения уведомлений. В нем показан базовый пример запуска второго действия в качестве способа реагирования на взаимодействие пользователя с уведомлением, и он продемонстрировал передачу данных из первого действия во второй.