Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
W tym artykule opisano cykl życia aplikacji klasycznej Zestaw SDK do aplikacji systemu Windows od uruchomienia do zakończenia. Zrozumienie cyklu życia pomaga zarządzać stanem, oszczędzać zasoby i zapewniać bezproblemowe środowisko użytkownika.
Ważna
W przeciwieństwie do aplikacji UWP aplikacje klasyczne (w tym WinUI 3) nie podlegają modelowi zarządzania cyklem życia procesów (PLM) platformy UWP, który automatycznie zawiesza i kończy aplikacje po przejściu do tła. Będą nadal działać, dopóki użytkownik nie zamknie ich lub zakończy proces. Jednak spakowana aplikacja komputerowa nadal podlega ogólnosystemowym zasadom zarządzania energią i zasobami — na przykład funkcja Modern Standby może zawiesić wszystkie procesy działające w trybie użytkownika (w tym Twoją aplikację), gdy urządzenie przechodzi w stan uśpienia, a system Windows może stosować Tryb efektywności (EcoQoS), aby obniżyć priorytet procesora i jakość usług dla aplikacji działających w tle lub zminimalizowanych. Aplikacja powinna nadal bezpiecznie obsługiwać nieoczekiwane zamknięcia (na przykład utrata zasilania, aktualizacje systemu operacyjnego lub użytkownik kończący proces za pomocą Menedżera zadań) i nie powinna zakładać, że zawsze ma pełny dostęp do procesora CPU w tle.
Przegląd cyklu życia
Aplikacja klasyczna Zestaw SDK do aplikacji systemu Windows ma prostszy cykl życia niż platforma UWP:
| State | Description |
|---|---|
| Nie uruchomiono | Proces aplikacji nie został uruchomiony. |
| Działa | Aplikacja jest aktywna. Może mieć widoczne okno lub go nie mieć. |
| Zamknięto | Użytkownik (lub system) zakończył proces. |
Ponieważ nie ma stanu wstrzymania, nie trzeba obsługiwać Suspending ani Resuming zdarzeń w taki sposób, jak działają aplikacje platformy UWP. Zamiast tego skoncentruj się na:
- Zapisywanie stanu użytkownika po zamknięciu okna lub zamknięciu aplikacji.
- Obsługa aktywacji (uruchamianie, plik, protokół lub inne rodzaje aktywacji).
- Efektywne zarządzanie pracą w tle w celu oszczędzania baterii na urządzeniach przenośnych.
Uruchamianie aplikacji
Gdy użytkownik uruchamia aplikację, jest uruchamiana metoda Microsoft.UI.Xaml.Application.OnLaunched. Użyj go, aby zainicjować okno główne i przejść do pierwszej strony.
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
Aplikacje klasyczne pakietu Zestaw SDK do aplikacji systemu Windows nie otrzymują z systemu wartości PreviousExecutionState. Jeśli musisz przywrócić stan po awarii lub nieoczekiwanym zakończeniu, zaimplementuj własny mechanizm trwałości stanu (na przykład zapisz stan w pliku lokalnym w czasomierzu lub po zakończeniu ważnych akcji).
Aktywacja aplikacji
Zestaw SDK do aplikacji systemu Windows zapewnia rozbudowaną obsługę aktywacji za pośrednictwem przestrzeni nazw Microsoft.Windows.AppLifecycle. Aplikację można aktywować, wykonując następujące czynności:
- Uruchamianie domyślne — użytkownik wybiera ikonę aplikacji.
- Aktywacja pliku — użytkownik otwiera typ pliku skojarzony z aplikacją.
- Aktywacja protokołu — wywoływany jest schemat identyfikatora URI zarejestrowany w aplikacji.
- Uruchamianie przy logowaniu — aplikacja rejestruje się do uruchamiania przy logowaniu użytkownika.
- Inne — powiadomienia typu toast, cel udostępniania i dodatkowe typy aktywacji.
Użyj klasy AppInstance.GetActivatedEventArgs , aby określić rodzaj aktywacji:
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;
}
Spakowane aplikacje rejestrują się na potrzeby aktywacji plików i protokołów za pośrednictwem programu Package.appxmanifest. Aplikacje rozpakowane nie mają manifestu, więc rejestrują te same rodzaje aktywacji w kodzie przy użyciu polecenia Microsoft.Windows.AppLifecycle.ActivationRegistrationManager. Aby uzyskać szczegółowy przewodnik po obu podejściach, zobacz Aktywacja aplikacji dla Zestaw SDK do aplikacji systemu Windows.
Działanie w tle i na pierwszym planie
Aplikacje klasyczne nadal działają, niezależnie od tego, czy znajdują się na pierwszym planie. System nie zatrzymuje wątków ani nie odzyskuje pamięci, gdy użytkownik przełącza się do innej aplikacji. Jednak nadal można reagować na zmiany widoczności w celu optymalizacji użycia zasobów:
- Zwolnij kosztowne zasoby GPU lub zasoby renderujące, gdy okno jest zminimalizowane.
- Wstrzymywanie animacji lub podglądu multimediów, gdy okno traci fokus.
- Zmniejsz częstotliwość czasomierza dla sondowania w tle.
Microsoft.UI.Xaml.Window nie ujawnia zdarzenia VisibilityChanged . Zamiast tego użyj zdarzenia Window.Activated, aby wykryć, kiedy okno uzyskuje lub traci fokus, albo użyj AppWindow.Changed, aby wykryć zmiany stanu prezentacji (na przykład zminimalizowanie lub przywrócenie):
// 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
}
}
};
Wskazówka
Na urządzeniach zasilanych z baterii zmniejszenie pracy w tle, gdy aplikacja nie jest widoczna, poprawia żywotność baterii i czas reakcji systemu, mimo że system nie wymusza zawieszenia.
Zapisywanie stanu
Ponieważ aplikacje klasyczne nie są zawieszone, możesz kontrolować czas zapisywania stanu. Zalecane podejścia:
-
Po zamknięciu okna — obsłuż zdarzenie
Window.Closed, aby zachować dane. - Zapisywanie okresowe — użyj czasomierza, aby zapisać stan w odstępach czasu (na przykład co 60 sekund).
- W przypadku ważnych akcji — zapisz po zakończeniu znaczącej akcji przez użytkownika (na przykład zakończeniu edycji).
// 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() { }
Zamykanie i kończenie działania aplikacji
Aplikacja klasyczna kończy działanie, gdy:
- Użytkownik zamyka ostatnie okno.
- Twój kod wywołuje
Application.Current.Exit(). - Proces jest zakończony zewnętrznie (Menedżer zadań, zamykanie systemu).
Nie ma stanu "zakończone przez system w celu zwolnienia zasobów", jak w systemie UWP. Aplikacja jest uruchamiana, dopóki nie zostanie jawnie zakończona.
Note
Jeśli aplikacja ulegnie awarii, zostanie ona uruchomiona od podstaw. Zaimplementuj okresowe zapisywanie stanu, aby zminimalizować utratę danych.
Różnice w cyklu życia aplikacji platformy UWP
| Behavior | platforma UWP | Zestaw SDK do aplikacji systemu Windows (desktop) |
|---|---|---|
| Automatyczne zawieszenie (PLM) | Tak — po kilku sekundach w tle | Nie — ale całe urządzenie może nadal przejść w tryb Modern Standby |
| Zamknięcie systemu w celu zwolnienia pamięci | Tak — zawieszone aplikacje mogą być zamknięte | No |
Suspending
/
Resuming Zdarzenia |
Yes | Nie dotyczy |
| Wstępne uruchamianie | Tak (zgoda) | No |
| Wymuszono stan działania w tle | Yes | Nie — ale tryb wydajności (EcoQoS) może ograniczać aplikacje w tle |
| Przywracanie stanu po zakończeniu | Wymagane dla dobrego środowiska użytkownika | Opcjonalnie — zaimplementuj własne |