Ciclo de vida do aplicativo para aplicativos de desktop do SDK do Aplicativo Windows

Este artigo descreve o ciclo de vida de um aplicativo da área de trabalho SDK do Aplicativo Windows desde a inicialização até a terminação. Entender o ciclo de vida ajuda você a gerenciar o estado, conservar recursos e proporcionar uma experiência tranquila do usuário.

Importante

Ao contrário dos aplicativos UWP, os aplicativos da área de trabalho (incluindo o WinUI 3) não estão sujeitos ao modelo de PLM (gerenciamento de ciclo de vida do processo) da UWP de suspensão automática e terminação quando em segundo plano. Eles continuam em execução até que o usuário os feche ou o processo seja encerrado. No entanto, um aplicativo de área de trabalho empacotado ainda está sujeito a políticas de recursos e energia em todo o sistema , por exemplo, o Modo de Espera Moderno pode suspender todos os processos do modo de usuário (incluindo seu aplicativo) quando o dispositivo estiver inativo, e Windows pode aplicar o Modo de Eficiência (EcoQoS) para limitar a prioridade da CPU e a qualidade do serviço para aplicativos em segundo plano ou minimizados. Seu aplicativo ainda deve lidar com desligamentos inesperados normalmente (por exemplo, perda de energia, atualizações do sistema operacional ou o usuário que encerra o processo por meio do Gerenciador de Tarefas) e não deve assumir que ele sempre tem acesso à CPU de velocidade total enquanto estiver em segundo plano.

Visão geral do ciclo de vida

Um aplicativo da área de trabalho SDK do Aplicativo Windows tem um ciclo de vida mais simples do que o UWP:

State Description
Não está em execução O processo do aplicativo não foi iniciado.
Em execução O aplicativo está ativo. Pode ou não ter uma janela visível.
Closed O usuário (ou sistema) encerrou o processo.

Como não há estado de suspensão, você não precisa tratar os eventos Suspending ou Resuming da forma como os aplicativos UWP fazem. Em vez disso, concentre-se em:

  • Salvando o estado do usuário quando a janela fecha ou o aplicativo é desligado.
  • Lidando com a ativação (início, arquivo, protocolo ou outros tipos de ativação).
  • Gerenciar o trabalho em segundo plano com eficiência para conservar a bateria em dispositivos portáteis.

Iniciação de aplicações

Quando o usuário inicia o aplicativo, o método Microsoft.UI.Xaml.Application.OnLaunched é executado. Use-a para inicializar a janela principal e navegue até sua 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

Aplicativos da área de trabalho do SDK do Aplicativo Windows não recebem do sistema um valor PreviousExecutionState. Se você precisar restaurar o estado após uma falha ou término inesperado, implemente seu próprio mecanismo de persistência de estado (por exemplo, salve o estado em um arquivo local em um temporizador ou quando ações importantes forem concluídas).

Ativação do aplicativo

SDK do Aplicativo Windows fornece suporte avançado à ativação por meio do namespace Microsoft.Windows.AppLifecycle. Seu aplicativo pode ser ativado por:

  • Inicialização padrão – o usuário seleciona o ícone do aplicativo.
  • Ativação de arquivo — O usuário abre um tipo de arquivo associado ao seu aplicativo.
  • Ativação do protocolo — Um esquema de URI registrado em seu aplicativo é invocado.
  • Ativação de inicialização – seu aplicativo se registra para iniciar no logon do usuário.
  • Outros — notificação toast, destino de compartilhamento e tipos de ativação adicionais.

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

Os aplicativos empacotados se registram para ativação por arquivo e por protocolo por meio de Package.appxmanifest. Aplicativos não empacotados não têm manifesto, portanto, eles registram os mesmos tipos de ativação no código usando Microsoft.Windows.AppLifecycle.ActivationRegistrationManager. Para obter um passo a passo detalhado de ambas as abordagens, consulte a ativação do aplicativo para SDK do Aplicativo Windows.

Em execução em segundo plano e em primeiro plano

Os aplicativos da área de trabalho continuam em execução estejam ou não em primeiro plano. O sistema não interrompe seus threads nem recupera sua memória quando o usuário alterna para outro aplicativo. No entanto, você ainda pode responder a alterações de visibilidade para otimizar o uso de recursos:

  • Libere recursos caros de GPU ou renderização quando sua janela for minimizada.
  • Pausar animações ou visualização de mídia quando a janela perder o foco.
  • Reduza a frequência do temporizador para sondagem em segundo plano.

Microsoft.UI.Xaml.Window não expõe um evento VisibilityChanged. Em vez disso, use o evento Window.Activated para detectar quando a janela ganha ou perde o foco, ou use AppWindow.Changed para detectar 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
        }
    }
};

Dica

Em dispositivos movidos a bateria, reduzir o trabalho em segundo plano quando seu aplicativo não estiver visível melhora a duração da bateria e a capacidade de resposta do sistema, mesmo que o sistema não imponha a suspensão.

Salvando o estado

Como os aplicativos da área de trabalho não estão suspensos, você controla quando salvar o estado. Abordagens recomendadas:

  • No fechamento da janela – manipule o Window.Closed evento para persistir os dados.
  • Salvamento periódico – use um temporizador para salvar o estado em intervalos (por exemplo, a cada 60 segundos).
  • Ao realizar ações importantes — salve após o usuário concluir uma ação significativa (por exemplo, concluir 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() { }

Fechamento e encerramento do aplicativo

Um aplicativo da área de trabalho é encerrado quando:

  • O usuário fecha a última janela.
  • Seu código chama Application.Current.Exit().
  • O processo é encerrado externamente (Gerenciador de Tarefas, desligamento do sistema).

Não há nenhum estado "encerrado pelo sistema para liberar recursos", como na UWP. Seu aplicativo continua em execução até ser encerrado explicitamente.

Note

Se o aplicativo falhar, ele será reiniciado do zero. Implemente o salvamento de estado periódico para minimizar a perda de dados.

Diferenças do ciclo de vida do aplicativo UWP

Behavior UWP SDK do Aplicativo Windows (Desktop)
Suspensão automática (PLM) Sim – depois de alguns segundos em segundo plano Não — mas o dispositivo inteiro ainda pode entrar em Modern Standby
Encerramento do sistema para liberar memória Sim — os aplicativos suspensos podem ser encerrados No
Suspending / Resuming Eventos Yes Não aplicável
Pré-lançamento Sim (aceitação) No
Estado em segundo plano imposto Yes Não — mas o Modo de Eficiência (EcoQoS) pode limitar aplicativos em segundo plano
Restauração de estado após o encerramento Necessário para uma boa UX Opcional — implemente o seu