Статьи

Windows Phone: напоминание в глубине

В этой статье я расскажу, как создать напоминание в Windows Phone. Я также углублюсь в некоторые другие аспекты функции напоминания в Windows Phone.

Давайте создадим простое напоминание. Я буду использовать таймер выбора, чтобы установить напоминание и активировать его. Timepicker доступен в Silverlight Windows Phone Toolkit

Загрузить  Silverlight Windows Phone Toolkit

Шаг 1: Создайте Silverlight для проекта Windows Phone.

Шаг 2: Добавьте ссылку на Microsoft.Phone.Controls.Toolkit.dll
Шаг 3: Добавьте пространство имен Microsoft.Phone.Controls.Toolkit в MainPage.xaml.

xmlns:toolkit="clr- namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone.Controls.Toolkit"

Шаг 4: Добавьте элемент управления Timepicker в сетку MainPage.xaml. У него есть timePicker_ValueChanged, который сработает при изменении времени.

 

<toolkit:TimePicker Header="Start Time" x:Name="timePicker" Margin="0,250,0,0" Width="450" HorizontalAlignment="Left" ValueChanged="timePicker_ValueChanged"/>

Шаг 5: Добавьте директиву Microsoft.Phone.Scheduler.

 

using Microsoft.Phone.Scheduler;

Шаг 6: В коде MainPage.xaml добавьте метод timePicker_ValueChanged.

 

 

private void timePicker_ValueChanged(object sender, EventArgs args)
{
   string reminderName = Guid.NewGuid().ToString();
   Reminder reminder = new Reminder(reminderName);
   reminder.Title = "My Reminder";
   DateTime date = DateTime.Today;
   DateTime beginTime = date + ((DateTime)timePicker.Value).TimeOfDay;
   reminder.BeginTime = beginTime;
   
   //reminder.ExpirationTime = date.AddHours(20);
   
   reminder.RecurrenceType = RecurrenceInterval.Daily;
   ScheduledActionService.Add(reminder);
}

Мы можем использовать Guid для генерации случайного имени напоминания. Время начала напоминания можно установить с помощью DateTime.Today и значения, выбранного в таймере.

Мы можем установить RecurrenceType, используя перечисление RecurrenceInterval.

Варианты enum:

 

Нет = 0: повторений нет. Уведомление запускается один раз в указанное Microsoft.Phone.Scheduler.ScheduledAction.BeginTime время.

Ежедневно = 1: ежедневное повторение

Еженедельно = 2: еженедельное повторение

Ежемесячно = 3: ежемесячное повторение

EndOfMonth = 4: повторяется в конце каждого месяца

Ежегодно = 5: ежегодное повторение

Примечание. Если BeginTime превышен более чем на 4 часа, напоминание не будет запущено.

Шаг 7: Теперь оберните вышеуказанный код, который повторяется 50 раз, как показано ниже.

private void timePicker_ValueChanged(object sender, EventArgs args)
{
   for (int i = 0; i < 50; i++)
   {
      string reminderName = Guid.NewGuid().ToString();
      Reminder reminder = new Reminder(reminderName);
      reminder.Title = "My Reminder";

      DateTime date = DateTime.Today;
      DateTime beginTime = date + ((DateTime)timePicker.Value).TimeOfDay;
      reminder.BeginTime = beginTime;

      //reminder.ExpirationTime = date.AddHours(20);
      reminder.RecurrenceType = RecurrenceInterval.Daily;
      ScheduledActionService.Add(reminder);
   }
}

Шаг 8: Удалите это приложение с эмулятора или устройства, если вы уже его запустили. Теперь запустите программу снова с 50 циклами и установите напоминание. Это будет работать нормально. Теперь снова запустите эмулятор, и вы заметите, что InvalidOperationException не обрабатывается, как показано ниже.

Ошибка BNS: максимальное количество запланированных действий этого типа уже добавлено.

Шаг 9: Теперь удалите приложение с 50 циклами, увеличьте количество циклов до 51 и снова запустите приложение.

Вы получите ту же ошибку выше.

Итак, вывод заключается в том, что в Windows Phone существует ограничение в 50 активных напоминаний на приложение. После добавления напоминания в ScheduledActionService оно остается в приложении до тех пор, пока вы его не удалите.

Как указано выше, напоминание перестанет работать, как только вы достигнете порога 50.

Чтобы напоминание работало N раз, перед установкой нового напоминания необходимо удалить предыдущие напоминания из ScheduledAction.

Шаг 10: Добавьте директиву System.IO.IsolatedStorage.

using System.IO.IsolatedStorage;

Шаг 11: Сохраните имя напоминания в IsolatedStorage. Удалите имя напоминания из ScheduledActionSerive перед добавлением нового.

 

IsolatedStorageSettings settings = IsolatedStorageSettings.ApplicationSettings;
string strReminder;
if (settings.TryGetValue<string>("Reminder", out strReminder))
{
   ScheduledActionService.Remove(strReminder);
}

string reminderName = Guid.NewGuid().ToString();
settings["Reminder"] = reminderName;

Теперь можно установить напоминание N раз.

На этом статья о напоминании в Windows Phone заканчивается.