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