Опубликован: 11.01.2013 | Уровень: специалист | Доступ: платный
Лекция 5:

Лабораторный практикум 4

< Лекция 4 || Лекция 5: 12345 || Лекция 6 >
Аннотация: Лабораторные работы: фоновая служба, фоновая загрузка файлов, проигрыватель музыки, список задач с напоминаниями, будильник.

Лабораторная работа №16. Фоновая служба

Задание

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

Освоение

  • фоновые службы
  • тайлы (изображения, отображающиеся на главной странице)

Описание

Создадим новый проект Silverlight for Windows PhoneWindows 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 PhoneWindows 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 :

Отображение тайла приложения на главной странице

Рис. 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);
                }
            }
        }
< Лекция 4 || Лекция 5: 12345 || Лекция 6 >
Алексей Верещагин
Алексей Верещагин
Россия, г. Санкт-Петербург
Евгений Бабенко
Евгений Бабенко
Украина, Таврийск