Verschieben der angehaltenen App mithilfe der erweiterten Ausführung
In diesem Artikel wird erläutert, wie Sie die erweiterte Ausführung verwenden, um die Angehaltene App zu verschieben, damit sie während der Minimierung oder unter dem Sperrbildschirm ausgeführt werden kann.
Wenn der Benutzer eine App minimiert oder deaktiviert, wird sie in einen angehaltenen Zustand versetzt. Der Speicher wird beibehalten, aber der Code wird nicht ausgeführt. Dies gilt für alle Betriebssystemeditionen mit einer visuellen Benutzeroberfläche. Weitere Informationen dazu, wann Ihre App angehalten wird, finden Sie unter Application Lifecycle.
Es gibt Fälle, in denen eine App möglicherweise weiter ausgeführt werden muss, anstatt angehalten zu werden, wenn der Benutzer von der App navigiert oder minimiert wird. Beispielsweise muss eine Schrittzählungs-App auch dann weiter ausgeführt und nachverfolgt werden, wenn der Benutzer zu anderen Apps navigiert.
Wenn eine App weiterhin ausgeführt werden muss, kann das Betriebssystem die Ausführung beibehalten oder die Ausführung anfordern. Wenn Sie beispielsweise Audio im Hintergrund wiedergeben, kann das Betriebssystem eine App länger ausführen, wenn Sie diese Schritte für die Medienwiedergabe im Hintergrund ausführen. Andernfalls müssen Sie manuell mehr Zeit anfordern. Der Zeitraum, in dem Sie die Ausführung des Hintergrunds ausführen können, kann mehrere Minuten dauern, aber Sie müssen bereit sein, die sitzung zu behandeln, die jederzeit widerrufen wird. Diese Zeitbeschränkungen für den Anwendungslebenszyklus werden deaktiviert, während die App unter einem Debugger ausgeführt wird. Aus diesem Grund ist es wichtig, erweiterte Ausführung und andere Tools für das Anhalten von Apps zu testen, während sie nicht unter einem Debugger oder mithilfe der in Visual Studio verfügbaren Lifecycle-Ereignisse ausgeführt werden.
Erstellen Sie eine ExtendedExecutionSession , um mehr Zeit zum Abschließen eines Vorgangs im Hintergrund anzufordern. Die Art von ExtendedExecutionSession , die Sie erstellen, wird durch das ExtendedExecutionReason bestimmt, das Sie beim Erstellen angeben. Es gibt drei ExtendedExecutionReason-Enumerationswerte : Nicht angegeben, LocationTracking und SavingData. Es kann jederzeit nur eine ExtendedExecutionSession angefordert werden. Wenn Sie versuchen, eine andere Sitzung zu erstellen, während eine genehmigte Sitzungsanforderung derzeit aktiv ist, wird eine Ausnahme ausgelöst, 0x8007139F aus dem ExtendedExecutionSession-Konstruktor ausgelöst wird, der besagt, dass die Gruppe oder Ressource nicht im richtigen Zustand ist, um den angeforderten Vorgang auszuführen. Verwenden Sie "ExtendedExecutionForegroundSession " und "ExtendedExecutionForegroundReason" nicht. Sie erfordern eingeschränkte Funktionen und sind nicht für die Verwendung in Store-Anwendungen verfügbar.
Ausführen während minimierter Ausführung
Es gibt zwei Fälle, in denen die erweiterte Ausführung verwendet werden kann:
- Zu jedem Zeitpunkt während der regulären Vordergrundausführung, während sich die Anwendung im ausgeführten Zustand befindet.
- Nachdem die Anwendung ein Anhalteereignis empfangen hat (das Betriebssystem ist dabei, die App in den angehaltenen Zustand zu verschieben) im Anhalteereignishandler der Anwendung.
Der Code für diese beiden Fälle ist identisch, die Anwendung verhält sich jedoch in jedem Fall etwas anders. Im ersten Fall verbleibt die Anwendung im Ausführungszustand, auch wenn ein Ereignis, das normalerweise das Anhalten auslösen würde (z. B. der Benutzer, der von der Anwendung weg navigiert). Die Anwendung empfängt niemals ein Anhalteereignis, während die Ausführungserweiterung wirksam ist. Wenn die Erweiterung verworfen wird, wird die Anwendung wieder zur Aussetzung berechtigt.
Wenn die Anwendung im zweiten Fall in den angehaltenen Zustand wechselt, verbleibt sie für den Zeitraum der Verlängerung in einem Anhaltezustand. Sobald die Erweiterung abgelaufen ist, wechselt die Anwendung ohne weitere Benachrichtigung in den angehaltenen Zustand.
Verwenden Sie ExtendedExecutionReason.Unspecified , wenn Sie eine ExtendedExecutionSession erstellen, um zusätzliche Zeit anzufordern, bevor Ihre App in den Hintergrund wechselt, z. B. Medienverarbeitung, Projektkompilierung oder Beibehalten einer Netzwerkverbindung. Auf Desktopgeräten mit Windows 10 für Desktopeditionen (Home, Pro, Enterprise und Education) ist dies der Ansatz, wenn eine App nicht angehalten werden muss, während sie minimiert wird.
Fordern Sie die Erweiterung an, wenn Sie einen vorgang mit langer Ausführung starten, um den Anhaltezustandsübergang zurückzusetzen, der andernfalls auftritt, wenn die App in den Hintergrund wechselt. Auf Desktopgeräten verfügen erweiterte Ausführungssitzungen, die mit ExtendedExecutionReason.Unspecified erstellt wurden, über ein akkufähiges Zeitlimit. Wenn das Gerät an die Wandleistung angeschlossen ist, gibt es keine Beschränkung auf die Länge des erweiterten Ausführungszeitraums. Wenn sich das Gerät im Akkubetrieb befindet, kann der erweiterte Ausführungszeitraum bis zu zehn Minuten im Hintergrund ausgeführt werden.
Ein Tablet- oder Laptopbenutzer kann auf Kosten der Akkulaufzeit das gleiche Verhalten erhalten– wenn die Option "Hintergrundaufgaben ausführen" in der Akkunutzung nach App-Einstellungen ausgewählt wird. (Um diese Option auf einem Laptop zu finden, wechseln Sie zu Einstellungen>system>battery battery>battery usage by App (the link under the percent of battery power remaining) > select an app > turn off Managed By Windows> select App to run background tasks.
Bei allen Betriebssystemeditionen wird diese Art erweiterter Ausführungssitzung beendet, wenn das Gerät in den verbundenen Standbymodus wechselt. Auf mobilen Geräten unter Windows 10 Mobile wird diese Art von erweiterter Ausführungssitzung so lange ausgeführt, wie der Bildschirm aktiviert ist. Wenn der Bildschirm deaktiviert wird, versucht das Gerät sofort, in den Energiesparmodus angeschlossenen Standbymodus zu wechseln. Auf Desktopgeräten wird die Sitzung weiterhin ausgeführt, wenn der Sperrbildschirm angezeigt wird. Das Gerät wechselt nicht länger in den verbundenen Standbymodus, nachdem der Bildschirm ausgeschaltet wurde. Auf der Xbox OS Edition wechselt das Gerät nach einer Stunde in den Verbindungsmodus, es sei denn, der Benutzer ändert die Standardeinstellung.
Nachverfolgen des Standorts des Benutzers
Geben Sie "ExtendedExecutionReason.LocationTracking " an, wenn Sie eine ExtendedExecutionSession erstellen, wenn Ihre App den Standort regelmäßig aus dem GeoLocator protokollieren muss. Apps für Fitness-Tracking und Navigation, die die Position des Benutzers regelmäßig überwachen müssen und diesen Grund verwenden sollten.
Eine erweiterte Ausführungssitzung zur Standortnachverfolgung kann so lange wie nötig ausgeführt werden, einschließlich der Sperrung des Bildschirms auf einem mobilen Gerät. Pro Gerät kann jedoch nur eine solche Sitzung ausgeführt werden. Eine erweiterte Ausführungssitzung zur Standortverfolgung kann nur im Vordergrund angefordert werden, und die App muss sich im Zustand "Ausführen " befinden. Dadurch wird sichergestellt, dass der Benutzer weiß, dass die App eine erweiterte Standortverfolgungssitzung initiiert hat. Es ist weiterhin möglich, geoLocator zu verwenden, während sich die App im Hintergrund befindet, indem sie eine Hintergrundaufgabe oder einen App-Dienst verwendet, ohne eine erweiterte Ausführungssitzung zur Standortverfolgung anzufordern.
Lokales Speichern kritischer Daten
Geben Sie "ExtendedExecutionReason.SavingData " an, wenn Sie eine ExtendedExecutionSession erstellen, um Benutzerdaten zu speichern, wenn die Daten nicht gespeichert werden, bevor die App beendet wird, zu Datenverlusten und einer negativen Benutzererfahrung führen.
Verwenden Sie diese Art von Sitzung nicht, um die Lebensdauer einer App zum Hochladen oder Herunterladen von Daten zu verlängern. Wenn Sie Daten hochladen müssen, fordern Sie eine Hintergrundübertragung an, oder registrieren Sie einen MaintenanceTrigger, um die Übertragung zu verarbeiten, wenn die Stromversorgung verfügbar ist. Eine extendedExecutionReason.SavingData erweiterte Ausführungssitzung kann entweder angefordert werden, wenn sich die App im Vordergrund und im Zustand "Ausführen " befindet, oder im Hintergrund und im Anhaltezustand .
Der Status "Anhalten" ist die letzte Möglichkeit während des App-Lebenszyklus, die eine App ausführen kann, bevor die App beendet wird. ExtendedExecutionReason.SavingData ist der einzige Typ von ExtendedExecutionSession , der im Anhaltezustand angefordert werden kann. Das Anfordern einer erweiterten ExtendedExecutionReason.SavingData-Ausführungssitzung , während sich die App im Zustand "Anhalten " befindet, erzeugt ein potenzielles Problem, das Sie beachten sollten. Wenn eine erweiterte Ausführungssitzung während des Anhaltezustands angefordert wird und der Benutzer die App erneut startet, kann es länger dauern, bis die App gestartet wird. Dies liegt daran, dass der Zeitraum der erweiterten Ausführungssitzung abgeschlossen werden muss, bevor die alte Instanz der App geschlossen werden kann und eine neue Instanz der App gestartet werden kann. Die Startleistungszeit wird geopfert, um sicherzustellen, dass der Benutzerstatus nicht verloren geht.
Anfordern, Entsorgung und Widerruf
Es gibt drei grundlegende Interaktionen mit einer erweiterten Ausführungssitzung: Anforderung, Entsorgung und Sperrung. Die Anforderung wird im folgenden Codeausschnitt modelliert.
Anfordern
var newSession = new ExtendedExecutionSession();
newSession.Reason = ExtendedExecutionReason.Unspecified;
newSession.Revoked += SessionRevoked;
ExtendedExecutionResult result = await newSession.RequestExtensionAsync();
switch (result)
{
case ExtendedExecutionResult.Allowed:
DoLongRunningWork();
break;
default:
case ExtendedExecutionResult.Denied:
DoShortRunningWork();
break;
}
Das Aufrufen von RequestExtensionAsync überprüft mit dem Betriebssystem, ob der Benutzer Hintergrundaktivitäten für die App genehmigt hat und ob das System über die verfügbaren Ressourcen zum Aktivieren der Hintergrundausführung verfügt. Es wird immer nur eine Sitzung für eine App genehmigt, wodurch zusätzliche Aufrufe von RequestExtensionAsync dazu führen, dass die Sitzung verweigert wird.
Sie können den BackgroundExecutionManager vorab überprüfen, um den BackgroundAccessStatus zu ermitteln. Dies ist die Benutzereinstellung, die angibt, ob Ihre App im Hintergrund ausgeführt werden kann oder nicht. Weitere Informationen zu diesen Benutzereinstellungen finden Sie unter "Hintergrundaktivität" und "Energiebewusstsein".
Der ExtendedExecutionReason gibt an, dass die App im Hintergrund ausgeführt wird. Die Beschreibungszeichenfolge ist eine lesbare Zeichenfolge, die erläutert, warum Ihre App den Vorgang ausführen muss. Diese Zeichenfolge wird dem Benutzer nicht angezeigt, kann aber in einer zukünftigen Version von Windows verfügbar gemacht werden. Der Revoked-Ereignishandler ist erforderlich, damit eine erweiterte Ausführungssitzung ordnungsgemäß angehalten werden kann, wenn der Benutzer oder das System entscheidet, dass die App nicht mehr im Hintergrund ausgeführt werden kann.
Widerrufen
Wenn eine App über eine aktive erweiterte Ausführungssitzung verfügt und das System hintergrundaktivität angehalten werden muss, da eine Vordergrundanwendung die Ressourcen erfordert, wird die Sitzung widerrufen. Ein erweiterter Ausführungszeitraum wird nie beendet, ohne zuerst den Revoked-Ereignishandler auslösen zu müssen.
Wenn das Revoked-Ereignis für eine extendedExecutionReason.SavingData erweiterte Ausführungssitzung ausgelöst wird, verfügt die App über eine Sekunde, um den Vorgang abzuschließen, der ausgeführt wurde, und das Anhalten beenden.
Die Sperrung kann aus vielen Gründen erfolgen: Es wurde eine Ausführungszeitgrenze erreicht, ein Energiekontingent für den Hintergrund erreicht, oder der Speicher muss zurückgefordert werden, damit der Benutzer eine neue App im Vordergrund öffnen kann.
Hier ist ein Beispiel für einen Revoked-Ereignishandler:
private async void SessionRevoked(object sender, ExtendedExecutionRevokedEventArgs args)
{
await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
{
switch (args.Reason)
{
case ExtendedExecutionRevokedReason.Resumed:
rootPage.NotifyUser("Extended execution revoked due to returning to foreground.", NotifyType.StatusMessage);
break;
case ExtendedExecutionRevokedReason.SystemPolicy:
rootPage.NotifyUser("Extended execution revoked due to system policy.", NotifyType.StatusMessage);
break;
}
EndExtendedExecution();
});
}
Dispose
Der letzte Schritt besteht darin, die erweiterte Ausführungssitzung zu löschen. Sie möchten die Sitzung und alle anderen speicherintensiven Ressourcen löschen, da andernfalls die von der App verbrauchte Energie, während sie auf das Schließen der Sitzung wartet, gegen das Energiekontingent der App gezählt wird. Um so viel Energiekontingent für die App wie möglich beizubehalten, ist es wichtig, die Sitzung zu verwerfen, wenn Sie mit Ihrer Arbeit für die Sitzung fertig sind, damit die App schneller in den Angehaltenen Zustand wechselt .
Wenn Sie die Sitzung selbst löschen, anstatt auf das Sperrereignis zu warten, wird die Energiekontingentnutzung Ihrer App reduziert. Dies bedeutet, dass Ihre App in zukünftigen Sitzungen länger im Hintergrund ausgeführt werden darf, da dafür mehr Energiekontingent verfügbar ist. Sie müssen bis zum Ende des Vorgangs einen Verweis auf das ExtendedExecutionSession-Objekt beibehalten, damit Sie die Dispose-Methode aufrufen können.
Ein Codeausschnitt, der eine erweiterte Ausführungssitzung entfernt, folgt:
void ClearExtendedExecution(ExtendedExecutionSession session)
{
if (session != null)
{
session.Revoked -= SessionRevoked;
session.Dispose();
session = null;
}
}
Eine App kann jeweils nur eine ExtendedExecutionSession aktiv haben. Viele Apps verwenden asynchrone Aufgaben, um komplexe Vorgänge auszuführen, die Zugriff auf Ressourcen wie Speicher, Netzwerk oder netzwerkbasierte Dienste erfordern. Wenn für einen Vorgang mehrere asynchrone Aufgaben ausgeführt werden müssen, muss der Status jeder dieser Aufgaben berücksichtigt werden, bevor die ExtendedExecutionSession verworf und die App angehalten werden kann. Dies erfordert eine Referenzzählung der Anzahl der noch ausgeführten Vorgänge und nicht das Löschen der Sitzung, bis dieser Wert null erreicht.
Hier ist ein Beispielcode zum Verwalten mehrerer Aufgaben während eines erweiterten Ausführungszeitraums. Weitere Informationen zur Verwendung in Ihrer App finden Sie im unten verlinkten Codebeispiel:
static class ExtendedExecutionHelper
{
private static ExtendedExecutionSession session = null;
private static int taskCount = 0;
public static bool IsRunning
{
get
{
if (session != null)
{
return true;
}
else
{
return false;
}
}
}
public static async Task<ExtendedExecutionResult> RequestSessionAsync(ExtendedExecutionReason reason, TypedEventHandler<object, ExtendedExecutionRevokedEventArgs> revoked, String description)
{
// The previous Extended Execution must be closed before a new one can be requested.
ClearSession();
var newSession = new ExtendedExecutionSession();
newSession.Reason = reason;
newSession.Description = description;
newSession.Revoked += SessionRevoked;
// Add a revoked handler provided by the app in order to clean up an operation that had to be halted prematurely
if(revoked != null)
{
newSession.Revoked += revoked;
}
ExtendedExecutionResult result = await newSession.RequestExtensionAsync();
switch (result)
{
case ExtendedExecutionResult.Allowed:
session = newSession;
break;
default:
case ExtendedExecutionResult.Denied:
newSession.Dispose();
break;
}
return result;
}
public static void ClearSession()
{
if (session != null)
{
session.Dispose();
session = null;
}
taskCount = 0;
}
public static Deferral GetExecutionDeferral()
{
if (session == null)
{
throw new InvalidOperationException("No extended execution session is active");
}
taskCount++;
return new Deferral(OnTaskCompleted);
}
private static void OnTaskCompleted()
{
if (taskCount > 0)
{
taskCount--;
}
//If there are no more running tasks than end the extended lifetime by clearing the session
if (taskCount == 0 && session != null)
{
ClearSession();
}
}
private static void SessionRevoked(object sender, ExtendedExecutionRevokedEventArgs args)
{
//The session has been prematurely revoked due to system constraints, ensure the session is disposed
if (session != null)
{
session.Dispose();
session = null;
}
taskCount = 0;
}
}
Sicherstellen, dass Ihre App Ressourcen gut verwendet
Die Optimierung des Speichers und der Energienutzung Ihrer App ist entscheidend, um sicherzustellen, dass das Betriebssystem die Ausführung ihrer App weiterhin ermöglicht, wenn sie nicht mehr die Vordergrund-App ist. Verwenden Sie die Speicherverwaltungs-APIs , um zu sehen, wie viel Arbeitsspeicher Ihre App verwendet. Je mehr Arbeitsspeicher Ihre App verwendet, desto schwieriger ist es für das Betriebssystem, die App weiter auszuführen, wenn sich eine andere App im Vordergrund befindet. Der Benutzer hat letztendlich die Kontrolle über alle Hintergrundaktivitäten, die Ihre App ausführen kann, und hat die Sichtbarkeit der Auswirkungen, die Ihre App auf die Akkunutzung hat.
Verwenden Sie BackgroundExecutionManager.RequestAccessAsync , um festzustellen, ob der Benutzer entschieden hat, dass die Hintergrundaktivität Ihrer App eingeschränkt sein soll. Achten Sie auf die Akkunutzung, und führen Sie sie nur im Hintergrund aus, wenn eine aktion ausgeführt werden muss, die der Benutzer möchte.
Siehe auch
Beispiel für erweiterte Ausführung
Anwendungslebenszyklus
App-Lebenszyklus – Apps mit Hintergrundaufgaben und erweitertem Ausführungshintergrundspeicherverwaltungaktiv halten
Hintergrundübertragungen
Akkubewusstsein und Hintergrundaktivität
MemoryManager-Klasse
Wiedergeben von Medien im Hintergrund