.NET MAUIでアプリのライフサイクル処理を実装

Xamarin時代は、AppクラスにOnResume関数やOnSleep関数をオーバーライドしてました。
MAUIだとちょっと変わるのでメモ書き。

Xamarin時代

public partial class App : Application
{
    MainPage _mainPage = null;
    
    public App()
    {
        InitializeComponent();

        _mainPage = new MainPage(this);
        MainPage = new NavigationPage(_mainPage);
    }

    protected override void OnSleep()
    {
        _mainPage.OnSleep();
    }

    protected override void OnResume()
    {
        _mainPage.OnResume();
    }
}
public partial class MainPage : ContentPage
{
    private static MainPage? _singleton;
    public static MainPage GetInstance()
    {
        return _singleton;
    }

#if ANDROID
    public static void OnCreate(Activity activity, Bundle bundle)
    {
    }
#endif
    public static void OnResume(object obj)
    {
        GetInstance().OnResume();
    }

    public void OnResume()
    {
        // Xamarin時代のOnResume
    }

    public static void OnSleep(object obj)
    {
        GetInstance().OnSleep();
    }

    public void OnSleep()
    {
        // Xamarin時代のOnSleep
    }
}

.NET MAUIに移行

MauiProgramクラスのCreateMauiApp関数に呼び出す関数を登録します。
例えば、AndroidはOnCreateでactivityを取りたいし、アプリのStopとResumeはAndroidでもiOSでも使いたいならこんな感じ。

public static class MauiProgram
{
    public static MauiApp CreateMauiApp()
    {
        var builder = MauiApp.CreateBuilder();
        builder
            .UseMauiApp<App>()
#if ANDROID
            .ConfigureLifecycleEvents(events =>
            {
                events.AddAndroid(android => android
                    .OnCreate((activity, bundle) => HOGE.OnCreate(activity, bundle))
                    .OnStop((activity) => HOGE.OnSleep(activity))
                    .OnResume((activity) => HOGE.OnResume(activity))
                    );
#elif IOS
               events.AddiOS(ios => ios
                   .DidEnterBackground((app) => HOGE.OnSleep(null))
                   .WillEnterForeground((app) => HOGE.OnResume(null))
                   );
#endif
            .ConfigureFonts(fonts =>
            {
                fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");
                fonts.AddFont("OpenSans-Semibold.ttf", "OpenSansSemibold");
            });

        return builder.Build();
    }
}

で、static関数で実装します。
例えばHogeではなくMainPageを指定して、シングルトンでXamarin時代の関数を呼び出すとか。

public partial class MainPage : ContentPage
{
    private static MainPage? _singleton;
    public static MainPage GetInstance()
    {
        return _singleton;
    }

#if ANDROID
    public static void OnCreate(Activity activity, Bundle bundle)
    {
    }
#endif
    public static void OnResume(object obj)
    {
        GetInstance().OnResume();
    }

    public void OnResume()
    {
        // Xamarin時代のOnResume
    }

    public static void OnSleep(object obj)
    {
        GetInstance().OnSleep();
    }

    public void OnSleep()
    {
        // Xamarin時代のOnSleep
    }
}

他にもニッチなIT関連要素をまとめていますので、よければ一覧記事もご覧ください。

返信を残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)