Alkalmazás életciklusa Windows App SDK asztali alkalmazásokhoz

Ez a cikk egy Windows App SDK asztali alkalmazás életciklusát ismerteti az indítástól a leállításig. Az életciklus megértése segít az állapot kezelésében, az erőforrások megőrzésében és a zökkenőmentes felhasználói élmény biztosításában.

Important

Az UWP-alkalmazásokkal ellentétben az asztali alkalmazásokra (beleértve a WinUI 3-at is) nem vonatkozik a háttérbe kerüléskor történő automatikus felfüggesztés és leállítás UWP folyamat-életcikluskezelési (PLM) modellje. Addig futnak, amíg a felhasználó be nem zárja őket, vagy a folyamat kilép. A csomagolt asztali alkalmazásokra azonban továbbra is rendszerszintű energia- és erőforrás-szabályzatok vonatkoznak – a Modern Készenléti funkció például felfüggesztheti az összes felhasználói módú folyamatot (beleértve az alkalmazást is), amikor az eszköz alvó állapotban van, Windows pedig hatékonysági módot (EcoQoS) alkalmazhat a cpu-prioritás és a szolgáltatásminőség szabályozására a háttér- vagy kis méretű alkalmazások esetében. Az alkalmazásnak továbbra is elegánsan kell kezelnie a váratlan leállításokat (például áramkimaradást, operációsrendszer-frissítéseket vagy a folyamatot a Feladatkezelőn keresztül befejező felhasználót), és nem feltételezheti, hogy mindig teljes sebességű CPU-hozzáféréssel rendelkezik, miközben háttérrel rendelkezik.

Életciklus áttekintése

Az asztali Windows App SDK-alkalmazások életciklusa egyszerűbb, mint az UWP:

State Description
Nem fut Az alkalmazásfolyamat nem indult el.
Fut Az alkalmazás aktív. Lehet, hogy nincs látható ablaka.
Zárt A felhasználó (vagy a rendszer) befejezte a folyamatot.

Mivel nincs felfüggesztési állapot, nem kell úgy kezelnie a Suspending vagy Resuming eseményeket, mint az UWP-alkalmazások esetében. Ehelyett a következőkre összpontosítson:

  • A felhasználói állapot mentése az ablak bezárásakor vagy az alkalmazás leállásakor.
  • Aktiválás kezelése (indítás, fájl, protokoll vagy más aktiválási típus).
  • A háttérben futó feladatok hatékony kezelése a hordozható eszközök akkumulátorának kímélése érdekében.

Alkalmazás indítása

Amikor egy felhasználó elindítja az alkalmazást, a Microsoft. UI. Az Xaml.Application.OnLaunched metódus fut. Ezzel inicializálhatja a főablakot, és navigálhat az első oldalra.

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 asztali alkalmazások nem kapnak PreviousExecutionState értéket a rendszertől. Ha összeomlás vagy váratlan leállás után vissza kell állítania az állapotot, implementálja saját állapotmegőrzési mechanizmusát (például mentse az állapotot egy helyi fájlba egy időzítőn, vagy amikor a fontos műveletek befejeződnek).

Alkalmazásaktiválás

A Windows App SDK átfogó aktiválási támogatást biztosít a Microsoft.Windows.AppLifecycle névtéren keresztül. Az alkalmazás a következővel aktiválható:

  • Alapértelmezett indítás – A felhasználó kiválasztja az alkalmazás ikonját.
  • Fájlaktiválás – A felhasználó megnyitja az alkalmazáshoz társított fájltípust.
  • Protokollaktiválás – A rendszer meghívja az alkalmazáshoz regisztrált URI-sémát.
  • Indítási aktiválás – Az alkalmazás regisztrál, hogy a felhasználói bejelentkezéskor induljon el.
  • Egyéb — Felugró értesítés, megosztási célpont és további aktiválási típusok.

Az aktiválás típusának meghatározásához használja az AppInstance.GetActivatedEventArgs parancsot :

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

A csomagolt alkalmazások a(z) Package.appxmanifest használatával regisztrálnak a fájl- és protokollaktiváláshoz. A csomagolatlan alkalmazások nem rendelkeznek jegyzékfájllal Microsoft.Windows.AppLifecycle.ActivationRegistrationManager, ezért ugyanazokat az aktiválási típusokat regisztrálják a kódban. Mindkét megközelítés részletes útmutatóját az alkalmazás aktiválása Windows App SDK című témakörben találja.

Futás a háttérben és az előtérben

Az asztali alkalmazások továbbra is futnak, függetlenül attól, hogy az előtérben vannak-e. A rendszer nem állítja le a szálakat, és nem vonja vissza a memóriát, amikor a felhasználó másik alkalmazásra vált. Az erőforrás-használat optimalizálása érdekében azonban továbbra is reagálhat a láthatósági változásokra:

  • Szabadítsa fel a GPU- vagy renderelési erőforrásokat, amikor az ablak minimalizált állapotban van.
  • Szüneteltetheti az animációkat vagy a média előnézetét, ha az ablak elveszíti a fókuszt.
  • Csökkentse az időzítő gyakoriságát a háttérbeli lekérdezések esetében.

Microsoft.UI.Xaml.Window nem tesz közzé eseményt VisibilityChanged . Ehelyett használja az Window.Activated eseményt annak észlelésére, hogy az ablak mikor kap vagy veszít fókuszt, vagy hogy AppWindow.Changed észlelje az előadói állapot változásait (például minimalizálva vagy visszaállítva):

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

Akkumulátoros eszközökön a háttérmunka csökkentése, ha az alkalmazás nem látható, javítja az akkumulátor élettartamát és a rendszer válaszkészségét, még akkor is, ha a rendszer nem kényszeríti a felfüggesztést.

Állapot mentése

Mivel az asztali alkalmazások nincsenek felfüggesztve, ön szabályozhatja, hogy mikor mentse az állapotot. Ajánlott megközelítések:

  • Ablak bezárásakor – Az esemény kezelése az Window.Closed adatok megőrzéséhez.
  • Rendszeres mentés – Időmérővel időnként (például 60 másodpercenként) mentheti az állapotot.
  • Fontos műveletek esetén – Mentés, miután a felhasználó végrehajtott egy jelentős műveletet (például szerkesztés befejezése).
// 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() { }

Alkalmazás bezárása és leállítása

Az asztali alkalmazások leállnak, ha:

  • A felhasználó bezárja az utolsó ablakot.
  • A kód meghívja a(z) Application.Current.Exit() elemet.
  • A folyamat külsőleg véget ér (Feladatkezelő, rendszerleállítás).

Nincs az UWP-ből ismert, „a rendszer az erőforrások felszabadítása érdekében megszünteti” állapot. Az alkalmazás addig fut, amíg explicit módon nem lép ki.

Note

Ha az alkalmazás összeomlik, az teljesen újraindul. Rendszeres állapot-mentés implementálása az adatvesztés minimalizálása érdekében.

Különbségek az UWP-alkalmazások életciklusától

Magatartás UWP Windows App SDK (asztali gépekhez)
Automatikus felfüggesztés (PLM) Igen – néhány másodperc után a háttérben Nem – de az egész eszköz továbbra is be tud lépni a Modern Készenléti üzemmódba
A rendszer leállítása a memória felszabadítására Igen – a felfüggesztett alkalmazások leállhatnak No
Suspending / Resuming Események Igen Nem alkalmazható
Előzetes telepítés Igen (bejelentkezés) No
Háttérállapot kikényszerítve Igen Nem – de a hatékonysági mód (EcoQoS) szabályozhatja a háttérbeli alkalmazásokat
Állapot visszaállítása a megszűnés után Jó UX-hez szükséges Nem kötelező – saját megvalósítás