Applivscykel för Windows App SDK skrivbordsappar

I den här artikeln beskrivs livscykeln för en Windows App SDK skrivbordsapp från start till avslutning. Genom att förstå livscykeln kan du hantera tillstånd, spara resurser och ge en smidig användarupplevelse.

Important

Till skillnad från UWP-appar omfattas inte skrivbordsappar (inklusive WinUI 3) av UWP-modellen för livscykelhantering (PLM) för automatisk avstängning och avslutning i bakgrunden. De fortsätter att köras tills användaren stänger dem eller processen avslutas. En paketerad skrivbordsapp omfattas dock fortfarande av systemomfattande energi- och resursprinciper – till exempel kan modernt vänteläge pausa alla processer i användarläge (inklusive din app) när enheten är i strömsparläge, och Windows kan använda Effektivitetsläge (EcoQoS) för att begränsa PROCESSORprioritet och tjänstkvalitet för bakgrundsappar eller minimerade appar. Appen bör fortfarande hantera oväntade avstängningar på ett korrekt sätt (till exempel strömavbrott, OS-uppdateringar eller användaren som avslutar processen via Aktivitetshanteraren) och bör inte anta att den alltid har processoråtkomst med full hastighet i bakgrunden.

Livscykelöversikt

En Windows App SDK skrivbordsapp har en enklare livscykel än UWP:

Tillstånd Description
Körs inte Appprocessen har inte startats.
Kör Appen är aktiv. Det kanske eller kanske inte har ett synligt fönster.
Stängt Användaren (eller systemet) avslutade processen.

Eftersom det inte finns något pausat tillstånd behöver du inte hantera Suspending eller Resuming händelser som UWP-appar gör. Fokusera i stället på:

  • Sparar användartillstånd när fönstret stängs eller appen stängs av.
  • Hantera aktivering (start, fil, protokoll eller andra aktiveringstyper).
  • Hantera bakgrundsarbete effektivt för att spara batteri på bärbara enheter.

Start av app

När en användare startar din app Microsoft. UI. Xaml.Application.OnLaunched-metoden körs. Använd det för att initiera huvudfönstret och navigera till din första sida.

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

Windows App SDK skrivbordsappar får inte något PreviousExecutionState värde från systemet. Om du behöver återställa tillstånd efter en krasch eller oväntad avslutning, implementerar du en egen mekanism för att bevara tillståndet (du kan till exempel spara tillståndet i en lokal fil med jämna mellanrum eller när viktiga åtgärder har slutförts).

Aktivering av app

Windows App SDK ger omfattande aktiveringsstöd via Microsoft.Windows. AppLifecycle-namnområde. Appen kan aktiveras genom att:

  • Standardstart – Användaren väljer din appikon.
  • Filaktivering – Användaren öppnar en filtyp som är associerad med din app.
  • Protokollaktivering – Ett URI-schema som är registrerat i din app anropas.
  • Startaktivering – Appen registreras för att starta vid användarinloggning.
  • Övrigt — toast-meddelande, delningsmål och ytterligare aktiveringstyper.

Använd AppInstance.GetActivatedEventArgs för att fastställa aktiveringstyp:

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

Paketerade appar registreras för fil- och protokollaktivering via Package.appxmanifest. Opaketerade appar har inget manifest, så de registrerar samma aktiveringstyper i kod med Microsoft.Windows.AppLifecycle.ActivationRegistrationManager. En detaljerad genomgång av båda metoderna finns i Appaktivering för Windows App SDK.

Körs i bakgrunden och förgrunden

Skrivbordsappar fortsätter att köra oavsett om de är i förgrunden eller inte. Systemet stoppar inte trådarna eller återtar minnet när användaren växlar till en annan app. Du kan dock fortfarande svara på synlighetsändringar för att optimera resursanvändningen:

  • Frigör dyra GPU-resurser eller återgivningsresurser när fönstret minimeras.
  • Pausa animeringar eller medieförhandsvisning när fönstret tappar fokus.
  • Minska timerfrekvensen för bakgrundspollning.

Microsoft.UI.Xaml.Window exponerar inte en VisibilityChanged-händelse. Använd Window.Activated i stället händelsen för att identifiera när ditt fönster ökar eller förlorar fokus eller använder AppWindow.Changed för att identifiera ändringar i presentatörstillstånd (till exempel minimerat eller återställt):

// 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

På batteridrivna enheter förbättras batteritiden och systemets respons om du minskar bakgrundsarbete när appen inte är synlig, även om systemet inte framtvingar pausning.

Sparar tillstånd

Eftersom skrivbordsappar inte pausas styr du när tillståndet ska sparas. Rekommenderade metoder:

  • Vid fönsterstängning – Hantera Window.Closed händelsen för att spara data.
  • Periodisk sparande – Använd en timer för att spara tillstånd med intervall (till exempel var 60:e sekund).
  • Vid viktiga åtgärder – Spara när användaren har slutfört en betydande åtgärd (till exempel när en redigering har slutförts).
// 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() { }

Stäng och avsluta appen

En skrivbordsapp avslutas när:

  • Användaren stänger det sista fönstret.
  • Koden anropar Application.Current.Exit().
  • Processen avslutas externt (Aktivitetshanteraren, systemavstängning).

Det finns inget tillstånd "avslutat av systemet för att frigöra resurser" som i UWP. Din app körs tills den uttryckligen avslutas.

Note

Om din app kraschar startas den om från början. Implementera periodisk tillståndsbesparing för att minimera dataförlust.

Skillnader från UWP-appens livscykel

Behavior UWP Windows App SDK (Desktop)
Automatisk fjädring (PLM) Ja – efter några sekunder i bakgrunden Nej – men hela enheten kan fortfarande ange modernt vänteläge
Systemavslutning för att frigöra minne Ja – pausade appar kan avslutas No
Suspending / Resuming händelser Yes Ej tillämpligt
Förlansering Ja (anmäl dig) No
Bakgrundstillstånd framtvingat Yes Nej – men Effektivitetsläge (EcoQoS) kan begränsa bakgrundsappar
Återställning av tillstånd efter avslut Krävs för bra UX Valfritt – implementera egna