Ciclo de vida da aplicação para aplicações desktop do SDK de Aplicações Windows

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.Closed para 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