Dieser Artikel ist Tag #3 der Serie 31 Tage Mango von Jeff Blankenburg.
Der Originalartikel befindet sich hier: Day #3: Alarms and Reminders.
Heute diskutieren wir, wie wir Alarme und Erinnerungen auf dem Gerät eines Benutzers setzen können. Erinnerungen können komplett von der Anwendung verwaltet werden, d.h. wir können Erinnerungen nach Bedarf erstellen, bearbeiten und löschen.
Wie Erinnerungen funktionieren
Erinnerungen auf Windows Phone sind ein Weg, den Benutzer an eine zu erledigende Aufgabe zu erinnern. Offensichtliche Anwendungsfälle für Erinnerungen sind Wecker, Kalender, oder eine To-Do Liste. Erinnerungen können jedoch für eine Vielzahl von Anwendungen verwendet werden — beispielsweise um den Benutzer zu erinnern, zu Ihrer Anwendung zurückzukehren. Hier ist ein Beispiel für eine Erinnerung, die Sie auf dem Telefon des Benutzers auslösen können:
Wie man eine Erinnerung erstellt
Eine Erinnerung zu erstellen ist relativ einfach. Man erstellt ein Objekt vom Typ Reminder, setzt die Eigenschaften um das gewünschte Verhalten zu erlangen und fügt es dem auf dem Telefon laufenden ScheduledActionService hinzu. Unten ist der komplette Quellcode für eine voll funktionsfähige Erinnerung (und zwar die oben in dem Screenshot). Nach dem gesamten Code gehen wir auf die einzelnen Details ein. Bitte beachten Sie, dass ich im Quellcode oben ein zusätzliches using Statement hinzugefügt habe: Microsoft.Phone.Scheduler.
using System; using Microsoft.Phone.Controls; using Microsoft.Phone.Scheduler; namespace Day3_Reminders { public partial class MainPage : PhoneApplicationPage { // Constructor public MainPage() { InitializeComponent(); Reminder r = new Reminder("testreminder"); r.Title = "A Special Reminder"; r.Content = "Jeff Blankenburg's Reminder"; r.NavigationUri = new Uri("/ReminderPage.xaml", UriKind.Relative); r.BeginTime = DateTime.Now.AddSeconds(15); r.ExpirationTime = DateTime.Now.AddDays(7); r.RecurrenceType = RecurrenceInterval.Daily; ScheduledActionService.Add(r); } } }
Die Erinnerung benennen
Zunächst ist es erforderlich, dem Reminder einen Namen zu geben. Im obigen Beispiel heißt er einfach „testreminder“. Jeder Reminder (und jeder Alarm, siehe weiter unten) muss einen Namen haben. Dieser Name kann benutzt werden, um Reminders später zu verwalten. Der Name eines Reminders/Alarms muss eindeutig sein — berücksichtigen Sie das, wenn Sie Ihre Anwendung entwickeln. Wenn der Name keine Rolle spielt und Sie später nicht mehr auf den Reminder zugreifen müssen, können Sie z.B. einen einfachen Zeitstempel als Namen verwenden. Dadurch sollte jedes Mal ein eindeutiger Name sichergestellt sein.
App Name, Title und Content
Durch diese Werte kann man bestimmen, welche Nachricht in der Benachrichtigung an den Benutzer angezeigt werden soll. Im unten stehenden Screenshot habe ich jedes der Textfelder entsprechend markiert.
Wie Sie sehen, können wir nicht beeinflussen wie der Text dargestellt wird. Wir bekommen aber genügend Platz um eine Nachricht darzustellen. Wenn der Benutzer auf irgendeinen Bereich der Benachrichtigung tippt, haben wir über die Eigenschaft NavigationUri die Möglichkeit, ihn wieder in die Anwendung zu bringen.
NavigationUri
Die NavigationUri ist ein relativer Pfad zu einer Seite Ihrer Anwendung. Im obigen Codebeispiel schicken wir den Benutzer zur ReminderPage.xaml. Dieses Konzept wird auch „deep linking“ genannt. Sie werden es in vielen der neuen APIs für Windows Phone 7.5 finden. Die Möglichkeit, eine bestimmte Seite der Anwendung zu starten wird sich als sehr nützlich erweisen — sowohl für den Benutzer als auch für Sie. Ich empfehle Ihnen wärmstens, von dieser Fähigkeit Gebrauch zu machen.
BeginTime, ExpirationTime und RecurrenceType
BeginTime ist offensichtlich eine sehr wichtige Eigenschaft, da hiermit bestimmt wird, wann die Erinnerung auf dem Gerät des Benutzers gestartet wird. Man übergibt hier einen DateTime Wert, genau wie bei ExpirationTime. Der Wert ExpirationTime ist nicht zwingend erforderlich — er wird relevant und nützlich, wenn wir wiederholende Erinnerungen realisieren. Vielleicht wollen Sie Ihren Anwender jeden Tag um 13:00 Uhr daran erinnern, seinen Blutzucker zu überprüfen, dies jedoch nur für eine Woche. In diesem Fall würden Sie ExpirationTime auf eine Woche nach Beginn festlegen und den RecurrenceType = RecurrenceInterval.Daily setzen. Dadurch wird die selbe Erinnerung jeden Tag an den Benutzer geschickt. Um mehrere Erinnerungen pro Tag zu realisieren, können Sie mehrere unterschiedliche Reminder Objekte erstellen. Dies führt uns zur nächsten Herausforderung: wie verwaltet man all die unterschiedlichen Erinnerungen?
Bestehende Erinnerungen verwalten
Eine Erinnerung zu erstellen ist einfach. Viele existierende Erinnerungen zu verwalten kann aber schnell kompliziert werden. Wenn Sie den Beispielcode oben verwendet haben, sind sie möglicherweise einer InvalidOperationException begegnet, die besagt, dass der betreffende Reminder bereits existiert. Darum ist es bei der Erstellung eines Reminders sehr wichtig zu prüfen, ob Sie diesen nicht bereits angelegt haben. Hierzu können wir nach einem bekannten Reminder-Namen suchen und ihn gegebenenfalls löschen. Der unten stehende Code ist genau der selbe wie oben mit dem Unterschied, dass geprüft wird, ob der Reminder bereits existiert. Wenn ja, wird er gelöscht.
using System; using Microsoft.Phone.Controls; using Microsoft.Phone.Scheduler; namespace Day3_Reminders { public partial class MainPage : PhoneApplicationPage { // Constructor public MainPage() { InitializeComponent(); if (ScheduledActionService.Find("testreminder") != null) ScheduledActionService.Remove("testreminder"); Reminder r = new Reminder("testreminder"); r.Title = "A Special Reminder"; r.Content = "Jeff Blankenburg's Reminder"; r.NavigationUri = new Uri("/ReminderPage.xaml", UriKind.Relative); r.BeginTime = DateTime.Now.AddSeconds(15); r.ExpirationTime = DateTime.Now.AddDays(7); r.RecurrenceType = RecurrenceInterval.Daily; ScheduledActionService.Add(r); } } }
Die Möglichkeit, spezielle Erinnerungen und Alarme zu finden, ist sehr nützlich wenn Sie einen zuvor erstellten Reminder bearbeiten oder ändern müssen. Um einen Reminder zu bearbeiten können Sie die Find() Methode verwenden um eine Referenz auf das Reminder Objekt zu bekommen. Mit der Replace() Methode können Sie einen aktualisierten Reminder speichern. Der folgende Code illustriert das:
if (ScheduledActionService.Find("testreminder") != null) { Reminder r = ScheduledActionService.Find("testreminder") as Reminder; r.Title = "This has been edited."; r.Content = "This is updated content."; r.BeginTime = DateTime.Now.AddSeconds(15); ScheduledActionService.Replace(r); }
Wie man einen Alarm erstellt
Alarme sind fast identisch zu Erinnerungen. Es gibt allerdings kleine aber entscheidende Unterschiede: Alarme haben keine Title Eigenschaft und Alarme können keine NavigationUri festlegen. Alarme können hingegen einen selbstdefinierten Ton abspielen, etwas, das Reminder nicht können. Abgesehen von diesen Unterschieden sind Alarme und Erinnerungen identisch. Wir verwalten Sie auf die selbe Art und Weise (mittels des ScheduledActionService), indem wir Alarme je nach Bedarf hinzufügen, modifizieren und löschen. Hier ist etwas Beispielcode, um einen Alarm zu erstellen. Dabei greifen wir im Wesentlichen auf das Wissen über Reminders zurück:
if (ScheduledActionService.Find("testalarm") != null) ScheduledActionService.Remove("testalarm"); Alarm a = new Alarm("testalarm"); a.Content = "Jeff Blankenburg's Alarm"; a.Sound = new Uri("button-8.mp3", UriKind.Relative); a.BeginTime = DateTime.Now.AddSeconds(15); a.ExpirationTime = DateTime.Now.AddDays(7); a.RecurrenceType = RecurrenceInterval.Daily; ScheduledActionService.Add(a);
Wie Sie sehen, ist sogar die Syntax identisch zu der Erstellung eines Reminders. Bei der Eigenschaft Sound referenziere ich eine MP3 Datei, die ich meinem Projekt hinzugefügt habe. Wie man Audio-Dateien zum Projekt hinzufügen kann und diese z.B. bei einem Klick-Event abspielt, ist in Day #20 of my 31 Days of Silverlight beschrieben. Lesen Sie diesen Artikel, wenn Sie mehr Infomationen darüber benötigen.
Zusammenfassung
Erinnerungen und Alarme sind eine großartige Möglichkeit, den Benutzer über eine anstehende Aufgabe zu informieren. Auch wenn sie sich stark ähneln, sollten Sie in Erinnerung behalten, dass Reminders Ihnen erlauben, ein Link zurück in die Anwendung — sogar zu einer speziellen Seite — festzulegen. Dies ist eine effektive Möglichkeit, den Benutzer wieder in Ihre Anwendung zurückzuholen. Für den Benutzer ist es gleichzeitig eine hervorragende Möglichkeit, schnell zu den Informationen zu kommen, die für ihn gerade wichtig sind.
Um eine komplett lauffähige Anwendung mit dem ganzen Code dieses Artikels zu sehen, klicken Sie auf das „Download Code“ Symbol unten.
Morgen werde ich Ihnen einen mit Mango neu verfügbar gewordenen Sensor vorstellen: den Kompass. Ich werde ihnen sogar zeigen, wie er von Magneten beeinflusst werden kann. Bis dahin!