Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Este artigo descreve o ciclo de vida de uma aplicação de ambiente de trabalho do SDK de Aplicações Windows desde o lançamento até à terminação. Compreender o ciclo de vida ajuda-o a gerir o estado, poupar recursos e proporcionar uma experiência de utilizador fluida.
Importante
Ao contrário das aplicações UWP, as aplicações de ambiente de trabalho (incluindo o WinUI 3) não estão sujeitas ao modelo de gestão do ciclo de vida do processo UWP (PLM) de suspensão e terminação automática quando em segundo plano. Continuam a funcionar até o utilizador as fechar ou o processo terminar. No entanto, uma aplicação de ambiente de trabalho empacotada ainda está sujeita a políticas de energia e recursos a nível do sistema — por exemplo, o Modern Standby pode suspender todos os processos em modo utilizador (incluindo a sua aplicação) quando o dispositivo entra em suspensão, e o Windows pode aplicar o Modo de Eficiência (EcoQoS) para reduzir a prioridade da CPU e a qualidade de serviço para aplicações em segundo plano ou minimizadas. A sua aplicação deve continuar a lidar com desligamentos inesperados de forma natural (por exemplo, falhas de energia, atualizações do sistema operativo ou o utilizador terminar o processo através do Gestor de Tarefas) e não deve assumir que tem sempre acesso ao CPU a toda a velocidade enquanto está em segundo plano.
Visão geral do ciclo de vida
Uma aplicação de desktop do SDK de Aplicações Windows tem um ciclo de vida mais simples do que o UWP:
| Estado | Description |
|---|---|
| Não está em execução | O processo da aplicação não foi iniciado. |
| Em curso | A aplicação está ativa. Pode ou não ter uma janela visível. |
| Fechado | O utilizador (ou sistema) terminou o processo. |
Como não existe um estado de suspensão, não é necessário gerir os eventos Suspending ou Resuming da mesma forma que as aplicações UWP. Em vez disso, concentre-se em:
- Guardar o estado do utilizador quando a janela fecha ou a aplicação desliga.
- Gerir ativação (lançamento, ficheiro, protocolo ou outros tipos de ativação).
- Gerir o trabalho em segundo plano de forma eficiente para poupar bateria em dispositivos portáteis.
Lançamento da aplicação
Quando um utilizador inicia a sua aplicação, o método Microsoft.UI.Xaml.Application.OnLaunched é executado. Usa-o para inicializar a tua janela principal e navegar até à tua primeira página.
public partial class App : Microsoft.UI.Xaml.Application
{
private Microsoft.UI.Xaml.Window? m_window;
protected override void OnLaunched(Microsoft.UI.Xaml.LaunchActivatedEventArgs args)
{
m_window = new MainWindow();
m_window.Activate();
}
}
// MainWindow is the window class generated by the WinUI 3 project
// template (MainWindow.xaml / MainWindow.xaml.cs).
public partial class MainWindow : Microsoft.UI.Xaml.Window
{
}
Note
As aplicações desktop do SDK de Aplicações Windows não recebem valor PreviousExecutionState do sistema. Se precisares de restaurar o estado após uma falha ou terminação inesperada, implementa o teu próprio mecanismo de persistência de estado (por exemplo, guardar o estado num ficheiro local num temporizador ou quando ações importantes são concluídas).
Ativação da aplicação
O SDK de Aplicações Windows fornece suporte abrangente à ativação através do espaço de nomes Microsoft.Windows.AppLifecycle. A sua aplicação pode ser ativada por:
- Lançamento padrão — O utilizador seleciona o ícone da sua aplicação.
- Ativação de ficheiro — O utilizador abre um tipo de ficheiro associado à sua aplicação.
- Ativação do protocolo — Um esquema de URI registado na sua aplicação é invocado.
- Ativação de arranque — A sua aplicação regista-se para iniciar no login do utilizador.
- Outros — Notificação de brinde, alvo de partilha e outros tipos de ativação.
Use AppInstance.GetActivatedEventArgs para determinar o tipo de ativação:
using Microsoft.Windows.AppLifecycle;
var activatedArgs = AppInstance.GetCurrent().GetActivatedEventArgs();
switch (activatedArgs.Kind)
{
case ExtendedActivationKind.File:
var fileArgs = activatedArgs.Data as
Windows.ApplicationModel.Activation.IFileActivatedEventArgs;
// Handle the file
break;
case ExtendedActivationKind.Protocol:
var protocolArgs = activatedArgs.Data as
Windows.ApplicationModel.Activation.IProtocolActivatedEventArgs;
// Handle the URI
break;
case ExtendedActivationKind.Launch:
default:
// Standard launch
break;
}
As aplicações empacotadas registam-se para ativação de ficheiros e protocolos através de Package.appxmanifest. As aplicações não embaladas não têm manifesto, por isso registam os mesmos tipos de ativação no código usando Microsoft.Windows.AppLifecycle.ActivationRegistrationManager. Para uma análise detalhada de ambas as abordagens, veja Ativação de aplicações para SDK de Aplicações Windows.
Em execução em segundo plano e em primeiro plano
As aplicações de ambiente de trabalho continuam a funcionar, estejam ou não em primeiro plano. O sistema não para os seus threads nem recupera a memória quando o utilizador muda para outra aplicação. No entanto, ainda pode responder a alterações de visibilidade para otimizar o uso de recursos:
- Liberte recursos caros de GPU ou renderização quando a sua janela estiver minimizada.
- Pausar as animações ou a pré-visualização de multimédia quando a janela deixar de estar em foco.
- Reduza a frequência do temporizador para as sondagens de antecedentes.
Microsoft.UI.Xaml.Window não expõe um evento VisibilityChanged. Em vez disso, use o evento Window.Activated para detetar quando a janela recebe ou perde o foco, ou use AppWindow.Changed para detetar alterações no estado da apresentação (como minimizada ou restaurada):
// m_window is the field declared on your App type (see "App launch" above).
Microsoft.UI.Xaml.Window m_window = this;
m_window.Activated += (sender, args) =>
{
if (args.WindowActivationState == WindowActivationState.Deactivated)
{
// Window lost focus — consider reducing work,
// for example pausing animations or media preview
}
else
{
// Window is active — resume normal work
}
};
// To specifically detect minimize/restore, use AppWindow.Changed
var appWindow = m_window.AppWindow;
appWindow.Changed += (sender, args) =>
{
if (args.DidPresenterChange)
{
if (sender.Presenter is OverlappedPresenter presenter &&
presenter.State == OverlappedPresenterState.Minimized)
{
// Window is minimized — pause expensive rendering
}
else
{
// Window is restored — resume rendering
}
}
};
Tip
Em dispositivos alimentados por bateria, reduzir o trabalho em segundo plano quando a sua aplicação não está visível melhora a duração da bateria e a resposta do sistema, mesmo que o sistema não aplique suspensão.
Estado de salvação
Como as aplicações de ambiente de trabalho não estão suspensas, tu controlas quando guardar o estado. Abordagens recomendadas:
-
Ao fechar a janela — Trate o evento
Window.Closedpara guardar os dados. - Gravação periódica — Use um temporizador para guardar o estado em intervalos (por exemplo, a cada 60 segundos).
- Sobre ações importantes — Guardar depois de o utilizador completar uma ação significativa (por exemplo, terminar uma edição).
// m_window is the field declared on your App type (see "App launch" above).
Microsoft.UI.Xaml.Window m_window = this;
m_window.Closed += (sender, args) =>
{
SaveApplicationState();
};
// Replace with your own logic to persist app state.
void SaveApplicationState() { }
Encerramento e terminação da aplicação
Uma aplicação de ambiente de trabalho termina quando:
- O utilizador fecha a última janela.
- O teu código chama
Application.Current.Exit(). - O processo termina externamente (Gestor de Tarefas, desligamento do sistema).
Não há um estado de "encerrado pelo sistema para libertar recursos" como no UWP. A tua aplicação executa-se até encerrar explicitamente.
Note
Se a sua aplicação crashar, ela reinicia do zero. Implemente uma gravação periódica de estado para minimizar a perda de dados.
Diferenças em relação ao ciclo de vida da aplicação UWP
| Comportamento | UWP | SDK de Aplicações Windows (Desktop) |
|---|---|---|
| Suspensão automática (PLM) | Sim — após alguns segundos em segundo plano | Não — mas o dispositivo inteiro ainda pode entrar em Modo Moderno de Espera |
| Encerramento do sistema para libertar memória | Sim — as aplicações suspensas podem ser terminadas | No |
Suspending
/
Resuming Eventos |
Yes | Não aplicável |
| Pré-lançamento | Sim (opt-in) | No |
| Estado de contexto aplicado | Yes | Não — mas o Modo de Eficiência (EcoQoS) pode limitar as aplicações em segundo plano |
| Restauração do Estado após a extinção | Obrigatório para uma boa experiência de utilizador | Opcional — implemente o seu próprio |
Conteúdo relacionado
Windows developer