In seinem Beitrag Lebenszyklusverwaltung und dynamische Apps beschrieb Adam Barrus den in Windows 8 neu eingeführten App-Lebenszyklus. Die am häufigsten gestellte Frage ist: „Auf welche Weise werden von meiner App wichtige Aufgaben wie z. B. das Herunterladen von Dateien und E-Mails oder das Abspielen von Musikdateien ausgeführt, während sie nicht angezeigt wird?“ In dieser zweiteiligen Reihe werde ich die verschiedenen Aktivitäten beschreiben, die eine App im Hintergrund ausführen kann, und zeige Ihnen einige Codebeispiele, die diese Szenarien unterstützen.

Windows 8-Hintergrundmodell

Eine effiziente Akkuleistung war beim Entwurf von Windows 8 und seinem App-Modell von grundlegender Bedeutung. In Pat Stemens Beitrag im Blog „Die Entwicklung von Windows 8“ wird ausführlich erklärt, warum dies beim Entwurf von Windows 8 eine wichtige Rolle spielt. Außerdem werden dort einige Techniken beschrieben, die wir in das System integriert haben, um eine längere Akkulaufzeit zu erzielen. Sie können sich sicher vorstellen, dass die Akkulaufzeit eines Geräts maßgeblich durch die Apps beeinflusst wird, die auf diesem ausgeführt werden. Wir haben den Windows 8 App-Lebenszyklus daher für eine maximale Akkulaufzeit entwickelt. Dies bedeutet jedoch nicht, dass das App-Modell Hintergrundaktivitäten ausschließt. In diesem Beitrag werden von Windows 8 unterstützte Hintergrundszenarien erläutert. Weitere Informationen hierzu finden Sie im Beitrag von Ben Srour und Sharif Farag Verbessern der Energieeffizienz für Anwendungen im Blog „Die Entwicklung von Windows 8“.

Im Kontext der Entwicklung von Windows 8 haben wir die typischen Szenarien identifiziert, die Apps im Hintergrund ausführen müssen, und APIs hinzugefügt, die dies auf eine energieeffiziente Art und Weise leisten. Dies sind die Szenarien, die von Windows 8 unterstützt werden (siehe auch den Beitrag „Verbessern der Energieeffizienz“):

Szenario

Beschreibung

Download/Upload im Hintergrund

Apps können die Hintergrundübertragungs-API verwenden, um Uploads oder Downloads im Hintergrund auszuführen. Uploads und Downloads werden dann vom Betriebssystem selbst ausgeführt, sodass sich App-Code erübrigt und die Akkulaufzeit verbessert werden kann.

Audio im Hintergrund

Musik sollten auf jeden Fall im Hintergrund wiedergegeben werden können. Jede Medien- oder Kommunikations-App kann Audio im Hintergrund wiedergeben. Die App wird angehalten, wenn der Benutzer die Audiowiedergabe unterbricht, um die System- und Energieeffizienz zu maximieren.

Freigabe

Wenn Ihre App gerade Inhalte mithilfe des Charms „Teilen“ an einen Clouddienst sendet, wird dieser Vorgang im Hintergrund abgeschlossen. Weitere Informationen über die Datenübertragung während eines Freigabevorgangs finden Sie unter Entwicklungscenter.

Gerätesynchronisierung

Sie können Inhalte zwischen einem angeschlossenen Gerät (z. B. einer Kamera) und Ihrem PC auch dann synchronisieren, wenn die App nicht angezeigt wird.

Live-Kacheln

Apps können durch Senden von Pushbenachrichtigungen an Ihren Windows 8-PC die neuesten Inhalte auf Kacheln anzeigen (selbst wenn sie angehalten wurden). Weitere Informationen finden Sie im Beitrag Erstellen einer benutzerfreundlichen Kachel.

Geplante Benachrichtigungen

Apps können zu bestimmten Zeitpunkten über Ereignisse informieren, indem entweder eine Kachel aktualisiert wird (z. B. bei Terminen im Kalender) oder über ein Benachrichtigungs-Popup. Diese Ereignisse werden durch die App geplant, Windows stellt jedoch die Benachrichtigung bereit, sodass der Akku nur minimal belastet wird. Weitere Informationen finden Sie im Entwicklungscenter.

Hintergrundaufgaben

Unter Windows 8 können Sie Hintergrundaufgaben erstellen, um es einer angehaltenen App zu ermöglichen, bei Bedarf eigenen Code auszuführen. Diese Hintergrundaufgaben werden als Reaktion auf äußere Auslöser ausgeführt (z. B. Zeit- oder Systemereignisse oder eingehende Pushbenachrichtigungen) und unterliegen Ressourceneinschränkungen, um Energie zu sparen. Sie werden häufig von E-Mail-, VoIP- oder Sofortnachrichten-Apps verwendet. Diese Apps können Daten bei Akkubetrieb im Hintergrund oder im Verbindungsstandbymodus synchronisieren. Sie werden im nächsten Beitrag dieser Reihe beschrieben.

Ich werde nun beschreiben, wie übliche Szenarien in Apps im Metro-Stil implementiert werden. Außerdem werden technische Details dieser Features und einige ihrer Vorteile erläutert.

Dies ist eine Liste der in dieser Reihe beschriebenen Szenarien. Die ersten zwei Szenarien werden in diesem Beitrag beschrieben, die anderen beiden im nächsten.

  • Download/Upload im Hintergrund
  • Audio im Hintergrund
  • Hintergrundaufgaben – Arbeiten im Hintergrund, wenn das Gerät mit Wechselstrom betrieben wird
  • Hintergrundaufgaben – Herunterladen von E-Mails im 15-Minuten-Takt von einem POP3-Mailserver

Ich werden Ihnen nun anhand des Codes erläutern, wie einfach dies in Windows 8 ausgeführt werden kann. Der hier verwendete Code dient nur als Beispiel. Einige Aspekte wie z. B. die Fehlerbehandlung werden von diesem Codebeispiel nicht abgedeckt.

Download/Upload im Hintergrund

Übertragen von Inhalten (wie z. B. Hochladen von Fotos, Herunterladen von Videos oder Musik) ist ein häufiges Szenario für viele Apps. Der BackgroundTransfer-Namespace bietet eine einfache und vielseitige API, die zur Datenübertragung im Vorder- und Hintergrund verwendet werden kann. Die API erledigt zahlreiche lästige Aufgaben für Sie, sodass Sie sich ganz auf die Hauptfunktionen der App konzentrieren können. Sie ist energieeffizient und vermeidet Netzwerkfehler sowie -kosten. Sehen wir uns ein spezifisches Beispiel an: das Herunterladen einer Datei unter Verwendung von BackgroundTransfer.

BackgroundDownloader ist die Hauptklasse, mit der Sie die meisten Upload- und Download-Szenarien bewältigen können. Das folgende Beispiel demonstriert das Erstellen eines neuen DownloadOperation-Objekts unter Verwendung der BackgroundDownloader-Klasse, die eine Quell-URI und Zieldatei aufnimmt. Nachdem der Download konfiguriert wurde, wird HandleDownloadAsync aufgerufen, um den Download zu starten. Im JavaScript-Beispiel starten wir den Download inline, ohne eine andere Funktion aufzurufen.

JavaScript

function downloadFile(uri, destinationFile) 
{
// Create a new download operation.
download = downloader.createDownload(uri, newFile);
// Start the download and persist the promise to be able to cancel the download.
promise = download.startAsync().then(complete, error, progress);
}
                

C#

private async void DownloadFile(Uri source, StorageFile destinationFile)
{
BackgroundDownloader downloader = new BackgroundDownloader();
DownloadOperation download = downloader.CreateDownload(source, destinationFile);

// Attach progress and completion handlers.
await HandleDownloadAsync(download, true);
}
             

Dieses Codebeispiel zeigt das Anfügen von Handlern an eine neue DownloadOperation, bevor StartAsync zum tatsächlichen Starten des Downloads aufgerufen wird. Die gleiche Methode wird auch zum erneuten Anfügen der Handler durch Aufruf von AttachAsync beim Aufzählen von Downloadvorgängen verwendet, wie im Folgenden dargestellt.

C#

private async Task HandleDownloadAsync(DownloadOperation download, bool start)
{
// Create progress callback
Progress<DownloadOperation> progressCallback = new Progress<DownloadOperation>(DownloadProgress);
// Create cancellation token
CancellationTokenSource cts = new CancellationTokenSource();

if (start)
{
// Start the download and attach a progress handler.
await download.StartAsync().AsTask(cts.Token, progressCallback);
}
else
{
// The download was scheduled in a previous session, re-attach the progress handler.
await download.AttachAsync().AsTask(cts.Token, progressCallback);
}
}


Nachdem eine App einen Downloadvorgang im Hintergrund startet, wird dieser fortgesetzt, auch wenn die App angehalten wird. Beim Fortsetzen der App erhalten Sie Fortschritts- und Vollständigkeits-Callbacks für diese Downloadvorgänge. Wenn die App nach dem Anhalten beendet wird, werden durch das Aufzählen der Downloadvorgänge zuvor in der Warteschlange im Hintergrund befindliche Downloads neu gestartet. Die nächsten Codebeispielen zeigen, wie Downloadvorgänge in C# und JavaScript aufgezählt werden.

C#

// Enumerate downloads that were running in the background before the app was closed.
private async Task DiscoverActiveDownloadsAsync()
{
activeDownloads = new List<DownloadOperation>();

// Get all current download operations
IReadOnlyList<DownloadOperation> downloads = await BackgroundDownloader.GetCurrentDownloadsAsync();

if (downloads.Count > 0)
{
List<Task> tasks = new List<Task>();
foreach (DownloadOperation download in downloads)
{
// Attach progress and completion handlers.
tasks.Add(HandleDownloadAsync(download, false));
}

await Task.WhenAll(tasks);
}
}
               
JavaScript
function discoverActiveDownloads() 
{
// Enumerate outstanding downloads.
Windows.Networking.BackgroundTransfer.BackgroundDownloader.getCurrentDownloadsAsync().done
(function (downloads) {
// If downloads from previous app state exist, reassign callbacks and persist to global array.
for (var i = 0; i < downloads.size; i++) {
download[i].attachAsync().then(complete, error, progress);
}
}
}

Download- und Uploadvorgänge unterliegen den gleichen Ressourceneinschränkungen wie andere Hintergrundaufgaben, wie im nächsten Beitrag dieser Reihe erläutert. Weitere Informationen zu BackgroundTransfer finden Sie in der Übersicht zum Übertragen von Daten im Hintergrund, unter API-Namespace und im Beispiel zu Hintergrundübertragungsdownloads. Sie können sich auch die //BUILD/-Sitzung Soziale Apps und Verbindungen mit HTTP-Diensten ansehen.

Audio im Hintergrund

Unter Windows 8 können problemlos leistungseffiziente Apps entwickelt werden, die Audio im Hintergrund wiedergeben. Windows 8 stellt Steuerelemente auf Systemebene zur Verfügung, die mithilfe von Streamkategorisierungen und Medientransportsteuerelementen die Benutzerfreundlichkeit innerhalb der MediaControl-Klasse verbessern. In diesem Abschnitt betrachten wir, wie eine App Audio im Hintergrund wiedergibt. Die Details bezüglich der tatsächlichen Audiowiedergabe oder der Mediensteuerungsklassen werden behandelt. Weitere Informationen zu Audiotechnologien finden Sie im Whitepaper Audiowiedergabe in einer App im Metro-Stil.

Eine App muss drei wichtige Voraussetzungen erfüllen, um Audio im Hintergrund wiederzugeben:

  • Das App-Manifest muss eine Deklaration für Hintergrundaudio beinhalten.
  • Die Streamkategorie (msAudioCategory) muss entweder auf Communications oder BackgroundCapableMedia festgelegt sein.
  • Die App muss für Medientransportsteuerelemente registriert werden.

Zum Hinzufügen der Deklaration für Hintergrundaudio öffnen Sie einfach das App-Manifest in Visual Studio. Wählen Sie auf der Registerkarte Deklarationen im entsprechenden Dropdownmenü Hintergrundaufgaben aus und fügen dies dem Manifest hinzu. Wählen Sie unter „Unterstützte Aufgabentypen“ die Option Audio aus, und geben Sie die Startseite der JavaScript-App bzw. den Einstiegspunkt an, wenn die App auf C#, C++ oder VB basiert.

Manifestdeklarationen in Visual Studio

Die einfachste Methode zur Wiedergabe von Audio in einer App stellt das HTML5-Element <audio> dar. Durch das Hinzufügen eines msAudioCategory-Attributs im <audio>-Element kann die Systemleistung optimiert und so die Benutzerfreundlichkeit der Audiokomponente der App verbessert werden. Falls möglich, kann hierdurch der Wiedergabemechanismen bei geringem Stromverbrauch eingesetzt werden, sodass bestimmte Sounds abgespielt werden, wenn sich die App im Hintergrund befindet. In anderen Fällen können die Lautstärke verringert oder bestimmte Töne stummgeschaltet werden, um andere Sounds klar wiederzugeben.

Im folgenden HTML-Beispielcode wird Audio wiedergegeben und die Audiokategorie ordnungsgemäß festgelegt.

<audio msAudioCategory="BackgroundCapableMedia" controls="controls"> 
<source src="song.mp3"/>
</audio>

Dieser JavaScript-Code bietet die gleiche Funktionalität. Das msAudioCategory-Attribut muss vor dem Quellelement festgelegt werden, da die Audiokategorie andernfalls vom System nicht erkannt wird.

JavaScript
function PlayAudio () 
{
// Create new audio tag for "BackgroundCapableMedia" class
if(!audtag)
{
audtag = document.createElement('audio');
audtag.setAttribute("id", "audtag");
audtag.setAttribute("controls", "true");
audtag.setAttribute("msAudioCategory", "backgroundcapablemedia");
audtag.setAttribute("src", "song.mp3");
document.getElementById("scenario1Output").appendChild(audtag);
audtag.load();
}
}
        

In diesem C#-Codebeispiel wird die Audiokategorie auf einen Ausgabeaudiostream festgelegt. Die SelectFile-Funktion wird zum Auswählen einer Datei mithilfe von FileOpenPicker verwendet. Anschließend legen Sie die AudioCategory des ausgewählten Streams durch Aufrufen von SetAudioCategory fest.

C#
public async void SelectFile()
{
// Choose file using the picker
Windows.Storage.Pickers.FileOpenPicker picker = new Windows.Storage.Pickers.FileOpenPicker();
picker.SuggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.MusicLibrary;

// Add a filter so only mp3 files are displayed
picker.FileTypeFilter.Add(".mp3");
Windows.Storage.StorageFile file = await picker.PickSingleFileAsync();
if (file != null)
{
var stream = await file.OpenAsync(Windows.Storage.FileAccessMode.Read);
OutputMedia.AutoPlay = false;

// Run on the UI thread because it updates UI controls
await cw.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
{
OutputMedia.SetSource(stream, file.ContentType);
});
}
}

// Set the audio category on the output stream
public void SetAudioCategory(AudioCategory category)
{
OutputMedia.AudioCategory = category;
}
      

Die folgenden beiden Audiokategorien sind hintergrundfähig (d. h. Apps können damit Audio im Hintergrund wiedergeben): BackgroundCapableMedia und Communications. Wählen Sie je nach Typ des abgespielten Audiostreams die geeignete Audiokategorie aus, damit vom System die optimalen Leistungsmerkmale für den Audiostream ermittelt werden können.

Audiostreamtyp

Beschreibung

BackgroundCapableMedia

Für Audio, das im Hintergrund kontinuierlich wiedergegeben werden soll. Beispiele:

· Wiedergabe lokaler Medien:

· Lokale Wiedergabeliste

· Streamingradio

· Streamingwiedergabeliste

· Musikvideos

· Audio-/Radiostreams, YouTube, Netflix usw.

Communications

Für Audiostreamingkommunikation wie:

· Telefonieren über Internet (Voice over IP, VoIP)

· Echtzeitchat oder andere Arten von Telefonanrufen

Eine Windows 8-App im Metro-Stil wird im Vollbildmodus angezeigt. Wenn sich ein Benutzer der App also Musik im Hintergrund anhört, kann diese ohne die Registrierung der Transportsteuerelemente nicht direkt ausgeschaltet werden. Die Transportsteuerelemente des Systems werden auf dem Bildschirm angezeigt, wenn sie für die App registriert wurden und der Benutzer eine der Hardwarelautstärketasten drückt. Weitere Informationen zum Hinzufügen von Medientransportsteuerelementen zu Apps im Metro-Stil finden Sie im Entwicklerhandbuch für Systemtransportsteuerelemente.

Das war's. Ihre App kann nun Audio im Hintergrund wiedergeben, ohne angehalten zu werden. Da die App jedoch beim Abspielen von Hintergrundaudio aktiv bleibt, müssen Sie dafür sorgen, dass die Systemleistung und die Akkulaufzeit nicht beeinträchtigt werden. Sobald die Audiowiedergabe der App beendet wird, hält Windows diese an. Ausführliche Informationen hierzu finden Sie im Whitepaper Audiowiedergabe in einer App im Metro-Stil.

Zusammenfassung

Hiermit sind wir am Ende des ersten Teils unserer Reihe zu effizienten Hintergrundvorgängen angelangt. In diesem Beitrag haben Sie erfahren, wie Audio im Hintergrund wiedergegeben und Uploads oder Downloads im Hintergrund ausgeführt werden können, während eine App angehalten ist. Im nächsten Teil können Sie sich über das Schreiben von eigenem Code für Hintergrundfunktionen bei angehaltenen Apps mithilfe von Hintergrundaufgaben informieren.

– Hari Pulapaka
    Program Manager, Windows

Ressourcen

Link

Typ

Highlights

Übertragen von Daten im Hintergrund

Schnellstart

Konzeptdokumentation zur Hintergrundübertragung

API-Namespace

API-Dokumentation

API-Namespace zur Hintergrundübertragung

Beispiel für Hintergrundübertragungsdownloads

Beispielprojekt

Beispiel-App zur Verwendung der Hintergrundübertragungs-API

Soziale Apps und Verbindungen mit HTTP-Diensten

//BUILD/-Sitzung

//BUILD/-Sitzung zum Erstellen verbundener Apps

Audiowiedergabe in einer App im Metro-Stil

Whitepaper

Whitepaper zur Wiedergabe von Audio im Hintergrund

Entwicklerhandbuch für Systemtransportsteuerelemente

Whitepaper

Whitepaper zur Verwendung von Medientransportsteuerelementen beim Entwickeln von Musik-Apps

API-Namespace

API-Dokumentation

Grundlegende Medienunterstützungs-APIs