Жизненный цикл приложения

Приложения многоплатформенного пользовательского интерфейса приложений .NET (.NET MAUI) обычно имеют четыре состояния выполнения: не запущено, не запущено, деактивировано и остановлено. .NET MAUI вызывает события жизненного цикла кроссплатформенного цикла класса Window , когда приложение переходит из не запущенного состояния в состояние выполнения, состояние выполнения в деактивированное состояние, деактивированное состояние в остановленное состояние, остановленное состояние в состояние выполнения и остановленное состояние в не запущенное состояние.

На следующей схеме показан обзор жизненного цикла приложения .NET MAUI:

.NET MAUI app lifecycle

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

Состояние выполнения приложения зависит от журнала приложения. Например, когда приложение установлено в первый раз или устройство запускается, приложение может считаться не запущенным. При запуске Created приложения создаются события и Activated запускается приложение. Если другое окно приложения получает фокус, Deactivated событие вызывается и приложение деактивируется. Если пользователь переключается на другое приложение или возвращается на начальный экран устройства, чтобы окно приложения больше не отображалось, Deactivated возникают события и Stopped приложение останавливается. Если пользователь возвращается в приложение, Resuming вызывается событие и выполняется приложение. Кроме того, приложение может быть завершено пользователем во время его работы. В этой ситуации приложение деактивируется, а затем останавливается, Destroying вызывается событие, и приложение не выполняется. Аналогичным образом, устройство может завершить приложение во время его остановки из-за ограничений ресурсов, и событие возникает, и Destroying приложение не выполняется.

Кроме того, .NET MAUI позволяет приложениям получать уведомления при возникновении событий жизненного цикла платформы. Дополнительные сведения см. в разделе "События жизненного цикла платформы".

События жизненного цикла кроссплатформенного цикла

Класс Window определяет следующие межплатформенные события жизненного цикла:

Мероприятие Description Предстоящее действие
Created Это событие возникает после создания собственного окна. На этом этапе кроссплатформенное окно будет иметь собственный обработчик окон, но окно пока не отображается.
Activated Это событие возникает, когда окно активировано, а также будет или станет фокусируемым окном.
Deactivated Это событие возникает, когда окно больше не является фокусируемым окном. Однако окно по-прежнему может быть видимым.
Stopped Это событие возникает, когда окно больше не отображается. Не гарантируется, что приложение возобновляется из этого состояния, так как оно может быть завершено операционной системой. Отключитесь от любых длительных процессов или отмените ожидающие запросы, которые могут использовать ресурсы устройства.
Resumed Это событие возникает, когда приложение возобновляется после остановки. Это событие не будет создано при первом запуске приложения и может вызываться только в том случае, если Stopped событие было создано ранее. Подпишитесь на все необходимые события и обновите любое содержимое, которое находится на видимой странице.
Destroying Это событие возникает при уничтожении и освобождении собственного окна. Одно и то же кроссплатформенное окно может использоваться для нового собственного окна при повторном открытии приложения. Удалите все подписки на события, подключенные к собственному окну.

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

Событие Android iOS Windows
Created OnPostCreate FinishedLaunching Created
Activated OnResume OnActivated Activated (CodeActivated и PointerActivated)
Deactivated OnPause OnResignActivation Activated (Deactivated)
Stopped OnStop DidEnterBackground VisibilityChanged
Resumed OnRestart WillEnterForeground Resumed
Destroying OnDestroy WillTerminate Closed

Кроме того, Window класс также определяет Backgrounding событие, которое вызывается в iOS и Mac Catalyst при закрытии окна или входит в фоновое состояние. BackgroundingEventArgs Объект сопровождает это событие, и любое string состояние должно быть сохранено в State свойстве BackgroundingEventArgs объекта, которое ОС сохранится до тех пор, пока не придется возобновить окно. Когда окно возобновляется IActivationState , состояние предоставляется аргументом CreateWindow переопределения.

Помимо этих событий, Window класс также имеет следующие переопределимые методы жизненного цикла:

  • OnCreated, который вызывается при Created вызове события.
  • OnActivated, который вызывается при Activated вызове события.
  • OnDeactivated, который вызывается при Deactivated вызове события.
  • OnStopped, который вызывается при Stopped вызове события.
  • OnResumed, который вызывается при Resumed вызове события.
  • OnDestroying, который вызывается при Destroying вызове события.
  • OnBackgrounding, который вызывается при Backgrounding вызове события.

Чтобы подписаться на Window события жизненного цикла, переопределите CreateWindow метод в App классе, чтобы создать Window экземпляр, на который можно подписаться на события:

namespace MyMauiApp
{
    public partial class App : Application
    {
        public App()
        {
            InitializeComponent();

            MainPage = new MainPage();
        }

        protected override Window CreateWindow(IActivationState activationState)
        {
            Window window = base.CreateWindow(activationState);

            window.Created += (s, e) =>
            {
                // Custom logic
            };

            return window;
        }
    }
}

Кроме того, чтобы использовать переопределение жизненного цикла, создайте класс, производный от Window класса.

namespace MyMauiApp
{
    public class MyWindow : Window
    {
        public MyWindow() : base()
        {
        }

        public MyWindow(Page page) : base(page)
        {
        }

        protected override void OnCreated()
        {
            // Register services
        }
    }
}

Затем производный Windowкласс можно использовать путем переопределения CreateWindow метода в App классе для возврата экземпляра MyWindow .

Предупреждение

InvalidOperationException Вызывается, если App.MainPage свойство задано, а CreateWindow метод создает Window объект с помощью переопределения, который принимает Page аргумент.

События жизненного цикла платформы

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

Важно!

Метод ConfigureLifecycleEvents находится в Microsoft.Maui.LifecycleEvents пространстве имен.

Android

В следующей таблице перечислены делегаты MAUI .NET, которые вызываются в ответ на события жизненного цикла Android.

Делегирование Аргументы Description Комментарии
OnActivityResult Android.App.Activity, int, Android.App.Result, Android.Content.Intent? Вызывается при выходе действия, которое вы запустили.
OnApplicationConfigurationChanged Android.App.Application, Android.Content.Res.Configuration Вызывается при изменении конфигурации устройства во время выполнения компонента.
OnApplicationCreate Android.App.Application Вызывается при запуске приложения перед созданием объектов действия, службы или приемника (за исключением поставщиков содержимого).
OnApplicationCreating Android.App.Application Вызывается при запуске приложения перед созданием объектов действия, службы или приемника (за исключением поставщиков содержимого).
OnApplicationLowMemory Android.App.Application Вызывается при низком уровне памяти системы и активно выполняющихся процессах следует обрезать использование памяти.
OnApplicationTrimMemory Android.App.Application, Android.Content.TrimMemory Вызывается, когда операционная система определила, что это хорошее время для процесса, чтобы обрезать ненужный объем памяти от своего процесса.
OnBackPressed Android.App.Activity Вызывается при обнаружении действия нажатия клавиши back.
OnConfigurationChanged Android.App.Activity, Android.Content.Res.Configuration Вызывается при изменении конфигурации устройства во время выполнения действия.
OnCreate Android.App.Activity, Android.OS.Bundle? Вызывается при создании действия.
OnDestroy Android.App.Activity Вызывается при завершении действия или из-за временного уничтожения экземпляра действия для экономии места. Всегда вызывать реализацию суперкласса.
OnNewIntent Android.App.Activity, Android.Content.Intent? Вызывается при повторном запуске действия в верхней части стека действий вместо нового экземпляра запущенного действия.
OnPause Android.App.Activity Вызывается при переходе действия в фон, но еще не был убит. Всегда вызывать реализацию суперкласса.
OnPostCreate Android.App.Activity, Android.OS.Bundle? Вызывается при завершении запуска действия после OnStart вызова.OnRestoreInstanceState Всегда вызывать реализацию суперкласса. Это событие только для системы, которое обычно не должно использоваться приложениями.
OnPostResume Android.App.Activity Вызывается при завершении возобновления действия после OnResume вызова. Всегда вызывать реализацию суперкласса. Это событие только для системы, которое обычно не должно использоваться приложениями.
OnRequestPermissionsResult Android.App.Activity, int, string[], Android.Content.PM.Permission[] Вызывается в качестве обратного вызова для результата запроса разрешений.
OnRestart Android.App.Activity Вызывается после OnStop повторного воспроизведения текущего действия пользователю (пользователь вернулся к нему). Всегда вызывать реализацию суперкласса.
OnRestoreInstanceState Android.App.Activity, Android.OS.Bundle Вызывается после OnStart повторного инициализации действия из ранее сохраненного состояния.
OnResume Android.App.Activity Вызывается после OnRestoreInstanceStateилиOnRestartOnPause, чтобы указать, что действие активно и готово к получению входных данных.
OnSaveInstanceState Android.App.Activity, Android.OS.Bundle Вызывается для получения состояния каждого экземпляра из убитого действия, чтобы состояние можно было восстановить в OnCreate или OnRestoreInstanceState.
OnStart Android.App.Activity Вызывается после или OnRestart после OnCreate остановки действия, но теперь отображается пользователю. Всегда вызывать реализацию суперкласса.
OnStop Android.App.Activity Вызывается, когда действие больше не отображается пользователю. Всегда вызывать реализацию суперкласса.

Важно!

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

Чтобы ответить на вызываемый делегат жизненного цикла Android, вызовите ConfigureLifecycleEvents метод MauiAppBuilder объекта в методе CreateMauiapp класса MauiProgram . Затем вызовите ILifecycleBuilderAddAndroid метод и укажите Action обработчики для необходимых делегатов:

using Microsoft.Maui.LifecycleEvents;

namespace PlatformLifecycleDemo
{
    public static class MauiProgram
    {
        public static MauiApp CreateMauiApp()
        {
            var builder = MauiApp.CreateBuilder();
            builder
                .UseMauiApp<App>()
                .ConfigureLifecycleEvents(events =>
                {
#if ANDROID
                    events.AddAndroid(android => android
                        .OnActivityResult((activity, requestCode, resultCode, data) => LogEvent(nameof(AndroidLifecycle.OnActivityResult), requestCode.ToString()))
                        .OnStart((activity) => LogEvent(nameof(AndroidLifecycle.OnStart)))
                        .OnCreate((activity, bundle) => LogEvent(nameof(AndroidLifecycle.OnCreate)))
                        .OnBackPressed((activity) => LogEvent(nameof(AndroidLifecycle.OnBackPressed)) && false)
                        .OnStop((activity) => LogEvent(nameof(AndroidLifecycle.OnStop))));
#endif
                    static bool LogEvent(string eventName, string type = null)
                    {
                        System.Diagnostics.Debug.WriteLine($"Lifecycle event: {eventName}{(type == null ? string.Empty : $" ({type})")}");
                        return true;
                    }
                });

            return builder.Build();
        }
    }
}

Дополнительные сведения о жизненном цикле приложений Android см. в разделе "Общие сведения о жизненном цикле действий" на developer.android.com.

iOS

В следующей таблице перечислены делегаты MAUI .NET, которые вызываются в ответ на события жизненного цикла iOS.

Делегирование Аргументы Description
ApplicationSignificantTimeChange UIKit.UIApplication Вызывается при значительном изменении времени, например полуночи, времени изменения оператора или начала или остановки дневной экономии.
ContinueUserActivity UIKit.UIApplication, Foundation.NSUserActivity, UIKit.UIApplicationRestorationHandler Вызывается, когда приложение получает данные, связанные с действием пользователя, например передача действия с другого устройства с помощью handoff.
DidEnterBackground UIKit.UIApplication Вызывается, когда приложение ввело фон.
FinishedLaunching UIKit.UIApplication, Foundation.NSDictionary Вызывается при запуске приложения.
OnActivated UIKit.UIApplication Вызывается при запуске приложения и каждый раз, когда приложение возвращается на передний план.
OnResignActivation UIKit.UIApplication Вызывается, когда приложение будет входить в фон, приостановлено или когда пользователь получает прерывание, например телефонный звонок или текст.
OpenUrl UIKit.UIApplication, Foundation.NSDictionary Вызывается, когда приложение должно открыть указанный URL-адрес.
PerformActionForShortcutItem UIKit.UIApplication, UIKit.UIApplicationShortcutItem, UIKit.UIOperationHandler Вызывается при запуске быстрого действия начального экрана.
SceneContinueUserActivity UIKit.UIScene, Foundation.NSUserActivity Вызывается для обработки указанного действия, связанного с рукой.
SceneDidDisconnect UIKit.UIScene Вызывается при удалении сцены из приложения.
SceneDidEnterBackground UIKit.UIScene Вызывается при запуске сцены в фоновом режиме и не находится на экране.
SceneDidFailToContinueUserActivity UIKit.UIScene, string, Foundation.NSError Вызывается для информирования пользователя о том, что действие не удалось завершить.
SceneDidUpdateUserActivity UIKit.UIScene, Foundation.NSUserActivity Вызывается при обновлении указанного действия.
SceneOnActivated UIKit.UIScene Вызывается, когда сцена становится активной и может реагировать на события пользователя.
SceneOnResignActivation UIKit.UIScene Вызывается, когда сцена собиралась уйти в активное состояние и перестать отвечать на события пользователя.
SceneOpenUrl UIKit.UIScene, Foundation.NSSet<UIKit.UIOpenUrlContext> Вызывается, когда сцена запрашивает открыть один или несколько URL-адресов.
SceneRestoreInteractionState UIKit.UIScene, Foundation.NSUserActivity Вызывается для восстановления состояния действия.
SceneWillConnect UIKit.UIScene, UIKit.UISceneSession, UIKit.UISceneConnectionOptions Вызывается при добавлении сцены в приложение.
SceneWillContinueUserActivity UIKit.UIScene, string Вызывается для подготовки к получению данных, связанных с передачой данных.
SceneWillEnterForeground UIKit.UIScene Вызывается, когда сцена выполняется на переднем плане и становится видимой для пользователя.
WillEnterForeground UIKit.UIApplication Вызывается, если приложение возвращается из фонового состояния.
WillFinishLaunching UIKit.UIApplication, Foundation.NSDictionary Вызывается при запуске приложения, но восстановление состояния еще не произошло.
WillTerminate UIKit.UIApplication Вызывается, если приложение завершается из-за ограничений памяти или непосредственно пользователем.
WindowSceneDidUpdateCoordinateSpace UIKit.UIWindowScene, UIKit.IUICoordinateSpace, UIKit.UIInterfaceOrientation, UIKit.UITraitCollection Вызывается при изменении размера, ориентации или признаков сцены.

Важно!

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

Делегирование Аргументы Description
ApplicationSignificantTimeChange UIKit.UIApplication Вызывается при значительном изменении времени, например полуночи, времени изменения оператора или начала или остановки дневной экономии.
ContinueUserActivity UIKit.UIApplication, Foundation.NSUserActivity, UIKit.UIApplicationRestorationHandler Вызывается, когда приложение получает данные, связанные с действием пользователя, например передача действия с другого устройства с помощью handoff.
DidEnterBackground UIKit.UIApplication Вызывается, когда приложение ввело фон.
FinishedLaunching UIKit.UIApplication, Foundation.NSDictionary Вызывается при запуске приложения.
OnActivated UIKit.UIApplication Вызывается при запуске приложения и каждый раз, когда приложение возвращается на передний план.
OnResignActivation UIKit.UIApplication Вызывается, когда приложение будет входить в фон, приостановлено или когда пользователь получает прерывание, например телефонный звонок или текст.
OpenUrl UIKit.UIApplication, Foundation.NSDictionary Вызывается, когда приложение должно открыть указанный URL-адрес.
PerformActionForShortcutItem UIKit.UIApplication, UIKit.UIApplicationShortcutItem, UIKit.UIOperationHandler Вызывается при запуске быстрого действия начального экрана.
PerformFetch UIKit.UIApplication, Action<UIBackgroundFetchResult> Вызывается, чтобы сообщить приложению, что оно может начать операцию получения, если она имеет данные для скачивания.
SceneContinueUserActivity UIKit.UIScene, Foundation.NSUserActivity Вызывается для обработки указанного действия, связанного с рукой.
SceneDidDisconnect UIKit.UIScene Вызывается при удалении сцены из приложения.
SceneDidEnterBackground UIKit.UIScene Вызывается при запуске сцены в фоновом режиме и не находится на экране.
SceneDidFailToContinueUserActivity UIKit.UIScene, string, Foundation.NSError Вызывается для информирования пользователя о том, что действие не удалось завершить.
SceneDidUpdateUserActivity UIKit.UIScene, Foundation.NSUserActivity Вызывается при обновлении указанного действия.
SceneOnActivated UIKit.UIScene Вызывается, когда сцена становится активной и может реагировать на события пользователя.
SceneOnResignActivation UIKit.UIScene Вызывается, когда сцена собиралась уйти в активное состояние и перестать отвечать на события пользователя.
SceneOpenUrl UIKit.UIScene, Foundation.NSSet<UIKit.UIOpenUrlContext> Вызывается, когда сцена запрашивает открыть один или несколько URL-адресов.
SceneRestoreInteractionState UIKit.UIScene, Foundation.NSUserActivity Вызывается для восстановления состояния действия.
SceneWillConnect UIKit.UIScene, UIKit.UISceneSession, UIKit.UISceneConnectionOptions Вызывается при добавлении сцены в приложение.
SceneWillContinueUserActivity UIKit.UIScene, string Вызывается для подготовки к получению данных, связанных с передачой данных.
SceneWillEnterForeground UIKit.UIScene Вызывается, когда сцена выполняется на переднем плане и становится видимой для пользователя.
WillEnterForeground UIKit.UIApplication Вызывается, если приложение возвращается из фонового состояния.
WillFinishLaunching UIKit.UIApplication, Foundation.NSDictionary Вызывается при запуске приложения, но восстановление состояния еще не произошло.
WillTerminate UIKit.UIApplication Вызывается, если приложение завершается из-за ограничений памяти или непосредственно пользователем.
WindowSceneDidUpdateCoordinateSpace UIKit.UIWindowScene, UIKit.IUICoordinateSpace, UIKit.UIInterfaceOrientation, UIKit.UITraitCollection Вызывается при изменении размера, ориентации или признаков сцены.

Важно!

Каждый делегат, за исключением PerformFetch, имеет соответствующий метод расширения с одинаковым именем, который можно вызвать для регистрации обработчика для делегата.

Чтобы ответить на вызываемый делегат жизненного цикла iOS, вызовите ConfigureLifecycleEvents метод объекта MauiAppBuilder в методе CreateMauiapp класса MauiProgram . Затем вызовите ILifecycleBuilderAddiOS метод и укажите Action обработчики для необходимых делегатов:

using Microsoft.Maui.LifecycleEvents;

namespace PlatformLifecycleDemo
{
    public static class MauiProgram
    {
        public static MauiApp CreateMauiApp()
        {
            var builder = MauiApp.CreateBuilder();
            builder
                .UseMauiApp<App>()
                .ConfigureLifecycleEvents(events =>
                {
#if IOS
                    events.AddiOS(ios => ios
                        .OnActivated((app) => LogEvent(nameof(iOSLifecycle.OnActivated)))
                        .OnResignActivation((app) => LogEvent(nameof(iOSLifecycle.OnResignActivation)))
                        .DidEnterBackground((app) => LogEvent(nameof(iOSLifecycle.DidEnterBackground)))
                        .WillTerminate((app) => LogEvent(nameof(iOSLifecycle.WillTerminate))));
#endif
                    static bool LogEvent(string eventName, string type = null)
                    {
                        System.Diagnostics.Debug.WriteLine($"Lifecycle event: {eventName}{(type == null ? string.Empty : $" ({type})")}");
                        return true;
                    }
                });

            return builder.Build();
        }
    }
}

Дополнительные сведения о жизненном цикле приложений iOS см. в разделе "Управление жизненным циклом приложения" на developer.apple.com.

Windows

В следующей таблице перечислены делегаты .NET MAUI, которые вызываются в ответ на события жизненного цикла Windows.

Делегирование Аргументы Description
OnActivated Microsoft.UI.Xaml.Window, Microsoft.UI.Xaml.WindowActivatedEventArgs Вызывается при возникновении события платформы Activated , если приложение не возобновляется.
OnClosed Microsoft.UI.Xaml.Window, Microsoft.UI.Xaml.WindowEventArgs Вызывается при возникновении события платформы Closed .
OnLaunched Microsoft.UI.Xaml.Window, Microsoft.UI.Xaml.LaunchActivatedEventArgs Вызывается переопределением .NET MAUI Application.OnLaunched после создания и активации собственного окна.
OnLaunching Microsoft.UI.Xaml.Window, Microsoft.UI.Xaml.LaunchActivatedEventArgs Вызывается переопределением .NET MAUI Application.OnLaunched перед созданием и активацией собственного окна.
OnPlatformMessage Microsoft.UI.Xaml.Window, WindowsPlatformMessageEventArgs Вызывается, когда .NET MAUI получает определенные собственные сообщения Windows.
OnPlatformWindowSubclassed Microsoft.UI.Xaml.Window, WindowsPlatformWindowSubclassedEventArgs Вызывается .NET MAUI при подклассе окна Win32.
OnResumed Microsoft.UI.Xaml.Window Вызывается при возникновении события платформы Activated , если приложение возобновляется.
OnVisibilityChanged Microsoft.UI.Xaml.Window, Microsoft.UI.Xaml.WindowVisibilityChangedEventArgs Вызывается при возникновении события платформы VisibilityChanged .
OnWindowCreated Microsoft.UI.Xaml.Window Вызывается при создании собственного окна для кроссплатформенной платформы Window.

.NET MAUI предоставляет определенные собственные сообщения Windows в качестве события жизненного цикла с делегатом OnPlatformMessage . Объект WindowsPlatformMessageEventArgs , сопровождающий этот делегат, включает MessageId свойство типа uint. Значение этого свойства можно проверить, чтобы определить, какое сообщение было передано в окно приложения. Дополнительные сведения о сообщениях Windows см. в статьях "Сообщения Windows" (начало работы с Win32 и C++). Список констант сообщений окна см. в разделе "Уведомления о окне".

Важно!

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

Чтобы ответить на вызываемый делегат жизненного цикла Windows, вызовите ConfigureLifecycleEvents метод MauiAppBuilder объекта в методе CreateMauiApp класса MauiProgram . Затем вызовите ILifecycleBuilderAddWindows метод и укажите Action обработчики для необходимых делегатов:

using Microsoft.Maui.LifecycleEvents;

namespace PlatformLifecycleDemo
{
    public static class MauiProgram
    {
        public static MauiApp CreateMauiApp()
        {
            var builder = MauiApp.CreateBuilder();
            builder
                .UseMauiApp<App>()
                .ConfigureLifecycleEvents(events =>
                {
#if WINDOWS
                    events.AddWindows(windows => windows
                           .OnActivated((window, args) => LogEvent(nameof(WindowsLifecycle.OnActivated)))
                           .OnClosed((window, args) => LogEvent(nameof(WindowsLifecycle.OnClosed)))
                           .OnLaunched((window, args) => LogEvent(nameof(WindowsLifecycle.OnLaunched)))
                           .OnLaunching((window, args) => LogEvent(nameof(WindowsLifecycle.OnLaunching)))
                           .OnVisibilityChanged((window, args) => LogEvent(nameof(WindowsLifecycle.OnVisibilityChanged)))
                           .OnPlatformMessage((window, args) =>
                           {
                               if (args.MessageId == Convert.ToUInt32("031A", 16))
                               {
                                   // System theme has changed
                               }
                           }));
#endif
                    static bool LogEvent(string eventName, string type = null)
                    {
                        System.Diagnostics.Debug.WriteLine($"Lifecycle event: {eventName}{(type == null ? string.Empty : $" ({type})")}");
                        return true;
                    }
                });

            return builder.Build();
        }
    }
}

Получение объекта Window

Код платформы может получить объект приложения Window из событий жизненного цикла платформы с GetWindow помощью метода расширения:

using Microsoft.Maui.LifecycleEvents;

namespace PlatformLifecycleDemo
{
    public static class MauiProgram
    {
        public static MauiApp CreateMauiApp()
        {
            var builder = MauiApp.CreateBuilder();
            builder
                .UseMauiApp<App>()
                .ConfigureLifecycleEvents(events =>
                {
#if WINDOWS
                    events.AddWindows(windows => windows
                            .OnClosed((window, args) =>
                            {
                                IWindow appWindow = window.GetWindow();
                            }));
#endif
                });

            return builder.Build();
        }
    }
}

Пользовательские события жизненного цикла

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

  • Зарегистрируйте обработчик событий для события жизненного цикла платформы, которое не предоставляется .NET MAUI.
  • В обработчике событий для события жизненного цикла платформы извлеките ILifecycleEventService экземпляр и вызовите его InvokeEvents метод, указав имя события платформы в качестве аргумента.

Затем приложения, которые хотят получать уведомления о событии жизненного цикла платформы, должны изменить CreateMauiApp метод своего MauiProgram класса для вызова ConfigureLifecycleEvents метода в объекте MauiAppBuilder . Затем в ILifecycleBuilder объекте вызовите AddEvent метод и укажите имя события платформы и Action вызываемое при вызове события платформы.

Пример

Событие WinUI 3 Window.SizeChanged возникает при первом отрисовке окна собственного приложения или изменения размера отрисовки. .NET MAUI не предоставляет это событие платформы как событие жизненного цикла. Однако приложения могут получать уведомления, когда это событие платформы возникает с помощью следующего подхода:

  • Зарегистрируйте обработчик событий для события жизненного Window.SizeChanged цикла платформы:

    using Microsoft.Maui.LifecycleEvents;
    ...
    
    public static MauiApp CreateMauiApp()
    {
          var builder = MauiApp.CreateBuilder();
          builder
                .UseMauiApp<App>()
                .ConfigureLifecycleEvents(events =>
                {
    #if WINDOWS
                      events.AddWindows(windows => windows
                             .OnWindowCreated(window =>
                             {
                                    window.SizeChanged += OnSizeChanged;
                             }));
    #endif
                });
    
          return builder.Build();
    }    
    
  • В обработчике событий для события жизненного цикла платформы извлеките ILifecycleEventService экземпляр и вызовите его InvokeEvents метод, указав имя события платформы в качестве аргумента:

    using Microsoft.Maui.LifecycleEvents;
    ...
    
    #if WINDOWS
            static void OnSizeChanged(object sender, Microsoft.UI.Xaml.WindowSizeChangedEventArgs args)
            {
                ILifecycleEventService service = MauiWinUIApplication.Current.Services.GetRequiredService<ILifecycleEventService>();
                service.InvokeEvents(nameof(Microsoft.UI.Xaml.Window.SizeChanged));
            }
    #endif
    

    Тип MauiWinUIApplication в Windows можно использовать для доступа к собственному экземпляру приложения через его Current свойство. Тип MauiApplication в Android можно использовать для доступа к экземпляру собственного приложения. Аналогичным образом, MauiUIApplicationDelegate тип в iOS можно использовать для доступа к собственному экземпляру приложения.

    Предупреждение

    Вызов незарегистрированного события с InvokeEvents методом не вызывает исключение.

  • В методе CreateMauiApp класса вызовите ConfigureLifecycleEvents метод MauiProgram объектаMauiAppBuilder. Затем в ILifecycleBuilder объекте вызовите AddEvent метод и укажите имя события платформы и Action вызываемое при вызове события платформы:

    using Microsoft.Maui.LifecycleEvents;
    
    namespace PlatformLifecycleDemo
    {
        public static class MauiProgram
        {
            public static MauiApp CreateMauiApp()
            {
                var builder = MauiApp.CreateBuilder();
                builder
                    .UseMauiApp<App>()
                    .ConfigureLifecycleEvents(events =>
                    {
    #if WINDOWS
                        events.AddWindows(windows => windows
                               .OnWindowCreated(window =>
                               {
                                      window.SizeChanged += OnSizeChanged;
                               }));
    
                        events.AddEvent(nameof(Microsoft.UI.Xaml.Window.SizeChanged), () => LogEvent("Window SizeChanged"));
    #endif
                        static bool LogEvent(string eventName, string type = null)
                        {
                            System.Diagnostics.Debug.WriteLine($"Lifecycle event: {eventName}{(type == null ? string.Empty : $" ({type})")}");
                            return true;
                        }
                    });
    
                return builder.Build();
            }
        }
    }
    

Общий эффект заключается в том, что при изменении размера окна приложения в Windows выполняется действие, указанное в методе AddEvent .

Примечание.

Метод AddEvent также имеет перегрузку, которая позволяет указать делегата.