アプリのライフサイクル

.NET Multi-platform App UI (.NET MAUI) アプリには、通常、未実行実行中非アクティブ停止の 4 つの実行状態があります。 .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 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 で保持されます。 ウィンドウが再開されると、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 = 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 メソッドをオーバーライドして MyWindow インスタンスを返すことで利用できるようになります。

警告

App.MainPage プロパティが設定され、Page 引数を受け取るオーバーライドを使用して CreateWindow メソッドが Window オブジェクトを作成すると、InvalidOperationException がスローされます。

プラットフォーム ライフサイクル イベント

.NET MAUI は、発生しているプラットフォーム ライフサイクル イベントに応答して呼び出されるデリゲートを定義します。 これらのデリゲートには、名前付きメソッドまたは匿名関数を使用してハンドラーを指定できます。これは、デリゲートが呼び出されたときに実行されます。 このメカニズムにより、一般的なプラットフォーム ライフサイクル イベントが発生したときにアプリに通知を送ることができます。

重要

ConfigureLifecycleEvents メソッドは、Microsoft.Maui.LifecycleEvents 名前空間内にあります。

Android

次の表は、Android ライフサイクル イベントが発生した場合に呼び出される .NET MAUI デリゲートの一覧です。

委任 引数 説明 Comments
OnActivityResult Android.App.ActivityintAndroid.App.ResultAndroid.Content.Intent? 自身が起動したアクティビティが終了したときに呼び出されます。
OnApplicationConfigurationChanged Android.App.ApplicationAndroid.Content.Res.Configuration コンポーネントの実行中にデバイス構成が変更されたときに呼び出されます。
OnApplicationCreate Android.App.Application アプリが起動されたときに、アクティビティ、サービス、またはレシーバー オブジェクト (コンテンツ プロバイダーを除く) が作成される前に呼び出されます。
OnApplicationCreating Android.App.Application アプリの起動中、アクティビティ、サービス、またはレシーバー オブジェクト (コンテンツ プロバイダーを除く) が作成される前に呼び出されます。
OnApplicationLowMemory Android.App.Application システムがメモリ不足の状態で実行されていて、アクティブに実行中のプロセスのメモリ使用量を削減する必要がある場合に呼び出されます。
OnApplicationTrimMemory Android.App.ApplicationAndroid.Content.TrimMemory 不要なメモリをプロセスから削減するのに適したタイミングであるとオペレーティング システムが判断したときに呼び出されます。
OnBackPressed Android.App.Activity アクティビティで、バック キーが押されたことを検出したときに呼び出されます。
OnConfigurationChanged Android.App.ActivityAndroid.Content.Res.Configuration アクティビティの実行中にデバイス構成が変更されたときに呼び出されます。
OnCreate Android.App.ActivityAndroid.OS.Bundle? アクティビティの作成時に発生します。
OnDestroy Android.App.Activity アクティビティが終了するとき、またはシステムが領域を節約するためにアクティビティ インスタンスを一時的に破棄しているときに呼び出されます。 常にスーパー クラスの実装を呼び出します。
OnNewIntent Android.App.ActivityAndroid.Content.Intent? アクティビティの新しいインスタンスを開始する代わりに、アクティビティ スタックの最上位でアクティビティが再起動されたときに呼び出されます。
OnPause Android.App.Activity アクティビティがバックグラウンドに移行中で、まだ強制終了されていない場合に呼び出されます。 常にスーパー クラスの実装を呼び出します。
OnPostCreate Android.App.ActivityAndroid.OS.Bundle? アクティビティの起動が完了し、OnStartOnRestoreInstanceState が呼び出された後に呼び出されます。 常にスーパー クラスの実装を呼び出します。 これはシステム専用のイベントであり、通常はアプリでは使用しません。
OnPostResume Android.App.Activity アクティビティの再開が完了したとき、OnResume が呼び出された後に呼び出されます。 常にスーパー クラスの実装を呼び出します。 これはシステム専用のイベントであり、通常はアプリで使用しないでください。
OnRequestPermissionsResult Android.App.Activityintstring[]Android.Content.PM.Permission[] アクセス許可を要求した結果のコールバックとして呼び出されます。
OnRestart Android.App.Activity OnStop の後、現在のアクティビティがユーザーに再表示される (ユーザーが移動して戻ってきた) ときに呼び出されます。 常にスーパー クラスの実装を呼び出します。
OnRestoreInstanceState Android.App.ActivityAndroid.OS.Bundle アクティビティが以前に保存された状態から再初期化されるとき、OnStart の後に呼び出されます。
OnResume Android.App.Activity OnRestoreInstanceStateOnRestartOnPause の後に呼び出され、アクティビティがアクティブで、入力を受け取る準備ができていることを示します。
OnSaveInstanceState Android.App.ActivityAndroid.OS.Bundle OnCreate または OnRestoreInstanceState で状態を復元できるように、強制終了中のアクティビティからインスタンスごとの状態を取得するために呼び出されます。
OnStart Android.App.Activity OnCreate または OnRestart の後、アクティビティが停止していますが、現在ユーザーに表示されているときに呼び出されます。 常にスーパー クラスの実装を呼び出します。
OnStop Android.App.Activity アクティビティがユーザーに表示されなくなったときに呼び出されます。 常にスーパー クラスの実装を呼び出します。

重要

各デリゲートには、対応する同じ名前の拡張メソッドがあり、デリゲートのハンドラーを登録するために呼び出すことができます。

呼び出されている Android ライフサイクル デリゲートに応答するには、MauiProgram クラスの CreateMauiapp メソッド内の MauiAppBuilder オブジェクトに対して ConfigureLifecycleEvents メソッドを呼び出します。 次に、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 デリゲートを示します。

委任 引数 説明
ApplicationSignificantTimeChange UIKit.UIApplication 午前 0 時、キャリアが時刻を変更したとき、夏時間の開始時や終了時など、大幅な時間変更が発生したときに呼び出されます。
ContinueUserActivity UIKit.UIApplicationFoundation.NSUserActivityUIKit.UIApplicationRestorationHandler ハンドオフを使用して別のデバイスからアクティビティを転送するなど、ユーザー アクティビティに関連付けられたデータをアプリが受信したときに呼び出されます。
DidEnterBackground UIKit.UIApplication アプリがバックグラウンドに入ったときに呼び出されます。
FinishedLaunching UIKit.UIApplicationFoundation.NSDictionary アプリが起動したときに呼び出されます。
OnActivated UIKit.UIApplication アプリの起動時や、アプリがフォアグラウンドに戻るたびに呼び出されます。
OnResignActivation UIKit.UIApplication アプリがバックグラウンドに入るとき、中断されるとき、またはユーザーが電話やテキストなどの中断を受けたときに呼び出されます。
OpenUrl UIKit.UIApplicationFoundation.NSDictionary アプリが指定した URL を開く必要があるときに呼び出されます。
PerformActionForShortcutItem UIKit.UIApplicationUIKit.UIApplicationShortcutItemUIKit.UIOperationHandler ホーム画面のクイック アクションが開始されたときに呼び出されます。
SceneContinueUserActivity UIKit.UISceneFoundation.NSUserActivity 指定したハンドオフ関連のアクティビティを処理するために呼び出されます。
SceneDidDisconnect UIKit.UIScene シーンがアプリから削除されたときに呼び出されます。
SceneDidEnterBackground UIKit.UIScene シーンがバックグラウンドで実行されていて、画面上にない場合に呼び出されます。
SceneDidFailToContinueUserActivity UIKit.UIScenestringFoundation.NSError アクティビティを完了できなかったことをユーザーに通知するために呼び出されます。
SceneDidUpdateUserActivity UIKit.UISceneFoundation.NSUserActivity 指定したアクティビティが更新されたときに呼び出されます。
SceneOnActivated UIKit.UIScene シーンがアクティブになり、ユーザー イベントに応答できるようになると呼び出されます。
SceneOnResignActivation UIKit.UIScene シーンがアクティブな状態を終了し、ユーザー イベントへの応答を停止しようとしているときに呼び出されます。
SceneOpenUrl UIKit.UISceneFoundation.NSSet<UIKit.UIOpenUrlContext> シーンが 1 つ以上の URL を開くよう要求したときに呼び出されます。
SceneRestoreInteractionState UIKit.UISceneFoundation.NSUserActivity アクティビティの状態を復元するために呼び出されます。
SceneWillConnect UIKit.UISceneUIKit.UISceneSessionUIKit.UISceneConnectionOptions シーンがアプリに追加されたときに呼び出されます。
SceneWillContinueUserActivity UIKit.UIScenestring ハンドオフ関連のデータを受け取る準備をするために呼び出されます。
SceneWillEnterForeground UIKit.UIScene シーンがフォアグラウンドで実行され、ユーザーに表示されるときに呼び出されます。
WillEnterForeground UIKit.UIApplication アプリがバックグラウンド状態から戻る場合に呼び出されます。
WillFinishLaunching UIKit.UIApplicationFoundation.NSDictionary アプリの起動が開始されても、状態の復元がまだ発生していないときに呼び出されます。
WillTerminate UIKit.UIApplication メモリの制約のためにアプリが終了した場合、またはユーザーが直接アプリを終了した場合に呼び出されます。
WindowSceneDidUpdateCoordinateSpace UIKit.UIWindowSceneUIKit.IUICoordinateSpaceUIKit.UIInterfaceOrientationUIKit.UITraitCollection シーンのサイズ、向き、または特性が変化したときに呼び出されます。

重要

各デリゲートには、対応する同じ名前の拡張メソッドがあり、デリゲートのハンドラーを登録するために呼び出すことができます。

委任 引数 説明
ApplicationSignificantTimeChange UIKit.UIApplication 午前 0 時などのキャリアが変更された時刻、夏時間の開始または停止など、大幅な時間変更が発生したときに呼び出されます。
ContinueUserActivity UIKit.UIApplicationFoundation.NSUserActivityUIKit.UIApplicationRestorationHandler ハンドオフを使用して別のデバイスからアクティビティを転送するなど、ユーザー アクティビティに関連付けられたデータをアプリが受信したときに呼び出されます。
DidEnterBackground UIKit.UIApplication アプリがバックグラウンドに入ったときに呼び出されます。
FinishedLaunching UIKit.UIApplicationFoundation.NSDictionary アプリが起動したときに呼び出されます。
OnActivated UIKit.UIApplication アプリの起動時や、アプリがフォアグラウンドに戻るたびに呼び出されます。
OnResignActivation UIKit.UIApplication アプリがバックグラウンドに入るとき、中断されるとき、またはユーザーが電話やテキストなどの中断を受けたときに呼び出されます。
OpenUrl UIKit.UIApplicationFoundation.NSDictionary アプリが指定した URL を開く必要があるときに呼び出されます。
PerformActionForShortcutItem UIKit.UIApplicationUIKit.UIApplicationShortcutItemUIKit.UIOperationHandler ホーム画面のクイック アクションが開始されたときに呼び出されます。
PerformFetch UIKit.UIApplicationAction<UIBackgroundFetchResult> ダウンロードするデータがある場合に、フェッチ操作を開始できることをアプリに通知するために呼び出されます。
SceneContinueUserActivity UIKit.UISceneFoundation.NSUserActivity 指定したハンドオフ関連のアクティビティを処理するために呼び出されます。
SceneDidDisconnect UIKit.UIScene シーンがアプリから削除されたときに呼び出されます。
SceneDidEnterBackground UIKit.UIScene シーンがバックグラウンドで実行されていて、画面上にない場合に呼び出されます。
SceneDidFailToContinueUserActivity UIKit.UIScenestringFoundation.NSError アクティビティを完了できなかったことをユーザーに通知するために呼び出されます。
SceneDidUpdateUserActivity UIKit.UISceneFoundation.NSUserActivity 指定したアクティビティが更新されたときに呼び出されます。
SceneOnActivated UIKit.UIScene シーンがアクティブになり、ユーザー イベントに応答できるようになると呼び出されます。
SceneOnResignActivation UIKit.UIScene シーンがアクティブな状態を終了し、ユーザー イベントへの応答を停止しようとしているときに呼び出されます。
SceneOpenUrl UIKit.UISceneFoundation.NSSet<UIKit.UIOpenUrlContext> シーンが 1 つ以上の URL を開くよう要求したときに呼び出されます。
SceneRestoreInteractionState UIKit.UISceneFoundation.NSUserActivity アクティビティの状態を復元するために呼び出されます。
SceneWillConnect UIKit.UISceneUIKit.UISceneSessionUIKit.UISceneConnectionOptions シーンがアプリに追加されたときに呼び出されます。
SceneWillContinueUserActivity UIKit.UIScenestring ハンドオフ関連のデータを受け取る準備をするために呼び出されます。
SceneWillEnterForeground UIKit.UIScene シーンがフォアグラウンドで実行され、ユーザーに表示されるときに呼び出されます。
WillEnterForeground UIKit.UIApplication アプリがバックグラウンド状態から戻る場合に呼び出されます。
WillFinishLaunching UIKit.UIApplicationFoundation.NSDictionary アプリの起動が開始されても、状態の復元がまだ発生していないときに呼び出されます。
WillTerminate UIKit.UIApplication メモリの制約のためにアプリが終了した場合、またはユーザーが直接アプリを終了した場合に呼び出されます。
WindowSceneDidUpdateCoordinateSpace UIKit.UIWindowSceneUIKit.IUICoordinateSpaceUIKit.UIInterfaceOrientationUIKit.UITraitCollection シーンのサイズ、向き、または特性が変化したときに呼び出されます。

重要

PerformFetch を除く各デリゲートには、同じ名前の拡張メソッドがあります。この拡張メソッドは、デリゲートのハンドラーを登録するために呼び出すことができます。

呼び出されている iOS ライフサイクル デリゲートに応答するには、MauiProgram クラスの CreateMauiapp メソッド内の MauiAppBuilder オブジェクトに対して ConfigureLifecycleEvents メソッドを呼び出します。 次に、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 の「Managing Your App's Life Cycl」をご覧ください。

Windows

次の表に、発生している Windows ライフサイクル イベントに応答して呼び出される .NET MAUI デリゲートを示します。

委任 引数 説明
OnActivated Microsoft.UI.Xaml.WindowMicrosoft.UI.Xaml.WindowActivatedEventArgs アプリの再開中以外の場合にプラットフォーム Activated イベントが発生したときに呼び出されます。
OnClosed Microsoft.UI.Xaml.WindowMicrosoft.UI.Xaml.WindowEventArgs プラットフォーム Closed イベントが発生したときに呼び出されます。
OnLaunched Microsoft.UI.Xaml.WindowMicrosoft.UI.Xaml.LaunchActivatedEventArgs ネイティブ ウィンドウが作成されてアクティブ化されると、.NET MAUI の Application.OnLaunched オーバーライドによって呼び出されます。
OnLaunching Microsoft.UI.Xaml.WindowMicrosoft.UI.Xaml.LaunchActivatedEventArgs ネイティブ ウィンドウが作成されてアクティブ化される前に、.NET MAUI の Application.OnLaunched オーバーライドによって呼び出されます。
OnPlatformMessage Microsoft.UI.Xaml.WindowWindowsPlatformMessageEventArgs .NET MAUI が特定のネイティブ Windows メッセージを受信したときに呼び出されます。
OnPlatformWindowSubclassed Microsoft.UI.Xaml.WindowWindowsPlatformWindowSubclassedEventArgs Win32 ウィンドウがサブクラス化されたときに .NET MAUI によって呼び出されます。
OnResumed Microsoft.UI.Xaml.Window アプリが再開中の場合、プラットフォーム Activated イベントが発生したときに呼び出されます。
OnVisibilityChanged Microsoft.UI.Xaml.WindowMicrosoft.UI.Xaml.WindowVisibilityChangedEventArgs プラットフォーム VisibilityChanged イベントが発生したときに呼び出されます。
OnWindowCreated Microsoft.UI.Xaml.Window クロスプラットフォーム Window 用にネイティブ ウィンドウが作成されたときに呼び出されます。

.NET MAUI は、OnPlatformMessage デリゲートを使用して、特定のネイティブ Windows メッセージをライフサイクル イベントとして公開します。 このデリゲートに付随する WindowsPlatformMessageEventArgs オブジェクトには、uint 型の MessageId プロパティが含まれています。 このプロパティの値を調べて、アプリ ウィンドウに渡されたメッセージを確認できます。 Windows メッセージの詳細については、「Windows メッセージ (Win32 と C++ の概要)」をご覧ください。 ウィンドウ メッセージ定数の一覧については、「ウィンドウ通知」をご覧ください。

重要

各デリゲートには、対応する同じ名前の拡張メソッドがあり、デリゲートのハンドラーを登録するために呼び出すことができます。

呼び出される Windows ライフサイクル デリゲートに応答するには、MauiProgram クラスの CreateMauiApp メソッドで MauiAppBuilder オブジェクトに対して ConfigureLifecycleEvents メソッドを呼び出します。 次に、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 メソッドを呼び出して、プラットフォーム イベント名を引数として指定します。

次に、プラットフォーム ライフサイクル イベントの通知を受け取るアプリで、MauiAppBuilder オブジェクトの ConfigureLifecycleEvents メソッドを呼び出すように MauiProgram クラスの CreateMauiApp メソッドを変更します。 次に、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 型を使用して、ネイティブ アプリ インスタンスにアクセスできます。

    警告

    InvokeEvents メソッドを使用して未登録のイベントを呼び出しても、例外はスローされません。

  • MauiProgram クラスの CreateMauiApp メソッドで、MauiAppBuilder オブジェクトの ConfigureLifecycleEvents メソッドを呼び出します。 次に、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 メソッドで指定されたアクションが実行されます。

Note

AddEvent メソッドには、デリゲートを指定できるようにするオーバーロードもあります。