앱 수명 주기
.NET 다중 플랫폼 앱 UI(.NET MAUI) 앱에는 일반적으로 실행되지 않음, 실행 중, 비활성화 및 중지된 네 가지 실행 상태가 있습니다. .NET MAUI는 앱이 실행되지 않는 상태에서 실행 중 상태로 전환되고, 실행 상태가 비활성화된 상태로, 비활성화된 상태를 중지된 상태로, 중지된 상태를 실행 중 상태로, 중지된 상태를 실행되지 않는 상태로 전환할 때 클래스에서 플랫폼 간 수명 주기 이벤트를 Window
발생합니다.
다음 다이어그램에서는 .NET MAUI 앱 수명 주기에 대한 개요를 보여 있습니다.
다이어그램에서 회색 타원은 앱이 메모리에 로드되지 않음을 나타냅니다. 연한 파란색 타원은 앱이 메모리에 있음을 나타냅니다. 호에 있는 텍스트는 실행 중인 앱에 알림을 제공하는 .NET MAUI에서 발생하는 이벤트를 나타냅니다.
앱의 실행 상태는 앱의 기록에 따라 달라집니다. 예를 들어 앱이 처음으로 설치되거나 디바이스가 시작된 경우 앱이 실행되고 있지 않은 것으로 간주될 수 있습니다. 앱이 시작 Created
Activated
되면 이벤트가 발생하고 앱이 실행됩니다. 다른 앱 창에 포커스가 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 (CodeActivated 및 PointerActivated ) |
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는 창을 다시 시작할 때까지 유지됩니다. 창을 다시 시작하면 재정의에 대한 인수 CreateWindow
에 IActivationState
의해 상태가 제공됩니다.
이러한 이벤트 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 = new Window(new AppShell());
window.Created += (s, e) =>
{
// Custom logic
};
return window;
}
}
}
namespace MyMauiApp
{
public partial class App : Application
{
public App()
{
InitializeComponent();
}
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
속성이 설정되고 메서드가 인수를 허용하는 재정의 CreateWindow
를 Window
사용하여 개체를 만드는 경우 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? |
활동 시작이 완료된 후 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 OnRestart OnPause 활동이 활성 상태이고 입력을 받을 준비가 되었음을 나타내기 위해 호출됩니다. |
|
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 및 Mac Catalyst
다음 표에서는 발생하는 iOS 및 Mac Catalyst 수명 주기 이벤트에 대한 응답으로 호출되는 .NET MAUI 대리자를 나열합니다.
대리인 | 인수 | 설명 |
---|---|---|
ApplicationSignificantTimeChange |
UIKit.UIApplication |
자정, 운송업체 변경 시간 또는 일광 절약의 시작 또는 중지와 같은 중요한 시간 변경이 발생할 때 호출됩니다. |
ContinueUserActivity |
UIKit.UIApplication , , Foundation.NSUserActivity UIKit.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.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 |
장면의 크기, 방향 또는 특성이 변경될 때 호출됩니다. |
Important
각 대리자를 제외하고 PerformFetch
대리자의 처리기를 등록하기 위해 호출할 수 있는 동일한 이름의 확장 메서드가 있습니다.
호출되는 iOS 및 Mac Catalyst 수명 주기 대리자에게 응답하려면 클래스의 메서드에서 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 || MACCATALYST
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
형식uint
의 MessageId
속성이 포함됩니다. 이 속성의 값을 검사하여 앱 창에 전달된 메시지를 확인할 수 있습니다. 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
하여 개체에서 메서드를 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
Windows의 형식을
MauiWinUIApplication
사용하여 해당Current
속성을 통해 네이티브 앱 인스턴스에 액세스할 수 있습니다. Android의 형식을MauiApplication
사용하여 네이티브 앱 인스턴스에 액세스할 수 있습니다. 마찬가지로 iOS의 형식을MauiUIApplicationDelegate
사용하여 네이티브 앱 인스턴스에 액세스할 수 있습니다.Warning
메서드를 사용하여 등록되지 않은 이벤트를
InvokeEvents
호출해도 예외는 throw되지 않습니다.클래스의
CreateMauiApp
MauiProgram
메서드에서 개체의 메서드를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
대리자를 지정할 수 있는 오버로드도 있습니다.
.NET MAUI