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


