應用程式週期

.NET 多平臺應用程式 UI (.NET MAUI) 應用程式通常有四個執行狀態:未執行、執行停用停止。 當應用程式從未執行狀態轉換為執行中狀態、執行狀態轉換為已停用狀態、已停用狀態至已停止狀態、已停止狀態至執行狀態、已停止狀態至執行中狀態時,.NET MAUI 會在 類別上 Window 引發跨平臺生命週期事件,並將停止狀態轉換為未執行狀態。

下圖顯示 .NET MAUI 應用程式生命週期的概觀:

.NET MAUI app lifecycle

在圖表中,灰色橢圓表示應用程式未載入記憶體。 淺藍色橢圓形表示應用程序位於記憶體中。 弧形上的文字表示 .NET MAUI 所引發的事件,這些事件會提供通知給執行中的應用程式。

應用程式的執行狀態取決於應用程式的歷程記錄。 例如,第一次安裝應用程式或啟動裝置時,可以將應用程式視為 未執行。 啟動應用程式時, Created 會引發和 Activated 事件,且應用程式正在 執行。 如果不同的應用程式視窗取得焦點,Deactivated則會引發事件並停用應用程式。 如果使用者切換到不同的應用程式或返回裝置的主畫面,讓應用程式視窗不再顯示,Deactivated就會引發和 Stopped 事件,並停止應用程式。 如果使用者返回應用程式, Resuming 就會引發 事件,且應用程式正在 執行。 或者,應用程式在執行時可能會由用戶終止。 在此情況下,應用程式會停用,然後停止Destroying引發事件,而且應用程式未執行。 同樣地,裝置可能會因為資源限制而停止時終止應用程式,而且 Destroying 引發事件且應用程式 未執行

此外,.NET MAUI 可讓應用程式在引發平臺生命週期事件時收到通知。 如需詳細資訊,請參閱 平臺生命週期事件

跨平臺生命週期事件

類別 Window 會定義下列跨平臺生命週期事件:

事件 描述 要採取的動作
Created 建立原生窗口之後,就會引發此事件。 此時,跨平台視窗會有原生窗口處理程式,但視窗可能還看不到。
Activated 當視窗已啟動且成為焦點視窗或將成為焦點視窗時,就會引發此事件。
Deactivated 當視窗不再是焦點視窗時,就會引發這個事件。 不過,視窗可能仍會顯示。
Stopped 當視窗不再顯示時,就會引發此事件。 不保證應用程式會從這個狀態繼續,因為應用程式可能會由操作系統終止。 中斷與任何長時間執行的進程中斷連線,或取消任何可能耗用裝置資源的擱置要求。
Resumed 當應用程式在停止後繼續時,就會引發此事件。 此事件不會在第一次啟動您的應用程式時引發,而且只有在先前已引發事件時 Stopped ,才能引發。 訂閱任何必要的事件,並重新整理可見頁面上的任何內容。
Destroying 當原生視窗被終結並解除分配時,就會引發此事件。 重新開啟應用程式時,可能會針對新的原生視窗使用相同的跨平台視窗。 拿掉您已附加至原生視窗的任何事件訂用帳戶。

這些跨平臺事件會對應至不同的平臺事件,下表顯示此對應:

Event Android iOS Windows
Created OnPostCreate FinishedLaunching Created
Activated OnResume OnActivated ActivatedCodeActivatedPointerActivated
Deactivated OnPause OnResignActivation ActivatedDeactivated
Stopped OnStop DidEnterBackground VisibilityChanged
Resumed OnRestart WillEnterForeground Resumed
Destroying OnDestroy WillTerminate Closed

此外,類別 Window 也會定義 Backgrounding 在關閉視窗或進入背景狀態時,在iOS和Mac Catalyst上引發的事件。 BackgroundingEventArgs物件會伴隨此事件,而且任何string狀態都應該保存至 對象的 屬性BackgroundingEventArgs,OS 會保留該State屬性,直到繼續窗口為止。 當窗口繼續時,自變數會提供 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

下表列出為了回應所引發Android生命週期事件而叫用的 .NET MAUI 委派:

Delegate 引數 描述 註解
OnActivityResult Android.App.Activity、 、 intAndroid.App.ResultAndroid.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? 在呼叫 和 OnRestoreInstanceState 之後,於活動啟動完成時OnStart叫用。 一律呼叫超級類別的實作。 這是應用程式通常不應該使用的僅限系統事件。
OnPostResume Android.App.Activity 在呼叫之後,於活動繼續完成時 OnResume 叫用。 一律呼叫超級類別的實作。 這是應用程式通常不應該使用的僅限系統事件。
OnRequestPermissionsResult Android.App.Activity、 、 intstring[]Android.Content.PM.Permission[] 從要求許可權叫用為結果的回呼。
OnRestart Android.App.Activity OnStop在將目前活動重新顯示給用戶之後叫用 (使用者已巡覽回該活動)。 一律呼叫超級類別的實作。
OnRestoreInstanceState Android.App.Activity, Android.OS.Bundle 從先前儲存的狀態重新初始化活動之後 OnStart 叫用。
OnResume Android.App.Activity 在、 OnRestartOnPause之後OnRestoreInstanceState叫用 ,表示活動為使用中,且已準備好接收輸入。
OnSaveInstanceState Android.App.Activity, Android.OS.Bundle 叫用以從正在終止的活動擷取每個實例狀態,以便於或 OnRestoreInstanceStateOnCreate還原狀態。
OnStart Android.App.Activity 在活動停止之後 OnCreateOnRestart 之後叫用,但現在會顯示給使用者。 一律呼叫超級類別的實作。
OnStop Android.App.Activity 當使用者不再看到活動時叫用。 一律呼叫超級類別的實作。

重要

每個委派都有對應的相同命名擴充方法,可以呼叫 來註冊委派的處理程式。

若要回應所叫用的Android生命週期委派,ConfigureLifecycleEvents請在類別MauiProgram的方法中呼叫物件CreateMauiapp上的 MauiAppBuilder 方法。 然後,在 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 的活動生命週期

iOS

下表列出為了回應所引發之 iOS 生命週期事件的 .NET MAUI 委派:

Delegate 引數 描述
ApplicationSignificantTimeChange UIKit.UIApplication 發生重大時間變更時叫用,例如午夜、電信業者變更時間,或日光節約的開始或停止。
ContinueUserActivity UIKit.UIApplication、 、 Foundation.NSUserActivityUIKit.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.UIApplicationShortcutItemUIKit.UIOperationHandler 起始主畫面快速動作時叫用。
SceneContinueUserActivity UIKit.UIScene, Foundation.NSUserActivity 叫用以處理指定的 Handoff 相關活動。
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 叫用來準備接收 Handoff 相關數據。
SceneWillEnterForeground UIKit.UIScene 當場景即將在前景執行,並讓使用者看見時叫用。
WillEnterForeground UIKit.UIApplication 如果應用程式將從背景狀態傳回,則叫用 。
WillFinishLaunching UIKit.UIApplication, Foundation.NSDictionary 啟動應用程式時叫用,但狀態還原尚未發生。
WillTerminate UIKit.UIApplication 如果應用程式因記憶體限制或直接由用戶終止,則叫用。
WindowSceneDidUpdateCoordinateSpace UIKit.UIWindowScene、 、 UIKit.IUICoordinateSpaceUIKit.UIInterfaceOrientationUIKit.UITraitCollection 當場景的大小、方向或特性變更時叫用。

重要

每個委派都有對應的相同命名擴充方法,可用來註冊委派的處理程式。

Delegate 引數 描述
ApplicationSignificantTimeChange UIKit.UIApplication 發生重大時間變更時叫用,例如午夜、電信業者變更時間,或日光節約的開始或停止。
ContinueUserActivity UIKit.UIApplication、 、 Foundation.NSUserActivityUIKit.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.UIApplicationShortcutItemUIKit.UIOperationHandler 起始主畫面快速動作時叫用。
PerformFetch UIKit.UIApplication, Action<UIBackgroundFetchResult> 叫用來告訴應用程式,如果應用程式有要下載的數據,它可以開始擷取作業。
SceneContinueUserActivity UIKit.UIScene, Foundation.NSUserActivity 叫用以處理指定的 Handoff 相關活動。
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 叫用來準備接收 Handoff 相關數據。
SceneWillEnterForeground UIKit.UIScene 當場景即將在前景執行,並讓使用者看見時叫用。
WillEnterForeground UIKit.UIApplication 如果應用程式將從背景狀態傳回,則叫用 。
WillFinishLaunching UIKit.UIApplication, Foundation.NSDictionary 啟動應用程式時叫用,但狀態還原尚未發生。
WillTerminate UIKit.UIApplication 如果應用程式因記憶體限制或直接由用戶終止,則叫用。
WindowSceneDidUpdateCoordinateSpace UIKit.UIWindowScene、 、 UIKit.IUICoordinateSpaceUIKit.UIInterfaceOrientationUIKit.UITraitCollection 當場景的大小、方向或特性變更時叫用。

重要

除了 之外 PerformFetch,每個委派都有對應的相同命名擴充方法,可以呼叫 以註冊委派的處理程式。

若要回應所叫用的 iOS 生命週期委派,ConfigureLifecycleEvents請在 類別MauiProgram的 方法中MauiAppBuilder呼叫 物件CreateMauiapp上的 方法。 然後,在 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

下表列出叫用的 .NET MAUI 委派,以回應所引發的 Windows 生命週期事件:

Delegate 引數 描述
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 委派隨附的物件包含 MessageIduint別 的屬性。 您可以檢查此屬性的值,以判斷哪些訊息已傳遞至您的應用程式視窗。 如需 Windows 訊息的詳細資訊,請參閱 Windows 訊息(開始使用 Win32 和 C++)。 如需視窗訊息常數的清單,請參閱 視窗通知

重要

每個委派都有對應的相同命名擴充方法,可以呼叫 來註冊委派的處理程式。

若要回應所叫用的 Windows 生命週期委派,ConfigureLifecycleEvents請在 類別MauiProgram的 方法中呼叫 物件CreateMauiApp上的 MauiAppBuilder 方法。 然後,在 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 物件

平台程式代碼可以使用擴充方法,GetWindow從平臺生命週期事件擷取應用程式的 Window 物件:

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 自變數。

然後,想要接收平臺生命週期事件通知的應用程式應該修改CreateMauiAppMauiProgram 類別的方法,以在物件上MauiAppBuilder呼叫 ConfigureLifecycleEvents 方法。 然後,在 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 類別的 方法中 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 也有可指定委派的多載。