Разработка под Android в .NET MAUI. Действия приложения (ярлыки)

Действия приложения доступны в Android при длительном нажатии на ярлык приложения и позволяют пользователю выбрать определенную операцию, которую должно выполнить ваше приложение, не запуская при этом само приложение. Например, если вы разрабатываете приложение для работы с картами, то можно предоставить пользователю сразу при запуске выбрать действия «Маршрут домой», «Найти поблизости» и т.д. и при выборе каждого действия ваше приложение будет открывать соответствующую страницу вашего приложения.

Пример действий приложения Android

Вот, например, как выглядят действия приложения «Карты»

Пункты «Маршрут домой«, «До работы«, «Закладки» и «Поиск поблизости» — это и есть действия приложения. Выбор того или иного действия открывает соответствующую страницу приложения.

Действия приложения

Интерфейс IAppActions и класс AppActions

Интерфейс IAppActions позволяет создавать действия приложений и реагировать на них. Этот интерфейс предоставляет нам следующие методы:

Метод Описание
public Task<IEnumerable<AppAction>> GetAsync();

 

Возвращает все доступные действия приложения в виде коллекции объектов AppActions
public Task SetAsync(IEnumerable<AppAction> actions);

 

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

Чтобы проверить доступность действий приложения, используется свойство:

public bool IsSupported { get; }

Также, интерфейс предоставляет нам событие, которое генерируется при активации действия приложения:

event EventHandler<AppActionEventArgs>? AppActionActivated;

Для доступа к реализации по умолчанию интерфейса IAppActions используется свойство класса AppActions.Current. И интерфейс IAppActions и класс AppActions содержатся в пространстве имен Microsoft.Maui.ApplicationModel.

Приложение .NET MAUI для Android, использующее действия

Для того, чтобы приложение .NET MAUI могло реагировать на действия, необходимо его настроить. Создадим новое приложение .NET MAUI и изменим файл Platforms/Android/MainActivity.cs следующим образом:

[Activity(Theme = "@style/Maui.SplashTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation | ConfigChanges.UiMode | ConfigChanges.ScreenLayout | ConfigChanges.SmallestScreenSize | ConfigChanges.Density)]
[IntentFilter([Platform.Intent.ActionAppAction],
              Categories = new[] { global::Android.Content.Intent.CategoryDefault })]
public class MainActivity : MauiAppCompatActivity
{
    protected override void OnResume()
    {
        base.OnResume();

        Platform.OnResume(this);
    }

    protected override void OnNewIntent(Android.Content.Intent intent)
    {
        base.OnNewIntent(intent);

        Platform.OnNewIntent(intent);
    }
}

Здесь мы добавляем к классу MainActivity атрибут

IntentFilter([Platform.Intent.ActionAppAction], Categories = new[] { global::Android.Content.Intent.CategoryDefault })]

Здесь мы задаем фильтр намерений (Intent filter) приложения Android (см. информацию на developers.android.com) и переопределяем два метода класса MainActivity: OnResume() — вызывается когда наше приложение становится видимым пользователю, а OnNewIntent() — когда пользователь пытается выполнить действие приложения выбрав его в списке. В этих методах Platform — это статический класс-помощник, который содержит реализации методов специфичных для каждой платформы.

Действия приложения могут добавляться в любом месте приложения, однако, чаще всего они добавляются в файле MauiProgram.cs с использованием метода расширения ConfigureEssentials для MauiAppBuilder:

public static MauiAppBuilder ConfigureEssentials(this MauiAppBuilder builder, Action<IEssentialsBuilder>? configureDelegate = default);

Этот метод принимает делегат с помощью которого можно настраивать действия приложения. Интерфейс IEssentialsBuilder предоставляет нам для этого два метода:

public IEssentialsBuilder AddAppAction(AppAction appAction);
public IEssentialsBuilder OnAppAction(Action<AppAction> action);
  • AddAppAction() — настраивает новое действие приложения;
  • OnAppAction() — задает делегат, который будет выполняться при вызове действия приложения

Добавим в наше приложение действия.

Добавление действий приложения

Откроем файл MauiProram.cs и изменим его следующим образом:

using Microsoft.Extensions.Logging;

namespace MauiAndroid;

public static class MauiProgram
{
    public static MauiApp CreateMauiApp()
    {
        var builder = MauiApp.CreateBuilder();
        builder
            .UseMauiApp<App>()
            .ConfigureFonts(fonts =>
            {
                fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");
                fonts.AddFont("OpenSans-Semibold.ttf", "OpenSansSemibold");
                //настраиваем действия приложения
            }).ConfigureEssentials(essentials =>
            {
                essentials
                    .AddAppAction("app_info","О программе","Сведения о приложении")
                    .AddAppAction("main_form", "Главная страница")
                    .OnAppAction(App.HandleAppActions);
            });

#if DEBUG
        builder.Logging.AddDebug();
#endif

        return builder.Build();
    }
}

Здесь мы вызвали метод ConfigureEssentials() и настроили два действия для приложения, используя метод AddAppAction():

.ConfigureEssentials(essentials =>
            {
                essentials
                    .AddAppAction("app_info","О программе","Сведения о приложении")
                    .AddAppAction("main_form", "Главная страница")
                    ...
            });

Метод AddAppAction() имеет несколько версий:

public static IEssentialsBuilder AddAppAction(this IEssentialsBuilder essentials, string id, string title, string? subtitle = null, string? icon = null)
IEssentialsBuilder AddAppAction(AppAction appAction);

Для первого действия приложения мы указали Id, заголовок и подзаголовок действия, а для второго — только Id и заголовок (обязательные части действия). Также мы вызвали метод OnAppAction() в который передали делегат, выполняющийся при выборе того или иного действия приложения:

.ConfigureEssentials(essentials =>
            {
                essentials
                    ...
                    .OnAppAction(App.HandleAppActions);
            });

Обработка действий приложения

Метод HandleAppActions() определен в классе App и выглядит следующим образом

public static void HandleAppActions(AppAction appAction)
{
    App.Current.Dispatcher.Dispatch(async () =>
    {
        var page = appAction.Id switch
        {
            "app_info" => new AppInfoPage(),
            "main_info" => new MainPage(),
            _ => default(Page)
        };

        if (page != null)
        {
            await Application.Current.Windows[0].Page.Navigation.PopToRootAsync();
            await Application.Current.Windows[0].Page.Navigation.PushAsync(page);
        }
    });
}

Здесь мы, используя идентификатор действия, определяем страницу, которую необходимо открыть пользователю:

var page = appAction.Id switch
{
    "app_info" => new AppInfoPage(),
    "main_info" => new MainPage(),
    _ => default(Page)
};

и, если страница определена, то выполняем безрежимную навигацию:

if (page != null)
{
    await Application.Current.Windows[0].Page.Navigation.PopToRootAsync();
    await Application.Current.Windows[0].Page.Navigation.PushAsync(page);
}

Чтобы приложение запустилось и работало без ошибок, добавим в проект страницу с именем AppInfoPage:

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

Действия приложения

Выбор действия «О программе» откроет наше приложение на странице AppInfoPage.

Действия приложения с использованием класса AppActions

Если по каким-либо причинам вы не можете определить действия приложения в файле MauiProgram.cs, то это можно сделать в любом месте приложения. Например, в том же классе App. Изменим его следующим образом:

public partial class App : Application
{
    public App()
    {
        InitializeComponent();
        if (AppActions.Current.IsSupported)
        {
            AppActions.Current.SetAsync(new[] { new AppAction("app_info","О программе"),
                                          new AppAction("main_form", "Главная страница") });
        }
    }

    protected override Window CreateWindow(IActivationState? activationState)
    {
                        
        return new Window(new AppShell());
    }

    public static void HandleAppActions(AppAction appAction)
    {
        App.Current.Dispatcher.Dispatch(async () =>
        {
            var page = appAction.Id switch
            {
                "app_info" => new AppInfoPage(),
                "main_info" => new MainPage(),
                _ => default(Page)
            };

            if (page != null)
            {
                await Application.Current.Windows[0].Page.Navigation.PopToRootAsync();
                await Application.Current.Windows[0].Page.Navigation.PushAsync(page);
            }
        });
    }
}

В файле MauiProgram.cs можно закомментировать вызов методов AddAppAction() в ConfigureEssentials():

var builder = MauiApp.CreateBuilder();
builder
    .UseMauiApp<App>()
    .ConfigureFonts(fonts =>
    {
        fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");
        fonts.AddFont("OpenSans-Semibold.ttf", "OpenSansSemibold");
        //настраиваем действия приложения
    }).ConfigureEssentials(essentials =>
    {
        essentials
      //      .AddAppAction("app_info","О программе","Сведения о приложении")
      //      .AddAppAction("main_form", "Главная страница")
            .OnAppAction(App.HandleAppActions);
    });

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

Итого

Действия приложения доступны при длительном нажатии на ярлык приложения и позволяют пользователю сразу выполнить какую-либо операцию без дополнительного использования интерфейса. Например, открыть окно для отправки сообщения. Для каждого действия в .NET MAUI необходимо определить его Id и заголовок, а также определить обработчик действий.

Подписаться
Уведомить о
guest
0 Комментарий
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии