Životní cyklus aplikace

Aplikace .NET Multi-platform App UI (.NET MAUI) mají obecně čtyři stavy spouštění: neběží, neběží, deaktivuje a zastaví. .NET MAUI vyvolává události životního cyklu napříč platformami ve Window třídě, když aplikace přejde z neběžého stavu na spuštěný stav, stav spuštění do deaktivovaný stav, deaktivovaný stav do zastaveného stavu, zastavený stav do spuštěného stavu a zastavený stav na stav, který není spuštěný.

Následující diagram znázorňuje přehled životního cyklu aplikace .NET MAUI:

Životní cyklus aplikace .NET MAUI

V diagramu šedý ovál označuje, že aplikace není načtena do paměti. Světle modré ovály označují, že aplikace je v paměti. Text na obloukech označuje události vyvolané rozhraním .NET MAUI, které poskytují oznámení spuštěné aplikaci.

Stav spuštění aplikace závisí na historii aplikace. Pokud je například aplikace nainstalovaná poprvé nebo se spustí zařízení, je možné aplikaci považovat za nepoběženou. Po spuštění Created aplikace se vyvolá události Activated a aplikace je spuštěná. Pokud se zaměří jiné okno aplikace, Deactivated vyvolá se událost a aplikace se deaktivuje. Pokud se uživatel přepne na jinou aplikaci nebo se vrátí na domovskou obrazovku zařízení, takže okno aplikace už není viditelné, Deactivated vyvolá se události a Stopped aplikace se zastaví. Pokud se uživatel vrátí do aplikace, Resuming vyvolá se událost a aplikace se spustí. Případně může být aplikace ukončena uživatelem, když je spuštěná. V takovém případě se aplikace deaktivuje a pak se zastaví, Destroying událost se vyvolá a aplikace není spuštěná. Podobně může zařízení ukončit aplikaci, když je zastavená, kvůli omezením prostředků a událost se vyvolá a Destroying aplikace není spuštěná.

Rozhraní .NET MAUI navíc umožňuje aplikacím dostávat oznámení o vyvolání událostí životního cyklu platformy. Další informace najdete v tématu Události životního cyklu platformy.

Události životního cyklu napříč platformami

Třída Window definuje následující události životního cyklu napříč platformami:

Událost Description Akce, která se má provést
Created Tato událost se vyvolá po vytvoření nativního okna. V tomto okamžiku bude mít okno pro různé platformy nativní obslužnou rutinu okna, ale okno ještě nemusí být viditelné.
Activated Tato událost se vyvolá, když je okno aktivováno a je nebo se stane prioritním oknem.
Deactivated Tato událost se vyvolá, když okno již není prioritním oknem. Okno ale může být stále viditelné.
Stopped Tato událost se vyvolá, když okno již není viditelné. Neexistuje žádná záruka, že aplikace bude pokračovat z tohoto stavu, protože může být ukončena operačním systémem. Odpojte se od dlouhotrvajících procesů nebo zrušte všechny čekající požadavky, které můžou spotřebovávat prostředky zařízení.
Resumed Tato událost se vyvolá, když se aplikace po zastavení obnoví. Tato událost nebude vyvolána při prvním spuštění aplikace a může být vyvolána pouze v případě, že Stopped byla událost dříve vyvolána. Přihlaste se k odběru všech požadovaných událostí a aktualizujte veškerý obsah, který je na viditelné stránce.
Destroying Tato událost se vyvolá, když je nativní okno zničeno a uvolněno. Stejné okno pro různé platformy se může použít pro nové nativní okno při opětovném otevření aplikace. Odeberte všechna odběry událostí, která jste připojili k nativnímu okně.

Tyto události napříč platformami se mapují na různé události platformy a následující tabulka ukazuje toto mapování:

Událost Android iOS Windows
Created OnPostCreate FinishedLaunching Created
Activated OnResume OnActivated Activated (CodeActivated a PointerActivated)
Deactivated OnPause OnResignActivation Activated (Deactivated)
Stopped OnStop DidEnterBackground VisibilityChanged
Resumed OnRestart WillEnterForeground Resumed
Destroying OnDestroy WillTerminate Closed

Kromě těchto událostí Window má třída také následující přepisovatelné metody:

  • OnCreated, která se vyvolá při Created vyvolání události.
  • OnActivated, která se vyvolá při Activated vyvolání události.
  • OnDeactivated, která se vyvolá při Deactivated vyvolání události.
  • OnStopped, která se vyvolá při Stopped vyvolání události.
  • OnResumed, která se vyvolá při Resumed vyvolání události.
  • OnDestroying, která se vyvolá při Destroying vyvolání události.

Pokud se chcete přihlásit k odběru Window událostí životního cyklu, přepište metodu CreateWindow ve třídě App a vytvořte Window instanci, na které se můžete přihlásit k odběru událostí:

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;
        }
    }
}

Alternativně, pokud chcete použít přepsání životního cyklu, vytvořte třídu, která je odvozena od Window třídy.

namespace MyMauiApp
{
    public class MyWindow : Window
    {
        public MyWindow() : base()
        {
        }

        public MyWindow(Page page) : base(page)
        {
        }

        protected override void OnCreated()
        {
            // Register services
        }
    }
}

Odvozenou Windowtřídu pak lze využít přepsáním CreateWindow metody ve vaší App třídě, aby se vrátila MyWindow instance.

Upozornění

Vyvolá InvalidOperationException se, pokud App.MainPage je vlastnost nastavena a CreateWindow metoda vytvoří Window objekt pomocí přepsání, který přijímá Page argument.

Události životního cyklu platformy

Rozhraní .NET MAUI definuje delegáty, které jsou vyvolány v reakci na vyvolání událostí životního cyklu platformy. Obslužné rutiny lze pro tyto delegáty zadat pomocí pojmenovaných metod nebo anonymních funkcí, které se spustí při vyvolání delegáta. Tento mechanismus umožňuje aplikacím dostávat oznámení při vyvolání běžných událostí životního cyklu platformy.

Důležité

Metoda ConfigureLifecycleEvents je v Microsoft.Maui.LifecycleEvents oboru názvů.

Android

Následující tabulka uvádí delegáty .NET MAUI, které jsou vyvolány v reakci na vyvolání událostí životního cyklu Androidu:

Delegát Argumenty Description Komentáře
OnActivityResult Android.App.Activity, int, Android.App.Result, Android.Content.Intent? Vyvolána při spuštění aktivity se ukončí.
OnApplicationConfigurationChanged Android.App.Application, Android.Content.Res.Configuration Vyvolá se, když se konfigurace zařízení změní, když je komponenta spuštěná.
OnApplicationCreate Android.App.Application Vyvoláno při spuštění aplikace před vytvořením aktivity, služby nebo objektu příjemce (s výjimkou poskytovatelů obsahu).
OnApplicationCreating Android.App.Application Vyvoláno při spuštění aplikace před vytvořením aktivity, služby nebo objektu příjemce (s výjimkou poskytovatelů obsahu).
OnApplicationLowMemory Android.App.Application Vyvoláno při nedostatku paměti systému a aktivně spuštěné procesy by měly oříznout využití paměti.
OnApplicationTrimMemory Android.App.Application, Android.Content.TrimMemory Vyvolá se, když operační systém zjistil, že je vhodný čas pro proces oříznout nepotřebnou paměť z procesu.
OnBackPressed Android.App.Activity Vyvoláno, když aktivita zjistila stisknutí zpětné klávesy.
OnConfigurationChanged Android.App.Activity, Android.Content.Res.Configuration Vyvolá se, když se konfigurace zařízení změní, když je vaše aktivita spuštěná.
OnCreate Android.App.Activity, Android.OS.Bundle? Vyvolá se při vytváření aktivity.
OnDestroy Android.App.Activity Vyvolá se při dokončení aktivity nebo protože systém dočasně zničí instanci aktivity, aby se ušetřilo místo. Vždy volejte implementaci supertřídy.
OnNewIntent Android.App.Activity, Android.Content.Intent? Vyvolá se při opětovném spuštění aktivity v horní části zásobníku aktivit místo nové instance spuštěné aktivity.
OnPause Android.App.Activity Vyvolá se, když aktivita přejde na pozadí, ale ještě nebyla ukončena. Vždy volejte implementaci supertřídy.
OnPostCreate Android.App.Activity, Android.OS.Bundle? Vyvolá se při dokončení spuštění aktivity a OnRestoreInstanceState po OnStart zavolání. Vždy volejte implementaci supertřídy. Jedná se o systémovou událost, která by obecně neměla být používána aplikacemi.
OnPostResume Android.App.Activity Vyvolá se při dokončení obnovení aktivity po OnResume zavolání. Vždy volejte implementaci supertřídy. Jedná se o systémovou událost, která by obecně neměla být používána aplikacemi.
OnRequestPermissionsResult Android.App.Activity, int, string[], Android.Content.PM.Permission[] Vyvoláno jako zpětné volání pro výsledek žádosti o oprávnění.
OnRestart Android.App.Activity Vyvoláno po OnStop opětovném zobrazení aktuální aktivity uživateli (uživatel se k ní vrátil). Vždy volejte implementaci supertřídy.
OnRestoreInstanceState Android.App.Activity, Android.OS.Bundle Vyvolána po OnStart opětovné inicializaci aktivity z dříve uloženého stavu.
OnResume Android.App.Activity Vyvoláno po OnRestoreInstanceState, OnRestartnebo OnPause, indikovat, že aktivita je aktivní a je připravena přijímat vstup.
OnSaveInstanceState Android.App.Activity, Android.OS.Bundle Vyvoláno k načtení stavu jednotlivých instancí z aktivity, která se ukončí, aby se stav mohl obnovit v OnCreate nebo OnRestoreInstanceState.
OnStart Android.App.Activity Vyvolána po OnCreate nebo OnRestart po zastavení aktivity, ale nyní se uživateli zobrazuje. Vždy volejte implementaci supertřídy.
OnStop Android.App.Activity Vyvolána v případě, že aktivita již není pro uživatele viditelná. Vždy volejte implementaci supertřídy.

Důležité

Každý delegát má odpovídající identickou metodu rozšíření, kterou lze volat k registraci obslužné rutiny pro delegáta.

Pokud chcete reagovat na vyvolání delegáta životního cyklu Androidu, zavolejte ConfigureLifecycleEvents metodu na MauiAppBuilder objektu v CreateMauiapp metodě vaší MauiProgram třídy. Pak v ILifecycleBuilder objektu zavolejte metodu AddAndroid a zadejte Action , která registruje obslužné rutiny pro požadované delegáty:

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("OnActivityResult", requestCode.ToString()))
                        .OnStart((activity) => LogEvent("OnStart"))
                        .OnCreate((activity, bundle) => LogEvent("OnCreate"))
                        .OnBackPressed((activity) => LogEvent("OnBackPressed"))
                        .OnStop((activity) => LogEvent("OnStop")));
#endif
                    static void LogEvent(string eventName, string type = null)
                    {
                        System.Diagnostics.Debug.WriteLine($"Lifecycle event: {eventName}{(type == null ? string.Empty : $" ({type})")}");
                    }
                });

            return builder.Build();
        }
    }
}

Další informace o životním cyklu aplikace pro Android najdete v tématu Vysvětlení životního cyklu aktivity na developer.android.com.

iOS

Následující tabulka obsahuje seznam delegátů .NET MAUI, které jsou vyvolány v reakci na události životního cyklu iOS, které jsou vyvolány:

Delegát Argumenty Description
ContinueUserActivity UIKit.UIApplication, Foundation.NSUserActivity, UIKit.UIApplicationRestorationHandler Vyvoláno, když aplikace přijímá data přidružená k aktivitě uživatele, jako je přenos aktivity z jiného zařízení pomocí Handoffu.
DidEnterBackground UIKit.UIApplication Vyvoláno při zadání aplikace na pozadí.
FinishedLaunching UIKit.UIApplication, Foundation.NSDictionary Vyvolá se při spuštění aplikace.
OnActivated UIKit.UIApplication Vyvolá se při spuštění aplikace a pokaždé, když se aplikace vrátí do popředí.
OnResignActivation UIKit.UIApplication Vyvolá se, když se aplikace chystá zadat pozadí, pozastavit nebo když uživatel obdrží přerušení, jako je telefonní hovor nebo text.
OpenUrl UIKit.UIApplication, Foundation.NSDictionary Vyvoláno, když by aplikace měla otevřít zadanou adresu URL.
PerformActionForShortcutItem UIKit.UIApplication, UIKit.UIApplicationShortcutItem, UIKit.UIOperationHandler Vyvolá se při zahájení rychlé akce domovské obrazovky.
WillEnterForeground UIKit.UIApplication Vyvoláno, pokud se aplikace vrátí ze stavu na pozadí.
WillFinishLaunching UIKit.UIApplication, Foundation.NSDictionary Vyvoláno při spuštění aplikace, ale obnovení stavu ještě nebylo.
WillTerminate UIKit.UIApplication Vyvoláno, pokud je aplikace ukončena z důvodu omezení paměti nebo přímo uživatelem.

Důležité

Každý delegát má odpovídající identickou metodu rozšíření, kterou lze volat k registraci obslužné rutiny pro delegáta.

Pokud chcete reagovat na vyvolání delegáta životního cyklu iOS, zavolejte ConfigureLifecycleEvents metodu objektu MauiAppBuilderCreateMauiapp v metodě vaší MauiProgram třídy. Pak v ILifecycleBuilder objektu zavolejte metodu AddiOS a zadejte Action , která registruje obslužné rutiny pro požadované delegáty:

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("OnActivated"))
                        .OnResignActivation((app) => LogEvent("OnResignActivation"))
                        .DidEnterBackground((app) => LogEvent("DidEnterBackground"))
                        .WillTerminate((app) => LogEvent("WillTerminate")));
#endif
                    static void LogEvent(string eventName, string type = null)
                    {
                        System.Diagnostics.Debug.WriteLine($"Lifecycle event: {eventName}{(type == null ? string.Empty : $" ({type})")}");
                    }
                });

            return builder.Build();
        }
    }
}

Další informace o životním cyklu aplikace pro iOS najdete v tématu Správa životního cyklu aplikace na developer.apple.com.

Windows

Následující tabulka uvádí delegáty .NET MAUI, které jsou vyvolány v reakci na vyvolání událostí životního cyklu Windows:

Delegát Argumenty Description
OnActivated Microsoft.UI.Xaml.Window, Microsoft.UI.Xaml.WindowActivatedEventArgs Vyvolá se při vyvolání události platformy Activated , pokud se aplikace znovu neschová.
OnClosed Microsoft.UI.Xaml.Window, Microsoft.UI.Xaml.WindowEventArgs Vyvolá se při vyvolání události platformy Closed .
OnLaunched Microsoft.UI.Xaml.Window, Microsoft.UI.Xaml.LaunchActivatedEventArgs Vyvoláno přepsáním rozhraní .NET MAUI Application.OnLaunched po vytvoření a aktivaci nativního okna.
OnLaunching Microsoft.UI.Xaml.Window, Microsoft.UI.Xaml.LaunchActivatedEventArgs Vyvoláno přepsáním rozhraní .NET MAUI Application.OnLaunched před vytvořením a aktivací nativního okna.
OnPlatformMessage Microsoft.UI.Xaml.Window, WindowsPlatformMessageEventArgs Vyvolá se, když rozhraní .NET MAUI přijímá konkrétní nativní zprávy systému Windows.
OnPlatformWindowSubclassed Microsoft.UI.Xaml.Window, WindowsPlatformWindowSubclassedEventArgs Vyvolána rozhraním .NET MAUI při podtřídě okna Win32.
OnResumed Microsoft.UI.Xaml.Window Vyvolá se při vyvolání události platformy Activated , pokud aplikace obnovuje.
OnVisibilityChanged Microsoft.UI.Xaml.Window, Microsoft.UI.Xaml.WindowVisibilityChangedEventArgs Vyvolá se při vyvolání události platformy VisibilityChanged .
OnWindowCreated Microsoft.UI.Xaml.Window Vyvolá se při vytvoření nativního okna pro různé platformy Window.

Rozhraní .NET MAUI zveřejňuje konkrétní nativní zprávy systému Windows jako událost životního cyklu s delegátem OnPlatformMessage . Objekt WindowsPlatformMessageEventArgs , který doprovází tohoto delegáta MessageId , obsahuje vlastnost typu uint. Hodnotu této vlastnosti můžete prozkoumat a zjistit, která zpráva byla předána do okna aplikace. Další informace o windows zprávy naleznete v tématu Windows Messages (Začínáme s Win32 a C++). Seznam konstant zpráv okna najdete v tématu Oznámení okna.

Důležité

Každý delegát má odpovídající identickou metodu rozšíření, kterou lze volat k registraci obslužné rutiny pro delegáta.

Pokud chcete reagovat na vyvolání delegáta životního cyklu Windows, zavolejte ConfigureLifecycleEvents metodu objektu MauiAppBuilderCreateMauiApp v metodě vaší MauiProgram třídy. Pak v ILifecycleBuilder objektu zavolejte metodu AddWindows a zadejte Action , která registruje obslužné rutiny pro požadované delegáty:

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("OnActivated"))
                          .OnClosed((window, args) => LogEvent("OnClosed"))
                          .OnLaunched((window, args) => LogEvent("OnLaunched"))
                          .OnLaunching((window, args) => LogEvent("OnLaunching"))
                          .OnVisibilityChanged((window, args) => LogEvent("OnVisibilityChanged"))
                          .OnPlatformMessage((window, args) =>
                          {
                              if (args.MessageId == Convert.ToUInt32("0x02E0"))
                              {
                                  // DPI has changed
                              }
                          }));
#endif
                    static void LogEvent(string eventName, string type = null)
                    {
                        System.Diagnostics.Debug.WriteLine($"Lifecycle event: {eventName}{(type == null ? string.Empty : $" ({type})")}");
                    }
                });

            return builder.Build();
        }
    }
}

Načtení objektu Window

Kód platformy může načíst objekt aplikace Window z událostí životního cyklu platformy pomocí GetWindow metody rozšíření:

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();
        }
    }
}

Vlastní události životního cyklu

Zatímco rozhraní .NET MAUI definuje delegáty, které jsou vyvolány v reakci na události životního cyklu platformy, zveřejňuje pouze společnou sadu událostí životního cyklu platformy. Zahrnuje ale také mechanismus, který je obvykle určený autorům knihoven, který aplikacím umožňuje dostávat oznámení při vyvolání dalších událostí životního cyklu platformy. Postup, jak toho dosáhnout, je následující:

  • Zaregistrujte obslužnou rutinu události pro událost životního cyklu platformy, která není vystavena rozhraním .NET MAUI.
  • V obslužné rutině události životního cyklu platformy načtěte ILifecycleEventService instanci a volejte její InvokeEvents metodu a zadejte název události platformy jako argument.

Aplikace, které chtějí dostávat oznámení o události životního cyklu platformy, by pak měly změnit CreateMauiApp metodu ConfigureLifecycleEvents jejich MauiProgram třídy tak, aby volala metodu objektuMauiAppBuilder. ILifecycleBuilder Pak v objektu zavolejte metodu AddEvent a zadejte název události platformy a Action který se vyvolá při vyvolání události platformy.

Příklad

Událost WinUI 3 Window.SizeChanged nastane, když se okno nativní aplikace poprvé vykreslí nebo změní jeho velikost vykreslování. .NET MAUI nezpřístupňuje tuto událost platformy jako událost životního cyklu. Aplikace ale můžou dostávat oznámení při vyvolání této události platformy pomocí následujícího přístupu:

  • Registrace obslužné rutiny události pro Window.SizeChanged událost životního cyklu platformy:

    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();
    }    
    
  • V obslužné rutině události životního cyklu platformy načtěte ILifecycleEventService instanci a volejte její InvokeEvents metodu a jako argument zadejte název události platformy:

    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
    

    Typ MauiWinUIApplication ve Windows lze použít pro přístup k instanci nativní aplikace prostřednictvím jeho Current vlastnosti. Typ MauiApplication v Androidu lze použít pro přístup k instanci nativní aplikace. Podobně lze typ v iOSu MauiUIApplicationDelegate použít pro přístup k instanci nativní aplikace.

    Upozornění

    Vyvolání neregistrované události s metodou InvokeEvents vyvolá výjimku.

  • CreateMauiApp V metodě vaší MauiProgram třídy volejte metodu ConfigureLifecycleEvents objektuMauiAppBuilder. Pak v ILifecycleBuilder objektu volejte metodu AddEvent a zadejte název události platformy a Action vyvolá se při vyvolání události platformy:

    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 void LogEvent(string eventName, string type = null)
                        {
                            System.Diagnostics.Debug.WriteLine($"Lifecycle event: {eventName}{(type == null ? string.Empty : $" ({type})")}");
                        }
                    });
    
                return builder.Build();
            }
        }
    }
    

Celkovým účinkem je, že když uživatel změní velikost okna aplikace ve Windows, provede se akce zadaná v AddEvent metodě.

Poznámka

Metoda AddEvent má také přetížení, které umožňuje zadat delegáta.