Risparmio energia con l'API del ciclo di vita dell'app
L'API del ciclo di vita dell'app nella SDK per app di Windows fornisce un set di API di risparmio energia nello spazio dei nomi Microsoft.Windows.System.Power. Queste API offrono visibilità su come un'app influisce sullo stato di alimentazione del dispositivo e consentono all'app di prendere decisioni intelligenti sull'utilizzo delle risorse. Ad esempio, un'app potrebbe usare questa API per posticipare le attività in background a elevato utilizzo di risorse mentre il dispositivo è in esecuzione con alimentazione a batteria.
Le API di risparmio energia usano un modello basato su callback simile alla funzione PowerSettingRegisterNotification esistente. L'uso di un modello di callback estende la portata dell'API a tutte le app, incluse le app in background, le app headless e altre.
Prerequisiti
Per usare l'API del ciclo di vita dell'app nella SDK per app di Windows:
- Scaricare e installare la versione più recente del SDK per app di Windows. Per altre informazioni, vedere Installare gli strumenti per il SDK per app di Windows.
- Seguire le istruzioni per creare il primo progetto WinUI 3 o per usare il SDK per app di Windows in un progetto esistente.
Sottoscrivere e rispondere agli eventi
Nell'esempio seguente viene illustrato come sottoscrivere e rispondere agli eventi di PowerManager . Questo codice sottoscrive l'evento BatteryStatusChanged durante l'avvio. L'app risponde quindi alle modifiche controllando il livello di alimentazione corrente e modificando in modo appropriato l'utilizzo delle risorse. Ad esempio, se la batteria scarica a basso consumo, l'app potrebbe rinviare qualsiasi lavoro in background non critico.
Nota
Le app possono registrare e annullare la registrazione per questi eventi in qualsiasi momento, ma la maggior parte delle app vuole impostare i callback in tale condizione WinMain
finché l'app continua a essere eseguita.
BOOL bWorkInProgress;
winrt::event_token batteryToken;
winrt::event_token powerToken;
winrt::event_token powerSourceToken;
winrt::event_token chargeToken;
winrt::event_token dischargeToken;
void RegisterPowerManagerCallbacks()
{
batteryToken = PowerManager::BatteryStatusChanged([&](
const auto&, winrt::Windows::Foundation::IInspectable obj) { OnBatteryStatusChanged(); });
powerToken = PowerManager::PowerSupplyStatusChanged([&](
const auto&, winrt::Windows::Foundation::IInspectable obj) { OnPowerSupplyStatusChanged(); });
powerSourceToken = PowerManager::PowerSourceKindChanged([&](
const auto&, winrt::Windows::Foundation::IInspectable obj) { OnPowerSourceKindChanged(); });
chargeToken = PowerManager::RemainingChargePercentChanged([&](
const auto&, winrt::Windows::Foundation::IInspectable obj) { OnRemainingChargePercentChanged(); });
dischargeToken = PowerManager::RemainingDischargeTimeChanged([&](
const auto&, winrt::Windows::Foundation::IInspectable obj) { OnRemainingDischargeTimeChanged(); });
if (batteryToken && powerToken && powerSourceToken && chargeToken && dischargeToken)
{
OutputMessage(L"Successfully registered for state notifications");
}
else
{
OutputMessage(L"Failed to register for state notifications");
}
}
void OnBatteryStatusChanged()
{
const size_t statusSize = 16;
WCHAR szStatus[statusSize];
wmemset(&(szStatus[0]), 0, statusSize);
BatteryStatus batteryStatus = PowerManager::BatteryStatus();
int remainingCharge = PowerManager::RemainingChargePercent();
switch (batteryStatus)
{
case BatteryStatus::Charging:
wcscpy_s(szStatus, L"Charging");
break;
case BatteryStatus::Discharging:
wcscpy_s(szStatus, L"Discharging");
break;
case BatteryStatus::Idle:
wcscpy_s(szStatus, L"Idle");
break;
case BatteryStatus::NotPresent:
wcscpy_s(szStatus, L"NotPresent");
break;
}
OutputFormattedMessage(
L"Battery status changed: %s, %d%% remaining",
szStatus, remainingCharge);
DetermineWorkloads();
}
void OnPowerSupplyStatusChanged()
{
//...etc
}
Configurare la logica dell'app in base a più valori di stato
Gli eventi di PowerManager sono relativamente di basso livello e in alcuni scenari un singolo gestore eventi chiamato potrebbe non fornire informazioni sufficienti per l'app per decidere come comportarsi. In questo esempio, l'evento PowerSupplyStatusChanged può essere chiamato quando il dispositivo è disconnesso dall'alimentazione. In tal caso, l'app deve controllare lo stato corrente della batteria prima di decidere come procedere.
void DetermineWorkloads()
{
BatteryStatus batteryStatus = PowerManager::BatteryStatus();
int remainingCharge = PowerManager::RemainingChargePercent();
PowerSupplyStatus powerStatus = PowerManager::PowerSupplyStatus();
PowerSourceKind powerSource = PowerManager::PowerSourceKind();
if ((powerSource == PowerSourceKind::DC
&& batteryStatus == BatteryStatus::Discharging
&& remainingCharge < 25)
|| (powerSource == PowerSourceKind::AC
&& powerStatus == PowerSupplyStatus::Inadequate))
{
// The device is not in a good battery/power state,
// so we should pause any non-critical work.
PauseNonCriticalWork();
}
else if ((batteryStatus != BatteryStatus::Discharging && remainingCharge > 75)
&& powerStatus != PowerSupplyStatus::Inadequate)
{
// The device is in good battery/power state,
// so let's kick of some high-power work.
StartPowerIntensiveWork();
}
}
Controllare lo stato della schermata
La classe PowerManager offre informazioni sugli altri stati del dispositivo rilevanti per l'utilizzo di energia di un'app. Ad esempio, le app possono disabilitare l'elaborazione grafica quando lo schermo del dispositivo è disattivato.
void OnDisplayStatusChanged()
{
const size_t statusSize = 16;
WCHAR szStatus[statusSize];
wmemset(&(szStatus[0]), 0, statusSize);
DisplayStatus displayStatus = PowerManager::DisplayStatus();
switch (displayStatus)
{
case DisplayStatus::Dimmed:
wcscpy_s(szStatus, L"Dimmed");
break;
case DisplayStatus::Off:
wcscpy_s(szStatus, L"Off");
break;
case DisplayStatus::On:
wcscpy_s(szStatus, L"On");
break;
}
OutputFormattedMessage(
L"Display status changed: %s", szStatus);
if (displayStatus == DisplayStatus::Off)
{
// The screen is off, let's stop rendering foreground graphics,
// and instead kick off some background work now.
StopUpdatingGraphics();
StartDoingBackgroundWork();
}
}
Annullare la sottoscrizione a eventi
Le app possono registrare e annullare la registrazione per le notifiche durante il ciclo di vita. Usa il sistema di gestione della registrazione degli eventi preferito della tua lingua se l'app non deve ricevere notifiche sullo stato di alimentazione durante l'intero ciclo di vita.
void UnregisterPowerManagerCallbacks()
{
OutputMessage(L"Unregistering state notifications");
PowerManager::BatteryStatusChanged(batteryToken);
PowerManager::PowerSupplyStatusChanged(powerToken);
PowerManager::PowerSourceKindChanged(powerSourceToken);
PowerManager::RemainingChargePercentChanged(chargeToken);
PowerManager::RemainingDischargeTimeChanged(dischargeToken);
}
Argomenti correlati
Commenti e suggerimenti
https://aka.ms/ContentUserFeedback.
Presto disponibile: nel corso del 2024 verranno dismessi i problemi di GitHub come meccanismo di feedback per il contenuto e verranno sostituiti con un nuovo sistema di feedback. Per altre informazioni, vedere:Invia e visualizza il feedback per