앱 수명 주기

.NET 다중 플랫폼 앱 UI(.NET MAUI) 앱에는 일반적으로 실행되지 않음, 실행 중, 비활성화중지된 네 가지 실행 상태가 있습니다. .NET MAUI는 앱이 실행되지 않는 상태에서 실행 중 상태로 전환되고, 실행 상태가 비활성화된 상태로, 비활성화된 상태를 중지된 상태로, 중지된 상태를 실행 중 상태로, 중지된 상태를 실행되지 않는 상태로 전환할 때 클래스에서 플랫폼 간 수명 주기 이벤트를 Window 발생합니다.

다음 다이어그램에서는 .NET MAUI 앱 수명 주기에 대한 개요를 보여 있습니다.

.NET MAUI app lifecycle

다이어그램에서 회색 타원은 앱이 메모리에 로드되지 않음을 나타냅니다. 연한 파란색 타원은 앱이 메모리에 있음을 나타냅니다. 호에 있는 텍스트는 실행 중인 앱에 알림을 제공하는 .NET MAUI에서 발생하는 이벤트를 나타냅니다.

앱의 실행 상태는 앱의 기록에 따라 달라집니다. 예를 들어 앱이 처음으로 설치되거나 디바이스가 시작된 경우 앱이 실행되고 있지 않은 것으로 간주될 수 있습니다. 앱이 시작 CreatedActivated 되면 이벤트가 발생하고 앱이 실행됩니다. 다른 앱 창에 포커스가 Deactivated 있으면 이벤트가 발생하고 앱이 비활성화됩니다. 사용자가 다른 앱으로 전환하거나 디바이스의 홈 화면으로 돌아가서 앱 창이 더 이상 표시되지 Deactivated 않도록 하면 이벤트 및 Stopped 이벤트가 발생하고 앱이 중지됩니다. 사용자가 앱 Resuming 으로 돌아오면 이벤트가 발생하고 앱이 실행됩니다. 또는 앱이 실행되는 동안 사용자가 앱을 종료할 수 있습니다. 이 경우 앱이 비활성화된 다음 중지되고 이벤트가 Destroying 발생하며 앱이 실행되고 있지 않습니다. 마찬가지로 디바이스는 리소스 제한으로 인해 중지된 동안 앱을 종료할 수 있으며 Destroying 이벤트가 발생하고 앱이 실행되고 있지 않습니다.

또한 .NET MAUI를 사용하면 플랫폼 수명 주기 이벤트가 발생할 때 앱에 알림을 받을 수 있습니다. 자세한 내용은 플랫폼 수명 주기 이벤트를 참조 하세요.

플랫폼 간 수명 주기 이벤트

클래스는 Window 다음과 같은 플랫폼 간 수명 주기 이벤트를 정의합니다.

이벤트 설명 수행할 작업
Created 이 이벤트는 네이티브 창을 만든 후에 발생합니다. 이 시점에서 플랫폼 간 창에는 네이티브 창 처리기가 있지만 창은 아직 표시되지 않을 수 있습니다.
Activated 이 이벤트는 창이 활성화되고 포커스가 있는 창이 될 때 발생합니다.
Deactivated 이 이벤트는 창이 더 이상 포커스가 있는 창이 아니어도 발생합니다. 그러나 창이 계속 표시될 수 있습니다.
Stopped 이 이벤트는 창이 더 이상 표시되지 않을 때 발생합니다. 운영 체제에서 앱을 종료할 수 있으므로 앱이 이 상태에서 다시 시작된다는 보장은 없습니다. 장기 실행 프로세스에서 연결을 끊거나 디바이스 리소스를 사용할 수 있는 보류 중인 요청을 취소합니다.
Resumed 이 이벤트는 앱이 중지된 후 다시 시작될 때 발생합니다. 이 이벤트는 앱이 처음 시작될 때 발생하지 않으며 이전에 이벤트가 발생한 경우에만 Stopped 발생할 수 있습니다. 필요한 이벤트를 구독하고 표시되는 페이지에 있는 콘텐츠를 새로 고칩니다.
Destroying 이 이벤트는 네이티브 창이 제거되고 할당 취소될 때 발생합니다. 앱이 다시 열릴 때 새 네이티브 창에 대해 동일한 플랫폼 간 창을 사용할 수 있습니다. 네이티브 창에 연결한 이벤트 구독을 제거합니다.

이러한 플랫폼 간 이벤트는 서로 다른 플랫폼 이벤트에 매핑되며 다음 표에서는 이 매핑을 보여 줍니다.

이벤트 Android iOS Windows
Created OnPostCreate FinishedLaunching Created
Activated OnResume OnActivated Activated(CodeActivatedPointerActivated)
Deactivated OnPause OnResignActivation Activated (Deactivated)
Stopped OnStop DidEnterBackground VisibilityChanged
Resumed OnRestart WillEnterForeground Resumed
Destroying OnDestroy WillTerminate Closed

또한 클래스는 Window 창이 닫혀 있거나 백그라운드 상태가 될 때 iOS 및 Mac Catalyst에서 발생하는 이벤트를 정의 Backgrounding 합니다. 개체는 BackgroundingEventArgs 이 이벤트를 동반하며, 모든 string 상태는 개체의 BackgroundingEventArgs 속성에 State 유지되어야 하며, OS는 창을 다시 시작할 때까지 유지됩니다. 창을 다시 시작하면 재정의에 대한 인수 CreateWindowIActivationState 의해 상태가 제공됩니다.

이러한 이벤트 Window 외에도 클래스에는 다음과 같은 재정의 가능한 수명 주기 메서드가 있습니다.

  • OnCreated- 이벤트가 발생할 때 Created 호출됩니다.
  • OnActivated- 이벤트가 발생할 때 Activated 호출됩니다.
  • OnDeactivated- 이벤트가 발생할 때 Deactivated 호출됩니다.
  • OnStopped- 이벤트가 발생할 때 Stopped 호출됩니다.
  • OnResumed- 이벤트가 발생할 때 Resumed 호출됩니다.
  • OnDestroying- 이벤트가 발생할 때 Destroying 호출됩니다.
  • OnBackgrounding- 이벤트가 발생할 때 Backgrounding 호출됩니다.

수명 주기 이벤트를 구독하려면 클래스의 Window 메서드 App 를 재정의 CreateWindow 하여 이벤트를 구독할 수 있는 인스턴스를 만듭니 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그런 다음 인스턴스를 반환하기 위해 클래스의 메서드 App 를 재정의 CreateWindow 하여 -derived 클래스를 MyWindow 사용할 수 있습니다.

Warning

InvalidOperationException 속성이 설정되고 메서드가 인수를 허용하는 재정의 CreateWindowWindow 사용하여 개체를 만드는 경우 App.MainPage throw됩니다Page.

플랫폼 수명 주기 이벤트

.NET MAUI는 발생하는 플랫폼 수명 주기 이벤트에 대한 응답으로 호출되는 대리자를 정의합니다. 대리자를 호출할 때 실행되는 명명된 메서드 또는 익명 함수를 사용하여 이러한 대리자의 처리기를 지정할 수 있습니다. 이 메커니즘을 사용하면 일반적인 플랫폼 수명 주기 이벤트가 발생할 때 앱에 알림을 받을 수 있습니다.

Important

메서드가 ConfigureLifecycleEvents 네임스페이스에 Microsoft.Maui.LifecycleEvents 있습니다.

Android

다음 표에서는 발생하는 Android 수명 주기 이벤트에 대한 응답으로 호출되는 .NET MAUI 대리자를 나열합니다.

대리인 인수 설명 설명
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 활동에서 뒤로 키의 누름을 감지했을 때 호출됩니다.
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? 활동 시작이 완료된 후 OnStartOnRestoreInstanceState 호출될 때 호출됩니다. 항상 슈퍼 클래스의 구현을 호출합니다. 일반적으로 앱에서 사용하지 않아야 하는 시스템 전용 이벤트입니다.
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 OnRestoreInstanceStateOnRestartOnPause활동이 활성 상태이고 입력을 받을 준비가 되었음을 나타내기 위해 호출됩니다.
OnSaveInstanceState Android.App.Activity, Android.OS.Bundle 상태를 복원하거나 OnRestoreInstanceState복원할 수 있도록 종료되는 활동에서 인스턴스별 상태를 검색하기 위해 호출됩니다OnCreate.
OnStart Android.App.Activity 작업이 중지된 후 OnCreate 또는 OnRestart 일시 호출되지만 현재 사용자에게 표시됩니다. 항상 슈퍼 클래스의 구현을 호출합니다.
OnStop Android.App.Activity 활동이 사용자에게 더 이상 표시되지 않을 때 호출됩니다. 항상 슈퍼 클래스의 구현을 호출합니다.

Important

각 대리자는 대리자의 처리기를 등록하기 위해 호출할 수 있는 동일한 이름의 확장 메서드를 가지고 있습니다.

호출되는 Android 수명 주기 대리자에게 응답하려면 클래스의 메서드에서 MauiAppBuilder 개체의 메서드를 CreateMauiapp 호출 ConfigureLifecycleEvents 합니다MauiProgram. 그런 다음 개체에서 ILifecycleBuilder 메서드를 AddAndroid 호출하고 필요한 대리자의 처리기를 등록하도록 지정 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 활동 수명 주기 이해(Understand the Activity Lifecycle )를 참조하세요.

iOS

다음 표에서는 발생하는 iOS 수명 주기 이벤트에 대한 응답으로 호출되는 .NET MAUI 대리자를 나열합니다.

대리인 인수 설명
ApplicationSignificantTimeChange UIKit.UIApplication 자정, 운송업체 변경 시간 또는 일광 절약의 시작 또는 중지와 같은 중요한 시간 변경이 발생할 때 호출됩니다.
ContinueUserActivity UIKit.UIApplication, , Foundation.NSUserActivityUIKit.UIApplicationRestorationHandler 앱이 핸드오프를 사용하여 다른 디바이스에서 활동을 전송하는 등 사용자 활동과 관련된 데이터를 수신할 때 호출됩니다.
DidEnterBackground UIKit.UIApplication 앱이 백그라운드에 들어갔을 때 호출됩니다.
FinishedLaunching UIKit.UIApplication, Foundation.NSDictionary 앱이 시작될 때 호출됩니다.
OnActivated UIKit.UIApplication 앱이 시작되고 앱이 포그라운드로 반환될 때마다 호출됩니다.
OnResignActivation UIKit.UIApplication 앱이 백그라운드로 들어가거나, 일시 중단되거나, 사용자가 전화 통화 또는 문자와 같은 중단을 수신할 때 호출됩니다.
OpenUrl UIKit.UIApplication, Foundation.NSDictionary 앱이 지정된 URL을 열어야 하는 경우 호출됩니다.
PerformActionForShortcutItem UIKit.UIApplication, , UIKit.UIApplicationShortcutItemUIKit.UIOperationHandler 홈 화면 빠른 작업이 시작될 때 호출됩니다.
SceneContinueUserActivity UIKit.UIScene, Foundation.NSUserActivity 지정된 핸드오프 관련 작업을 처리하기 위해 호출됩니다.
SceneDidDisconnect UIKit.UIScene 앱에서 장면이 제거될 때 호출됩니다.
SceneDidEnterBackground UIKit.UIScene 장면이 백그라운드에서 실행되고 화면에 표시되지 않을 때 호출됩니다.
SceneDidFailToContinueUserActivity UIKit.UIScene, , stringFoundation.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.UISceneSessionUIKit.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.UIInterfaceOrientationUIKit.UITraitCollection 장면의 크기, 방향 또는 특성이 변경될 때 호출됩니다.

Important

각 대리자는 대리자의 처리기를 등록하기 위해 호출할 수 있는 동일한 이름의 확장 메서드를 가지고 있습니다.

대리인 인수 설명
ApplicationSignificantTimeChange UIKit.UIApplication 자정, 운송업체 변경 시간 또는 일광 절약의 시작 또는 중지와 같은 중요한 시간 변경이 발생할 때 호출됩니다.
ContinueUserActivity UIKit.UIApplication, , Foundation.NSUserActivityUIKit.UIApplicationRestorationHandler 앱이 핸드오프를 사용하여 다른 디바이스에서 활동을 전송하는 등 사용자 활동과 관련된 데이터를 수신할 때 호출됩니다.
DidEnterBackground UIKit.UIApplication 앱이 백그라운드에 들어갔을 때 호출됩니다.
FinishedLaunching UIKit.UIApplication, Foundation.NSDictionary 앱이 시작될 때 호출됩니다.
OnActivated UIKit.UIApplication 앱이 시작되고 앱이 포그라운드로 반환될 때마다 호출됩니다.
OnResignActivation UIKit.UIApplication 앱이 백그라운드로 들어가거나, 일시 중단되거나, 사용자가 전화 통화 또는 문자와 같은 중단을 수신할 때 호출됩니다.
OpenUrl UIKit.UIApplication, Foundation.NSDictionary 앱이 지정된 URL을 열어야 하는 경우 호출됩니다.
PerformActionForShortcutItem UIKit.UIApplication, , UIKit.UIApplicationShortcutItemUIKit.UIOperationHandler 홈 화면 빠른 작업이 시작될 때 호출됩니다.
PerformFetch UIKit.UIApplication, Action<UIBackgroundFetchResult> 다운로드할 데이터가 있는 경우 페치 작업을 시작할 수 있음을 앱에 알리기 위해 호출됩니다.
SceneContinueUserActivity UIKit.UIScene, Foundation.NSUserActivity 지정된 핸드오프 관련 작업을 처리하기 위해 호출됩니다.
SceneDidDisconnect UIKit.UIScene 앱에서 장면이 제거될 때 호출됩니다.
SceneDidEnterBackground UIKit.UIScene 장면이 백그라운드에서 실행되고 화면에 표시되지 않을 때 호출됩니다.
SceneDidFailToContinueUserActivity UIKit.UIScene, , stringFoundation.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.UISceneSessionUIKit.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.UIInterfaceOrientationUIKit.UITraitCollection 장면의 크기, 방향 또는 특성이 변경될 때 호출됩니다.

Important

각 대리자를 제외하고 PerformFetch대리자의 처리기를 등록하기 위해 호출할 수 있는 동일한 이름의 확장 메서드가 있습니다.

호출되는 iOS 수명 주기 대리자를 응답하려면 클래스의 메서드에서 MauiAppBuilder 개체의 메서드를 CreateMauiapp 호출 ConfigureLifecycleEvents 합니다MauiProgram. 그런 다음 개체에서 ILifecycleBuilder 메서드를 AddiOS 호출하고 필요한 대리자의 처리기를 등록하도록 지정 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

다음 표에서는 발생하는 Windows 수명 주기 이벤트에 대한 응답으로 호출되는 .NET MAUI 대리자를 나열합니다.

대리인 인수 설명
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 Win32 창이 서브클래스될 때 .NET MAUI에서 호출됩니다.
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 형식uintMessageId 속성이 포함됩니다. 이 속성의 값을 검사하여 앱 창에 전달된 메시지를 확인할 수 있습니다. Windows 메시지에 대한 자세한 내용은 Windows 메시지(Win32 및 C++시작)를 참조하세요. 창 메시지 상수 목록은 창 알림을 참조 하세요.

Important

각 대리자는 대리자의 처리기를 등록하기 위해 호출할 수 있는 동일한 이름의 확장 메서드를 가지고 있습니다.

호출되는 Windows 수명 주기 대리자에 응답하려면 클래스의 메서드에서 개체의 MauiAppBuilder 메서드를 CreateMauiApp 호출 ConfigureLifecycleEvents 합니다MauiProgram. 그런 다음 개체에서 ILifecycleBuilder 메서드를 AddWindows 호출하고 필요한 대리자의 처리기를 등록하도록 지정 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 호출하여 플랫폼 이벤트 이름을 인수로 지정합니다.

그런 다음 플랫폼 수명 주기 이벤트에 대한 알림을 받으려는 앱은 해당 클래스의 메서드를 MauiProgram 수정 CreateMauiApp 하여 개체에서 메서드를 ConfigureLifecycleEventsMauiAppBuilder 호출해야 합니다. 그런 다음 개체에서 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
    

    Windows의 형식을 MauiWinUIApplication 사용하여 해당 Current 속성을 통해 네이티브 앱 인스턴스에 액세스할 수 있습니다. Android의 형식을 MauiApplication 사용하여 네이티브 앱 인스턴스에 액세스할 수 있습니다. 마찬가지로 iOS의 형식을 MauiUIApplicationDelegate 사용하여 네이티브 앱 인스턴스에 액세스할 수 있습니다.

    Warning

    메서드를 사용하여 등록되지 않은 이벤트를 InvokeEvents 호출해도 예외는 throw되지 않습니다.

  • 클래스의 CreateMauiAppMauiProgram 메서드에서 개체의 메서드를 ConfigureLifecycleEvents 호출합니다 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 대리자를 지정할 수 있는 오버로드도 있습니다.