Лабораторный практикум 4
Лабораторная работа №16. Фоновая служба
Задание
Создать приложение Windows Phone 7, запускающее фоновую службу, которая при активации меняет тайлы приложения.
Освоение
- фоновые службы
- тайлы (изображения, отображающиеся на главной странице)
Описание
Создадим новый проект Silverlight for Windows Phone – Windows Phone Application. Разметка главной страницы будет состоять из 2 кнопок при нажатии на которые мы будем запускать и останавливать фоновую службу:
<!--ContentPanel - place additional content here--> <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"> <StackPanel> <TextBlock Text="Служба для периодической смены тайлов приложения." FontSize="26" Height="460" TextWrapping="Wrap" /> <Button Name="btnSvcStart" Content="Запустить службу" Click="btnSvcStart_Click" /> <Button Name="btnSvcStop" Content="Остановить службу" Click="btnSvcStop_Click" /> </StackPanel> </Grid>
Добавим в решение (solution) новый проект Silverlight for Windows Phone – Windows Phone Scheduled Task Agent.
В наш основной проект добавим ссылку на проект службы: Add Reference… – Projects - <имя проекта службы>. Также добавим несколько изображений размера 173x173 (для тайлов). Назовем их, например, "Tile01.png", "Tile02.png", …, "Tile05.png". Установим для данных изображений свойство "Build Action" в "Content".
Примечание: тайлы – это изображения, отображающиеся на главной странице Windows Phone 7. Они могут иметь пояснительные надписи и обратную сторону – другое изображение, которое будет периодически появляться. Для того чтобы добавить тайл приложения на главную страницу, в списке приложений нажмите на ваше приложение и удерживайте. В появившемся контекстном меню выберете "pin to start" Рис. 5.1 :
В проекте службы в методе OnInvoke() будем задавать логику работы службы – смену изображения для тайла приложения. Для определения текущего номера будем пользоваться изолированным хранилищем (либо можно определять тайл случайным образом).
protected override void OnInvoke(ScheduledTask task) { //TODO: Add code to perform your task in background int nTileNumber = 0; if (IsIsolatedStorageExist()) { string strTileNum = LoadFromIsolatedStorage(); nTileNumber = int.Parse(strTileNum); } const int MAX_TILE_NUMBER = 5; nTileNumber++; if (nTileNumber > MAX_TILE_NUMBER) nTileNumber = 1; string strTileName = "/Tiles/Tile0" + nTileNumber.ToString() + ".png"; SetTile(strTileName); SaveToIsolatedStorage(nTileNumber.ToString()); #if DEBUG ScheduledActionService.LaunchForTest(task.Name, System.TimeSpan.FromSeconds(10)); #endif NotifyComplete(); } private void SetTile(string strPath) { ShellTile apptile = ShellTile.ActiveTiles.First(); StandardTileData appTileData = new StandardTileData(); appTileData.Title = "Служба"; appTileData.Count = 0; appTileData.BackgroundImage = new Uri(strPath, UriKind.RelativeOrAbsolute); apptile.Update(appTileData); }
Для работы данного кода необходимо добавить следующие директивы:
using System; using System.Linq; using Microsoft.Phone.Shell;
Конструкция
#if DEBUG ScheduledActionService.LaunchForTest(task.Name, System.TimeSpan.FromSeconds(10)); #endif
позволяет в отладочном режиме вызывать службу каждые 10 секунд.
Вернемся к основному проекту. Объявим в классе константу с именем службы:
private const string AGENT_NAME = "Agent_Wp7IUSLab22";
Для работы со службами добавим директиву:
using Microsoft.Phone.Scheduler;
При запуске службы сначала будем проверять, существует ли служба с таким именем (если существует – будем удалять), а затем будем запускать ее. При остановке будем удалять ее и очищать изолированное хранилище.
private void btnSvcStart_Click(object sender, RoutedEventArgs e) { //ищем службу PeriodicTask myPeriodicTask = ScheduledActionService.Find(AGENT_NAME) as PeriodicTask; //если нашли if (myPeriodicTask != null) { try { //удаляем ScheduledActionService.Remove(AGENT_NAME); } catch (Exception ex) { MessageBox.Show("Невозможно удалить ранее созданную службу: " + ex.Message); } } //создаем службу myPeriodicTask = new PeriodicTask(AGENT_NAME); myPeriodicTask.Description = "Служба для периодической смены тайлов приложения."; try { ScheduledActionService.Add(myPeriodicTask); #if DEBUG ScheduledActionService.LaunchForTest(AGENT_NAME, TimeSpan.FromSeconds(5)); #endif MessageBox.Show("Служба запущена."); } catch (Exception ex) { MessageBox.Show("Невозможно создать службу: " + ex.Message); } } private void btnSvcStop_Click(object sender, RoutedEventArgs e) { //ищем службу PeriodicTask myPeriodicTask = ScheduledActionService.Find(AGENT_NAME) as PeriodicTask; //если нашли if (myPeriodicTask != null) { try { //удаляем ScheduledActionService.Remove(AGENT_NAME); RemoveIsolatedStorage(); MessageBox.Show("Служба остановлена."); } catch (Exception ex) { MessageBox.Show("Невозможно удалить службу: " + ex.Message); } } }