Ž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:
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řiCreatedvyvolání události.OnActivated, která se vyvolá přiActivatedvyvolání události.OnDeactivated, která se vyvolá přiDeactivatedvyvolání události.OnStopped, která se vyvolá přiStoppedvyvolání události.OnResumed, která se vyvolá přiResumedvyvolání události.OnDestroying, která se vyvolá přiDestroyingvyvolá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
ILifecycleEventServiceinstanci a volejte jejíInvokeEventsmetodu 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
ILifecycleEventServiceinstanci a volejte jejíInvokeEventsmetodu 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)); } #endifTyp
MauiWinUIApplicationve Windows lze použít pro přístup k instanci nativní aplikace prostřednictvím jehoCurrentvlastnosti. TypMauiApplicationv Androidu lze použít pro přístup k instanci nativní aplikace. Podobně lze typ v iOSuMauiUIApplicationDelegatepoužít pro přístup k instanci nativní aplikace.Upozornění
Vyvolání neregistrované události s metodou
InvokeEventsvyvolá výjimku.CreateMauiAppV metodě vašíMauiProgramtřídy volejte metoduConfigureLifecycleEventsobjektuMauiAppBuilder. Pak vILifecycleBuilderobjektu volejte metoduAddEventa zadejte název události platformy aActionvyvolá 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.