Лабораторный практикум 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);
}
}
}
