Georg fährt extra nach Berlin um Steve Ballmer zu treffen

31 Tage Mango | Tag #25: Background Agents

Dieser Artikel ist Tag #25 der Serie 31 Tage Mango von Jeff Blankenburg.

Der Originalartikel befindet sich hier: Day #25: Background Agents.

Dieser Artikel wurde in der Originalserie von Gastautor Gary Johnson geschrieben. Bei Twitter kann Gary unter @GaryGJohnson erreicht werden.

Heute schauen wir uns eine der Fähigkeiten zum Multitasking in Windows Phone 7.5 an. Das Gesamtbild zum Multitasking besteht aus mehreren neuen Features:

  • Background Agents
  • Background File Transfer
  • Background Audio Playback
  • Scheduled Notifications
  • Fast Application Switching

Heute wollen wir Background Agents näher beleuchten. Während die Dateiübertragung im Hintergrund und das Spielen von Audio im Hintergrund spezielle Szenarien gut abdecken, kann man mit diesen Aktivitäten keinen eigenen Code ausführen. Hier kommen Background Agents ins Spiel.

Es gibt zwei verschiedene Arten von Background Agents: Periodic (periodisch ausgeführt) und Resource Intensive (ressourcenhungrig). Ressourcenhungrige Huntergrundaufgaben sind gedacht für Aktivitäten, die einen großen Verbrauch an Systemressourcen haben. Für diese Hintergrundaufgaben gibt es einige Beschränkungen hinsichtlich des Ausführungszeitpunkts. Periodische Hintergrundaufgaben laufen öfter und mit weniger Einschränkungen. Sie sind aber nur geeignet für Aktivitäten, die sehr leichtgewichtig sind. Um die Vor- und Nachteile der beiden Arten zu verstehen, empfehle ich Ihnen diesen MSDN Artikel.

Eine periodische Hintergrundaufgabe führt eine sehr kurz dauernde und unaufwändige Aktivität aus, wie zum Beispiel einen RSS Feed herunterzuladen oder den Live Tile aktualisieren. Eine ressourcenintensive Hintergrundaufgabe macht etwas, das länger dauert und viel Bandbreite verbraucht, wie zum Beispiel Synchronisierung oder Zwischenspeicherung großer Datenmengen eines Cloud Dienstes.

Wir werden heute eine periodische Hintergrundaufgabe bauen, die auf dem Live Tile die Uhrzeit der letzten Ausführung anzeigt.

Erste Schritte

Starten Sie das Visual Studio und erstellen Sie ein neues Projekt. Wählen Sie Windows Phone Application aus Silverlight for Windows Phone. Nennen Sie die Anwendung „MyAgentApp“.

Unsere Hauptanwendung wird für zwei Dinge zuständig sein.

  1. Sie hat einen Live Tile, den der Background Agent mit Informationen aktualisieren kann.
  2. Sie wird den Background Agent starten und anhalten.

Der Background Agent wird in seinem eigenen speziellen Projekt leben. Fügen Sie ein neues Projekt zu Ihrer Solution hinzu und wählen Sie hierfür die Vorlage Windows Phone Scheduled Task Agent. Nennen Sie das Projekt MyAgent. Dieses Projekt wird den Code enthalten, der von der Hintergrundaufgabe ausgeführt wird und unseren Live Tile aktualisiert.

Damit die Hauptanwendung die Hintergrundaufgabe auch kennt, fügen wir im Projekt MyAgentApp eine Projektreferenz auf das Projekt MyAgent hinzu. Damit können wir die Hintergrundaufgabe aus unserer Anwendung registrieren. Beachten Sie auch, dass hierbei ein Eintrag in der Datei WMAppManifest.xml erstellt wird:

<Tasks> 
   <DefaultTask Name="_default" NavigationPage="MainPage.xaml" /> 
   <ExtendedTask Name="BackgroundTask"> 
      <BackgroundServiceAgent Specifier="ScheduledTaskAgent" Name="MyAgent" Source="MyAgent" Type="MyAgent.ScheduledAgent" /> 
   </ExtendedTask> 
</Tasks> 

Erstellung der Anwendung

Jetzt werden wir alles entsprechend verkabeln. Öffnen Sie die MainPage.xaml und fügen Sie zwei Buttons hinzu – einen, um den Agenten zu starten und einen, um ihn anzuhalten:

<StackPanel VerticalAlignment="Center"> 
   <Button Content="Start Background Agent" 
      Click="StartButton_Click"/> 
   <Button Content="Stop Background Agent" 
      Click="StopButton_Click"/>  
</StackPanel> 

In der MainPage.xaml.cs verdrahten wir die Buttons zum Starten und Anhalten der Hintergrundaufgabe:

private const string TASK_NAME = "MyAgent"; 

private void StartButton_Click(object sender, RoutedEventArgs e) 
{ 
    StartAgent(); 
} 

private void StopButton_Click(object sender, RoutedEventArgs e) 
{ 
    StopAgentIfStarted(); 
} 

private void StartAgent() 
{ 
    StopAgentIfStarted(); 

    PeriodicTask task = new PeriodicTask(TASK_NAME); 
    task.Description = "This is our custom agent for Day 25 - Background Agents"; 
    ScheduledActionService.Add(task); 
#if DEBUG 
    // If we're debugging, attempt to start the task immediately 
    ScheduledActionService.LaunchForTest(TASK_NAME, new TimeSpan(0, 0, 1)); 
#endif 
} 

private void StopAgentIfStarted() 
{ 
    if (ScheduledActionService.Find(TASK_NAME) != null) 
    { 
        ScheduledActionService.Remove(TASK_NAME); 
    } 
} 

Beachten Sie, dass wir zur Erstellung der Hintergrundaufgabe einen neuen PeriodicTask anlegen. Wir nutzen den Namen der Hintergrundaufgabe als Identifikator, wenn wir die Aufgabe starten oder anhalten wollen. Beachten Sie weiterhin, dass wir eine PeriodicTask.Description angegeben haben. Dies ist ein erforderliches Feld und wird im Handy unter Einstellungen > Hintergrundaufgaben unter dem Namen Ihrer Anwendung angezeigt.

Erstellung der Hintergrundaufgabe

Im Projekt MyAgent öffnen Sie die Datei ScheduledAgent.cs und fügen Sie den folgenden Code hinzu:

protected override void OnInvoke(ScheduledTask task) 
{ 
   UpdateAppTile(GetLastUpdatedTimeMessage()); 
} 

private string GetLastUpdatedTimeMessage() 
{ 
   return string.Format("Last Updated: {0}", DateTime.Now); 
} 

private void UpdateAppTile(string message) 
{ 
   ShellTile appTile = ShellTile.ActiveTiles.First(); 
   if (appTile != null) 
   { 
      StandardTileData tileData = new StandardTileData 
      { 
         BackContent = message 
      }; 

      appTile.Update(tileData); 
   } 
} 

Der ScheduledAgent hat eine wichtige Methode, die überladen werden muss – OnInvoke. An dieser Stelle wird die Hintergrundaufgabe ihre Aktion ausführen. Sobald die Aktion erfolgreich abgeschlossen wurde und die Hintergrundaufgabe nicht mehr laufen muss, können Sie NotifyComplete() aufrufen. Wenn Sie die Aktion abbrechen wollen, rufen Sie Abort() auf um zu signalisieren, dass Sie die Hintergrundaufgabe abbrechen. Um die Hintergrundaufgabe weiterhin periodisch auszuführen, rufen sie einfach keine der beiden Methoden – genau das machen wir in unserem Fall.

Die Anwendung ausführen

Die Anwendung ist jetzt bereit zur Ausführung. Installieren Sie die Anwendung im Emulator oder auf einem Gerät und führen Sie sie aus. Klicken Sie den Button zum Starten der Hintergrundaufgabe. Verlassen Sie die Anwendung und suchen Sie sie in der Anwendungsliste. Drücken und halten Sie die Anwendung und wählen Sie „Auf Startseite“. Wenn Sie die Kachel der Anwendung eine Weile betrachten, sollte diese sich irgendwann umdrehen und den Zeitpunkt der letzten Aktualisierung anzeigen.

Zusammenfassung

So, heute haben wir unsere eigene Hintergrundaufgabe zur Aktualisierung des Live Tiles erstellt. Wenn Sie selber Hintergrundaufgaben erstellen, denken Sie an das folgende:

  • Hintergrundaufgaben erlauben Ihnen die Ausführung von Code auch wenn die Anwendung selbst nicht läuft.
  • Es gibt zwei Arten von Hintergrundaufgaben – periodische und ressourcenintensive.
  • Periodische Aufgaben sind für Aktivitäten, die wenig Ressourcen verbrauchen. Für diese Aufgaben gibt es weniger Beschränkungen als für ressourcenintensive Aufgaben.
  • Hintergrundaufgaben brauchen ihr eigenes Projekt. Dieses sollte per Projektreferenz dem Anwendungsprojekt bekannt gemacht werden, welches die Hintergrundaufgabe startet.
  • In der Hintergrundaufgabe müssen Sie OnInvoke() überladen.
  • Wenn die Hintergrundaufgabe abgeschlossen wurde, müssen Sie NotifyComplete() oder Abort() aufrufen.

Um ein komplettes Windows Phone Projekt mit dem Code von oben herunterzuladen, klicken Sie auf den Download Code Button unten:

Morgen schauen wir uns mit Background File Transfer ein weiteres Multitasking-Feature an. Damit können wir Dateien hoch- und herunterladen, auch wenn die Anwendung nicht läuft.

Bis dahin!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.