Ciclo de vida do aplicativo
Os aplicativos .NET MAUI (.NET Multi-platform App UI) geralmente têm quatro estados de execução: não executando, em execução, desativado e interrompido. O .NET MAUI gera eventos de ciclo de vida multiplataforma na classe Window
quando um aplicativo faz a transição do estado não executando para o estado em execução, do estado em execução para o estado desativado, do estado desativado para o estado interrompido, do estado interrompido para o estado em execução e do estado interrompido para o estado não executando.
O seguinte diagrama mostra uma visão geral do ciclo de vida do aplicativo .NET MAUI:
No diagrama, o oval cinza indica que o aplicativo não é carregado na memória. As ovais azul-claros indicam que o aplicativo está na memória. O texto em arcos indica eventos gerados pelo .NET MAUI, que fornecem notificações para o aplicativo em execução.
O estado de execução de um aplicativo depende do histórico do aplicativo. Por exemplo, quando um aplicativo é instalado pela primeira vez ou um dispositivo é iniciado, o aplicativo pode ser considerado como não executando. Quando o aplicativo é iniciado, os eventos Created
e Activated
são gerados e o aplicativo está em execução. Se uma janela do aplicativo diferente ganhar foco, o evento Deactivated
será acionado e o aplicativo será desativado. Se o usuário alternar para um aplicativo diferente ou retornar para a tela Inicial do dispositivo, para que a janela do aplicativo não fique mais visível, os eventos Deactivated
e Stopped
serão gerados e o aplicativo será interrompido. Se o usuário retornar para o aplicativo, o evento Resuming
será gerado e o aplicativo estará em execução. Como alternativa, um aplicativo pode ser encerrado por um usuário durante a execução. Nessa situação, o aplicativo é desativado e depois interrompido; o evento Destroying
é gerado e o aplicativo está no estado não executando. Da mesma forma, um dispositivo pode encerrar um aplicativo enquanto ele está parado, devido a restrições de recursos, e o evento Destroying
é gerado e o aplicativo está no estado não executando.
Além disso, o .NET MAUI permite que os aplicativos sejam notificados quando os eventos do ciclo de vida da plataforma forem gerados. Para obter mais informações, confira Eventos de ciclo de vida da plataforma.
Eventos de ciclo de vida multiplataforma
A classe Window
define os seguintes eventos de ciclo de vida multiplataforma:
Evento | Descrição | Ação a ser tomada |
---|---|---|
Created |
Esse evento é gerado após a criação da janela nativa. Neste ponto, a janela multiplataforma terá um manipulador de janela nativo, mas a janela talvez não esteja visível ainda. | |
Activated |
Esse evento é gerado quando a janela é ativada e é, ou se tornará, a janela focada. | |
Deactivated |
Esse evento é gerado quando a janela não é mais a janela focada. No entanto, a janela ainda pode estar visível. | |
Stopped |
Esse evento é gerado quando a janela não está mais visível. Não há nenhuma garantia de que um aplicativo será retomado desse estado, pois ele pode ser encerrado pelo sistema operacional. | Desconecte-se de processos de execução prolongada ou cancele as solicitações pendentes que possam consumir recursos do dispositivo. |
Resumed |
Esse evento é gerado quando um aplicativo é retomado após ser interrompido. Esse evento não será gerado na primeira vez que seu aplicativo for iniciado e só poderá ser gerado se o evento Stopped tiver sido gerado anteriormente. |
Assine todos os eventos necessários e atualize qualquer conteúdo que esteja na página visível. |
Destroying |
Esse evento é gerado quando a janela nativa está sendo destruída e desalocada. A mesma janela multiplataforma pode ser usada em uma nova janela nativa quando o aplicativo é reaberto. | Remova todas as assinaturas de evento anexadas à janela nativa. |
Esses eventos multiplataforma são mapeados para diferentes eventos de plataforma, e a seguinte tabela mostra esse mapeamento:
Evento | Android | iOS | Windows |
---|---|---|---|
Created |
OnPostCreate |
FinishedLaunching |
Created |
Activated |
OnResume |
OnActivated |
Activated (CodeActivated e PointerActivated ) |
Deactivated |
OnPause |
OnResignActivation |
Activated (Deactivated ) |
Stopped |
OnStop |
DidEnterBackground |
VisibilityChanged |
Resumed |
OnRestart |
WillEnterForeground |
Resumed |
Destroying |
OnDestroy |
WillTerminate |
Closed |
Além disso, a classe Window
também define um evento Backgrounding
gerado no iOS e no Mac Catalyst quando a janela é fechada ou entra em um estado em segundo plano. Um objeto BackgroundingEventArgs
acompanha esse evento e qualquer estado string
deve ser mantido na propriedade State
do objeto BackgroundingEventArgs
, que o sistema operacional preservará até que seja hora de retomar a janela. Quando a janela é retomada, o estado é fornecido pelo argumento IActivationState
para a substituição de CreateWindow
.
Além desses eventos, a classe Window
também tem os seguintes métodos de ciclo de vida substituíveis:
OnCreated
, que é invocado quando o eventoCreated
é gerado.OnActivated
, que é invocado quando o eventoActivated
é gerado.OnDeactivated
, que é invocado quando o eventoDeactivated
é gerado.OnStopped
, que é invocado quando o eventoStopped
é gerado.OnResumed
, que é invocado quando o eventoResumed
é gerado.OnDestroying
, que é invocado quando o eventoDestroying
é gerado.OnBackgrounding
, que é invocado quando o eventoBackgrounding
é gerado.
Para assinar os eventos de ciclo de vida Window
, substitua o método CreateWindow
na classe App
para criar uma instância Window
na qual você pode assinar eventos:
namespace MyMauiApp
{
public partial class App : Application
{
public App()
{
InitializeComponent();
MainPage = new MainPage();
}
protected override Window CreateWindow(IActivationState? activationState)
{
Window window = new Window(new AppShell());
window.Created += (s, e) =>
{
// Custom logic
};
return window;
}
}
}
namespace MyMauiApp
{
public partial class App : Application
{
public App()
{
InitializeComponent();
}
protected override Window CreateWindow(IActivationState activationState)
{
Window window = base.CreateWindow(activationState);
window.Created += (s, e) =>
{
// Custom logic
};
return window;
}
}
}
Como alternativa, para consumir as substituições do ciclo de vida, crie uma classe que derive da classe Window
namespace MyMauiApp
{
public class MyWindow : Window
{
public MyWindow() : base()
{
}
public MyWindow(Page page) : base(page)
{
}
protected override void OnCreated()
{
// Register services
}
}
}
A classe derivada de Window
pode ser consumida substituindo o método CreateWindow
na classe App
para retornar uma instância MyWindow
.
Aviso
Um InvalidOperationException
será gerado se a propriedade App.MainPage
for definida e o método CreateWindow
criar um objeto Window
usando a substituição que aceita um argumento Page.
Eventos de ciclo de vida da plataforma
O .NET MAUI define delegados invocados em resposta aos eventos de ciclo de vida da plataforma que estão sendo gerados. Os manipuladores podem ser especificados para esses delegados, usando métodos nomeados ou funções anônimas, que são executados quando o delegado é invocado. Esse mecanismo permite que os aplicativos sejam notificados quando eventos comuns de ciclo de vida da plataforma são gerados.
Importante
O método ConfigureLifecycleEvents
está no namespace Microsoft.Maui.LifecycleEvents
.
Android
A seguinte tabela lista os delegados do .NET MAUI invocados em resposta aos eventos de ciclo de vida do Android que estão sendo gerados:
Delegar | Argumentos | Descrição | Comentários |
---|---|---|---|
OnActivityResult |
Android.App.Activity , int , Android.App.Result , Android.Content.Intent? |
Invocado quando uma atividade que você iniciou é encerrada. | |
OnApplicationConfigurationChanged |
Android.App.Application , Android.Content.Res.Configuration |
Invocado quando a configuração do dispositivo é alterada enquanto o componente está em execução. | |
OnApplicationCreate |
Android.App.Application |
Invocado quando o aplicativo é iniciado, antes de uma atividade, um serviço ou objetos receptores (exceto provedores de conteúdo) terem sido criados. | |
OnApplicationCreating |
Android.App.Application |
Invocado quando o aplicativo está iniciando, antes de uma atividade, um serviço ou objetos receptores (exceto provedores de conteúdo) terem sido criados. | |
OnApplicationLowMemory |
Android.App.Application |
Invocado quando o sistema está executando com pouca memória e os processos em execução ativa devem reduzir o uso de memória. | |
OnApplicationTrimMemory |
Android.App.Application , Android.Content.TrimMemory |
Invocado quando o sistema operacional determina que é um bom momento para um processo reduzir a memória desnecessária de seu processo. | |
OnBackPressed |
Android.App.Activity |
Invocado quando a atividade detectou um pressionamento da tecla voltar. | |
OnConfigurationChanged |
Android.App.Activity , Android.Content.Res.Configuration |
Invocado quando a configuração do dispositivo é alterada enquanto a atividade está em execução. | |
OnCreate |
Android.App.Activity , Android.OS.Bundle? |
Gerado quando a atividade é criada. | |
OnDestroy |
Android.App.Activity |
Invocado quando a atividade está terminando ou porque o sistema está destruindo temporariamente a instância de atividade para economizar espaço. | Sempre chame a implementação da superclasse. |
OnNewIntent |
Android.App.Activity , Android.Content.Intent? |
Invocado quando a atividade é reiniciada enquanto está na parte superior da pilha de atividades em vez de uma nova instância da atividade ser iniciada. | |
OnPause |
Android.App.Activity |
Invocado quando uma atividade está entrando em segundo plano, mas ainda não foi encerrada. | Sempre chame a implementação da superclasse. |
OnPostCreate |
Android.App.Activity , Android.OS.Bundle? |
Invocado quando a inicialização da atividade é concluída, depois que OnStart e OnRestoreInstanceState foram chamados. |
Sempre chame a implementação da superclasse. Esse é um evento somente do sistema que geralmente não deve ser usado por aplicativos. |
OnPostResume |
Android.App.Activity |
Invocado quando a retomada da atividade é concluída, depois que OnResume foi chamado. |
Sempre chame a implementação da superclasse. Esse é um evento somente do sistema que geralmente não deve ser usado por aplicativos. |
OnRequestPermissionsResult |
Android.App.Activity , int , string[] , Android.Content.PM.Permission[] |
Invocado como um retorno de chamada para o resultado da solicitação de permissões. | |
OnRestart |
Android.App.Activity |
Invocado após OnStop quando a atividade atual está sendo exibida novamente para o usuário (o usuário navegou de volta para ela). |
Sempre chame a implementação da superclasse. |
OnRestoreInstanceState |
Android.App.Activity , Android.OS.Bundle |
Invocado após OnStart quando a atividade está sendo reinicializada de um estado salvo anteriormente. |
|
OnResume |
Android.App.Activity |
Invocado após OnRestoreInstanceState , OnRestart ou OnPause , para indicar que a atividade está ativa e pronta para receber entrada. |
|
OnSaveInstanceState |
Android.App.Activity , Android.OS.Bundle |
Invocado para recuperar o estado por instância de uma atividade que está sendo encerrada para que o estado possa ser restaurado em OnCreate ou OnRestoreInstanceState . |
|
OnStart |
Android.App.Activity |
Invocado após OnCreate ou OnRestart quando a atividade foi interrompida, mas agora está sendo exibida para o usuário. |
Sempre chame a implementação da superclasse. |
OnStop |
Android.App.Activity |
Invocado quando a atividade não está mais visível para o usuário. | Sempre chame a implementação da superclasse. |
Importante
Cada delegado tem um método de extensão correspondente com nome idêntico, que pode ser chamado para registrar um manipulador para o delegado.
Para responder a um delegado de ciclo de vida do Android que está sendo chamado, chame o método ConfigureLifecycleEvents
no objeto MauiAppBuilder
no método CreateMauiapp
de sua classe MauiProgram
. Em seguida, no objeto ILifecycleBuilder
, chame o método AddAndroid
e especifique o Action
que registra manipuladores para os delegados necessários:
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();
}
}
}
Para obter mais informações sobre o ciclo de vida do aplicativo Android, consulte Noções básicas sobre o ciclo de vida da atividade no developer.android.com.
Catalisador para iOS e Mac
A tabela a seguir lista os delegados do .NET MAUI invocados em resposta aos eventos de ciclo de vida do iOS e do Mac Catalyst que estão sendo gerados:
Delegar | Argumentos | Descrição |
---|---|---|
ApplicationSignificantTimeChange |
UIKit.UIApplication |
Invocado quando ocorre uma alteração significativa de horário, como meia-noite, hora alterada pela operadora ou início ou parada do horário de verão. |
ContinueUserActivity |
UIKit.UIApplication , Foundation.NSUserActivity , UIKit.UIApplicationRestorationHandler |
Invocado quando o aplicativo recebe dados associados a uma atividade do usuário, como transferir uma atividade de um dispositivo diferente usando a Entrega. |
DidEnterBackground |
UIKit.UIApplication |
Invocado quando o aplicativo entrou em segundo plano. |
FinishedLaunching |
UIKit.UIApplication , Foundation.NSDictionary |
Invocado quando o aplicativo é iniciado. |
OnActivated |
UIKit.UIApplication |
Invocado quando o aplicativo é iniciado e sempre que o aplicativo retorna para o primeiro plano. |
OnResignActivation |
UIKit.UIApplication |
Invocado quando o aplicativo está prestes a entrar em segundo plano, ser suspenso ou quando o usuário recebe uma interrupção, como uma chamada telefônica ou um texto. |
OpenUrl |
UIKit.UIApplication , Foundation.NSDictionary |
Invocado quando o aplicativo deve abrir uma URL especificada. |
PerformActionForShortcutItem |
UIKit.UIApplication , UIKit.UIApplicationShortcutItem , UIKit.UIOperationHandler |
Invocado quando uma ação rápida da tela inicial é iniciada. |
PerformFetch |
UIKit.UIApplication , Action<UIBackgroundFetchResult> |
Invocado para informar ao aplicativo que ele poderá iniciar uma operação de busca se ele tiver dados a serem baixados. |
SceneContinueUserActivity |
UIKit.UIScene , Foundation.NSUserActivity |
Invocado para lidar com a atividade relacionada à Entrega especificada. |
SceneDidDisconnect |
UIKit.UIScene |
Invocado quando uma cena é removida do aplicativo. |
SceneDidEnterBackground |
UIKit.UIScene |
Invocado quando uma cena está em execução em segundo plano e não está na tela. |
SceneDidFailToContinueUserActivity |
UIKit.UIScene , string , Foundation.NSError |
Invocado para informar ao usuário que não foi possível concluir a atividade. |
SceneDidUpdateUserActivity |
UIKit.UIScene , Foundation.NSUserActivity |
Invocado quando a atividade especificada é atualizada. |
SceneOnActivated |
UIKit.UIScene |
Invocado quando a cena se torna ativa e capaz de responder a eventos do usuário. |
SceneOnResignActivation |
UIKit.UIScene |
Invocado quando a cena está prestes a sair do estado ativo e parar de responder aos eventos do usuário. |
SceneOpenUrl |
UIKit.UIScene , Foundation.NSSet<UIKit.UIOpenUrlContext> |
Invocado quando uma cena solicita a abertura de uma ou mais URLs. |
SceneRestoreInteractionState |
UIKit.UIScene , Foundation.NSUserActivity |
Invocado para restaurar o estado da atividade. |
SceneWillConnect |
UIKit.UIScene , UIKit.UISceneSession , UIKit.UISceneConnectionOptions |
Invocado quando uma cena é adicionada ao aplicativo. |
SceneWillContinueUserActivity |
UIKit.UIScene , string |
Invocado para se preparar para receber dados relacionados à Entrega. |
SceneWillEnterForeground |
UIKit.UIScene |
Invocado quando uma cena está prestes a ser executada em primeiro plano e fica visível para o usuário. |
WillEnterForeground |
UIKit.UIApplication |
Invocado se o aplicativo retornar de um estado em segundo plano. |
WillFinishLaunching |
UIKit.UIApplication , Foundation.NSDictionary |
Invocado quando a inicialização do aplicativo foi iniciada, mas a restauração do estado ainda não ocorreu. |
WillTerminate |
UIKit.UIApplication |
Invocado se o aplicativo está sendo encerrado devido a restrições de memória ou diretamente pelo usuário. |
WindowSceneDidUpdateCoordinateSpace |
UIKit.UIWindowScene , UIKit.IUICoordinateSpace , UIKit.UIInterfaceOrientation , UIKit.UITraitCollection |
Invocado quando o tamanho, a orientação ou as características de uma cena mudam. |
Importante
Cada delegado, com exceção de PerformFetch
, tem um método de extensão correspondente com nome idêntico, que pode ser chamado para registrar um manipulador para o delegado.
Para responder a um delegado de ciclo de vida do iOS e do Mac Catalyst que está sendo invocado, chame o método ConfigureLifecycleEvents
no objeto MauiAppBuilder
no método CreateMauiapp
da sua classe MauiProgram
. Em seguida, no objeto ILifecycleBuilder
, chame o método AddiOS
e especifique o Action
que registra manipuladores para os delegados necessários:
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 || MACCATALYST
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();
}
}
}
Para obter mais informações sobre o ciclo de vida do aplicativo iOS, consulte Gerenciar o ciclo de vida do seu aplicativo em developer.apple.com.
Windows
A seguinte tabela lista os delegados do .NET MAUI invocados em resposta aos eventos de ciclo de vida do Windows que estão sendo gerados:
Delegar | Argumentos | Descrição |
---|---|---|
OnActivated |
Microsoft.UI.Xaml.Window , Microsoft.UI.Xaml.WindowActivatedEventArgs |
Invocado quando o evento Activated da plataforma é gerado, caso o aplicativo não seja retomado. |
OnClosed |
Microsoft.UI.Xaml.Window , Microsoft.UI.Xaml.WindowEventArgs |
Invocado quando o evento Closed da plataforma é gerado. |
OnLaunched |
Microsoft.UI.Xaml.Window , Microsoft.UI.Xaml.LaunchActivatedEventArgs |
Invocado pela substituição de Application.OnLaunched do .NET MAUI depois que a janela nativa foi criada e ativada. |
OnLaunching |
Microsoft.UI.Xaml.Window , Microsoft.UI.Xaml.LaunchActivatedEventArgs |
Invocado pela substituição de Application.OnLaunched do .NET MAUI antes que a janela nativa tenha sido criada e ativada. |
OnPlatformMessage |
Microsoft.UI.Xaml.Window , WindowsPlatformMessageEventArgs |
Invocado quando o .NET MAUI recebe mensagens nativas específicas do Windows. |
OnPlatformWindowSubclassed |
Microsoft.UI.Xaml.Window , WindowsPlatformWindowSubclassedEventArgs |
Invocado pelo .NET MAUI quando a janela Win32 é uma subclasse. |
OnResumed |
Microsoft.UI.Xaml.Window |
Invocado quando o evento Activated da plataforma é gerado, caso o aplicativo seja retomado. |
OnVisibilityChanged |
Microsoft.UI.Xaml.Window , Microsoft.UI.Xaml.WindowVisibilityChangedEventArgs |
Invocado quando o evento VisibilityChanged da plataforma é gerado. |
OnWindowCreated |
Microsoft.UI.Xaml.Window |
Invocado quando a janela nativa é criada para o Window multiplataforma. |
O .NET MAUI expõe mensagens nativas específicas do Windows como um evento de ciclo de vida com o delegado OnPlatformMessage
. O objeto WindowsPlatformMessageEventArgs
que acompanha esse delegado inclui uma propriedade MessageId
, do tipo uint
. O valor dessa propriedade pode ser examinado para determinar qual mensagem foi passada para a janela do aplicativo. Para obter mais informações sobre mensagens do Windows, consulte Mensagens do Windows (Introdução ao Win32 e C++). Para obter uma lista de constantes de mensagens de janelas, consulte Notificações de janelas.
Importante
Cada delegado tem um método de extensão correspondente com nome idêntico, que pode ser chamado para registrar um manipulador para o delegado.
Para responder a um delegado de ciclo de vida do Windows que está sendo chamado, chame o método ConfigureLifecycleEvents
no objeto MauiAppBuilder
no método CreateMauiApp
da sua classe MauiProgram
. Em seguida, no objeto ILifecycleBuilder
, chame o método AddWindows
e especifique o Action
que registra manipuladores para os delegados necessários:
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();
}
}
}
Recuperar o objeto de janela
O código da plataforma pode recuperar o objeto Window
do aplicativo de eventos de ciclo de vida da plataforma, com o método de extensão GetWindow
:
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();
}
}
}
Eventos de ciclo de vida personalizados
Embora o .NET MAUI defina delegados que são invocados em resposta aos eventos de ciclo de vida da plataforma que estão sendo gerados, ele expõe apenas um conjunto comum de eventos de ciclo de vida da plataforma. No entanto, ele também inclui um mecanismo, normalmente para autores de biblioteca, que permite que os aplicativos sejam notificados quando eventos adicionais de ciclo de vida da plataforma são gerados. O processo para realizar isso é o seguinte:
- Registre um manipulador de eventos para um evento de ciclo de vida da plataforma que não seja exposto pelo .NET MAUI.
- No manipulador de eventos para o evento de ciclo de vida da plataforma, recupere a instância
ILifecycleEventService
e chame seu métodoInvokeEvents
, especificando o nome do evento da plataforma como seu argumento.
Em seguida, os aplicativos que desejam receber a notificação do evento de ciclo de vida da plataforma devem modificar o método CreateMauiApp
de sua classe MauiProgram
para chamar o método ConfigureLifecycleEvents
no objeto MauiAppBuilder
. Em seguida, no objeto ILifecycleBuilder
, chame o método AddEvent
e especifique o nome do evento da plataforma e o Action
que será invocado quando o evento da plataforma for gerado.
Exemplo
O evento Window.SizeChanged do WinUI 3 ocorre quando a janela do aplicativo nativo foi renderizada pela primeira vez ou alterou seu tamanho de renderização. O .NET MAUI não expõe esse evento de plataforma como um evento de ciclo de vida. No entanto, os aplicativos podem receber notificação quando esse evento de plataforma é gerado usando a seguinte abordagem:
Registre um manipulador de eventos para o evento de ciclo de vida da plataforma 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(); }
No manipulador de eventos para o evento de ciclo de vida da plataforma, recupere a instância
ILifecycleEventService
e chame seu métodoInvokeEvents
, especificando o nome do evento da plataforma como seu argumento: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
O tipo
MauiWinUIApplication
no Windows pode ser usado para acessar a instância de aplicativo nativo por meio de sua propriedadeCurrent
. O tipoMauiApplication
no Android pode ser usado para acessar a instância de aplicativo nativo. Da mesma forma, o tipoMauiUIApplicationDelegate
no iOS pode ser usado para acessar a instância de aplicativo nativo.Aviso
Invocar um evento não registrado, com o método
InvokeEvents
, não gera uma exceção.No método
CreateMauiApp
da classeMauiProgram
, chame o métodoConfigureLifecycleEvents
no objetoMauiAppBuilder
. Em seguida, no objetoILifecycleBuilder
, chame o métodoAddEvent
e especifique o nome do evento da plataforma e oAction
que será invocado quando o evento da plataforma for gerado: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(); } } }
O efeito geral é o seguinte: quando um usuário altera o tamanho da janela do aplicativo no Windows, a ação especificada no método AddEvent
é executada.
Observação
O método AddEvent
também tem uma sobrecarga que permite que um delegado seja especificado.