UWP Micro Apps und große Downloads

Seit geraumer Zeit forsche ich an der Idee von Micro Apps. Wie weit lassen sich Anwendungen in App’s und Services aufteilen? Wie tauschen diese Daten aus? Wie sehen typische Anwendungsfälle aus?et

So gut wie jede native App hat heute ala E.T. das Bedürfnis nach Hause zu telefonieren. Das Medium ist unbestritten das Weball. Der Kommunikator für den C# oder VB.NET Developer der HTTPClient.

Wenn nun die Daten aber größer sind, ein Video mit den 10jährgen Elliot zum Beispiel. Die Übertragung wird gestartet, die Verbindungsqualität schwankt. Will man als außerirdischer während dessen einem Fortschrittsbalken zusehen? Nein will man nicht, man wechselt die App und checkt die Fussballergebnisse vom Heimatplanten. Fire and forget.

Genau das und noch viel mehr findet sich in der API von Windows 10. Ein Background Downloader, der den Download auch ausführt wenn die App vom Benutzer gestoppt wird. Schlicht weil das Betriebssystem sich drum kümmert. Es kümmert sich auch um Verbindungsabbrüche oder um kostenpflichtige Verbindungen. Alles wie geschaffen um eine höhere Granularität zu erreichen.

Eine weitere App kann die empfangene Datei behandeln und z.B. in eine Playlist aufnehmen. Dazu lässt sich eine Art FileSystemWatcher nutzen, der in der WinRT API mit dem ContentsChanged Event abgebildet ist. Eine neue Datei im Filesystem füllt so eine laufende App.

Windows 10 kann allerdings noch mehr. Über Trigger können Apps gestartet werden und dort Logik abgearbeitet werden. Eine derartige gestaltete App benötigt allerdings zwei Projekt in einer Visual Studio Solution. Das erste ist die Universal Windows Plattform UWP App. Das zweite eine Klasse die unabhängig von der UI laufen kann. Das Kurztutorial zeigt die nötigen Schritte.

In der Projektmappe (Solution) wird ein neues Projekt vom Typ Component für Windows Runtime hinzugefügt. Der Name in diesem Beispiel lautet Task1 (um Verwechselungen zu vermeiden)

image

Um das Projekt im UWP Projekt nutzen zu können muss ein Verweis darauf erstellt werden.

Rechtsklick auf Verweise, Verweis Hinzufügen, Reiter Projektmapppe –Task1 auswählen

image

Das Rechtesystem von UWP Apps unterscheidet sich erheblich von Desktop Anwendungen. Einzelne Fähigkeiten (Capabilitys) müssen im Projekt hinzugefügt werden. Dies geschieht über das Manifest.

Doppelklick auf die Datei package.appxmanifest.

image

BackgroundTasks aus Deklarationen hinzufügen.

Ein BackgroundTask kann auf verschiedene Ereignisse (Trigger) reagieren. Hier wird ein Systemereignis genutzt (download finished) und eine Klassenname angegeben der als Einsprungs Punkt dient.

image

Dese Klasse muss das Interface IBackGroundTask implementieren. Das Interface wiederum definiert die Run Methode. In dieser Demo wird  über einen Helperklasse eine Toast Notification dem Benutz präsentiert.

   1:  Public NotInheritable Class CompletionGroupTask
   2:      Implements IBackgroundTask
   3:      Public Sub Run(taskInstance As IBackgroundTaskInstance) Implements IBackgroundTask.Run
   4:          Dim details As BackgroundTransferCompletionGroupTriggerDetails =
   5:   TryCast(taskInstance.TriggerDetails, BackgroundTransferCompletionGroupTriggerDetails)
   6:          If details Is Nothing Then
   7:              Return
   8:          End If
   9:   
  10:          InvokeSimpleToast(1, 1)
  11:  End Sub

 

Nun fehlt noch der Code der den Download auslöst. Im ersten Block wird eine Trasnfergruppe gebildet, es könnten auch mehrere Downloads darin enthalten sein. Zeile 7 definiert den Speichertort. Die Datei hat dabei solange die Größe 0 solange der Download nicht komplett abgeschlossen ist. Begonnen wird die Gruppe ab Register und Beendet mit Enable in Zeile 20

Zusätzlich kann die App, sollte sie doch noch laufen, auch auf den Abschluss des Download in einem eigenen Event definiert in Ziel 19 reagieren.

   1:  Dim completionGroup = New BackgroundTransferCompletionGroup()
   2:  Dim builder As New BackgroundTaskBuilder()
   3:  builder.SetTrigger(completionGroup.Trigger)
   4:  builder.TaskEntryPoint = "Tasks1.CompletionGroupTask"
   5:   
   6:  Dim saveFile = Await ApplicationData.Current.LocalFolder.CreateFileAsync(
   7:                      "datei.png",
   8:                      CreationCollisionOption.ReplaceExisting)
   9:   
  10:  Dim downloadProcessingTask As BackgroundTaskRegistration = builder.Register()
  11:   
  12:  Dim downloader As New BackgroundDownloader(completionGroup)
  13:  Dim download As DownloadOperation =
  14:              downloader.CreateDownload(
  15:              New Uri("http://download.ppedv.de/videos/....png"), saveFile)
  16:   
  17:  Dim startTask As Task(Of DownloadOperation) =
  18:              download.StartAsync().AsTask()
  19:  startTask.ContinueWith(AddressOf ForegroundCompletionHandler)
  20:  downloader.CompletionGroup.Enable()

 

Der Taskmanager zeigt, das eine Prozess Daten kontinuierlich empfängt.

dowloader1

Kommentare sind geschlossen