Обновление живой плитки из фоновой задачи
Важные API
Используйте фоновую задачу для обновления живой плитки вашего приложения свежим содержимым.
Ниже представлено видео, демонстрирующее, как добавлять живые плитки в приложения.
Создание проекта фоновых задач
Чтобы включить динамическую плитку для приложения, добавьте в решение новый проект компонента среда выполнения Windows. Это отдельная сборка, которую операционная система загружает и запускает в фоновом режиме, когда пользователь устанавливает ваше приложение.
- В обозревателе решений щелкните правой кнопкой мыши проект, выберите пункт Добавить, а затем щелкните Новый проект.
- В диалоговом окне Добавление нового проекта выберите шаблон Компонент среды выполнения Windows в разделе Установленные > Другие языки > Visual C# > Windows Universal.
- Назовите проект "BackgroundTasks" и нажмите кнопку ОК или коснитесь ее. Microsoft Visual Studio добавит новый проект в решение.
- В основном проекте добавьте ссылку на проект BackgroundTasks.
Реализация фоновой задачи
Реализуйте интерфейс IBackgroundTask, чтобы создать класс, который обновляет живую плитку вашего приложения. Фоновая работа осуществляется в методе Запустить. В этом случае задача получает канал синдикации для блогов MSDN. Чтобы задача преждевременно не закрылась, пока выполняется асинхронный код, получите отсрочку.
- В обозревателе решений переименуйте автоматически генерируемый файл, Class1.cs, в BlogFeedBackgroundTask.cs.
- В BlogFeedBackgroundTask.cs замените автоматически генерируемый код кодом заглушки для класса BlogFeedBackgroundTask.
- В реализации метода Run (Запустить) добавьте код для методов GetMSDNBlogFeed и UpdateTile.
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
// Added during quickstart
using Windows.ApplicationModel.Background;
using Windows.Data.Xml.Dom;
using Windows.UI.Notifications;
using Windows.Web.Syndication;
namespace BackgroundTasks
{
public sealed class BlogFeedBackgroundTask : IBackgroundTask
{
public async void Run( IBackgroundTaskInstance taskInstance )
{
// Get a deferral, to prevent the task from closing prematurely
// while asynchronous code is still running.
BackgroundTaskDeferral deferral = taskInstance.GetDeferral();
// Download the feed.
var feed = await GetMSDNBlogFeed();
// Update the live tile with the feed items.
UpdateTile( feed );
// Inform the system that the task is finished.
deferral.Complete();
}
private static async Task<SyndicationFeed> GetMSDNBlogFeed()
{
SyndicationFeed feed = null;
try
{
// Create a syndication client that downloads the feed.
SyndicationClient client = new SyndicationClient();
client.BypassCacheOnRetrieve = true;
client.SetRequestHeader( customHeaderName, customHeaderValue );
// Download the feed.
feed = await client.RetrieveFeedAsync( new Uri( feedUrl ) );
}
catch( Exception ex )
{
Debug.WriteLine( ex.ToString() );
}
return feed;
}
private static void UpdateTile( SyndicationFeed feed )
{
// Create a tile update manager for the specified syndication feed.
var updater = TileUpdateManager.CreateTileUpdaterForApplication();
updater.EnableNotificationQueue( true );
updater.Clear();
// Keep track of the number feed items that get tile notifications.
int itemCount = 0;
// Create a tile notification for each feed item.
foreach( var item in feed.Items )
{
XmlDocument tileXml = TileUpdateManager.GetTemplateContent( TileTemplateType.TileWide310x150Text03 );
var title = item.Title;
string titleText = title.Text == null ? String.Empty : title.Text;
tileXml.GetElementsByTagName( textElementName )[0].InnerText = titleText;
// Create a new tile notification.
updater.Update( new TileNotification( tileXml ) );
// Don't create more than 5 notifications.
if( itemCount++ > 5 ) break;
}
}
// Although most HTTP servers do not require User-Agent header, others will reject the request or return
// a different response if this header is missing. Use SetRequestHeader() to add custom headers.
static string customHeaderName = "User-Agent";
static string customHeaderValue = "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0)";
static string textElementName = "text";
static string feedUrl = @"http://blogs.msdn.com/b/MainFeed.aspx?Type=BlogsOnly";
}
}
Настройка манифеста пакета
Чтобы настроить манифест пакета, откройте его и добавьте новую декларацию фоновой задачи. Установите точку входа для задачи на имя класса, включая ее пространство имен.
- В средстве "Обозреватель решений" откройте файл Package.appxmanifest.
- Щелкните вкладку Declarations (Декларации) или коснитесь ее.
- В списке Available Declarations (Доступные декларации) выберите BackgroundTasks и щелкните Add (Добавить). Visual Studio добавит BackgroundTasks в раздел Supported Declarations (Поддерживаемые декларации).
- В списке Supported task types (Поддерживаемые типы задач) убедитесь, что установлен флажок Timer (Таймер).
- В разделе App settings (Параметры приложений) установите точку входа на BackgroundTasks.BlogFeedBackgroundTask.
- Щелкните вкладку Application UI (Пользовательский интерфейс приложения) или коснитесь ее.
- Установите для параметра Lock screen notifications (Уведомления экрана блокировки) значение Badge and Tile Text (Индикатор событий и текст плитки).
- Укажите путь к значку размером 24x24 пикселя в поле Badge logo (Индикатор событий). Важно Этот значок должен использовать только монохромные и прозрачные пиксели.
- В поле Small logo (Мелкий значок) укажите путь к значку размером 30x30 пикселей.
- В поле Wide logo (Широкий значок) укажите путь к значку размером 310x150 пикселей.
Регистрация фоновой задачи
Создайте BackgroundTaskBuilder, чтобы зарегистрировать свою задачу.
Примечание Начиная с Windows 8.1, параметры регистрации фоновой задачи проверяются во время регистрации. Если какие-либо из параметров регистрации недопустимы, возвращается ошибка. Если фоновая задача не прошла регистрацию, приложение должно выполнить соответствующее действие — например, применить условный оператор для проверки наличия ошибок регистрации и затем повторить попытку регистрации с другими значениями параметров.
На главной странице приложения добавьте метод RegisterBackgroundTask и вызовите его в обработчике событий OnNavigatedTo.
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using Windows.ApplicationModel.Background;
using Windows.Data.Xml.Dom;
using Windows.Foundation;
using Windows.Foundation.Collections;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Controls.Primitives;
using Windows.UI.Xaml.Data;
using Windows.UI.Xaml.Input;
using Windows.UI.Xaml.Media;
using Windows.UI.Xaml.Navigation;
using Windows.Web.Syndication;
// The Blank Page item template is documented at https://go.microsoft.com/fwlink/p/?LinkID=234238
namespace ContosoApp
{
/// <summary>
/// An empty page that can be used on its own or navigated to within a Frame.
/// </summary>
public sealed partial class MainPage : Page
{
public MainPage()
{
this.InitializeComponent();
}
/// <summary>
/// Invoked when this page is about to be displayed in a Frame.
/// </summary>
/// <param name="e">Event data that describes how this page was reached. The Parameter
/// property is typically used to configure the page.</param>
protected override void OnNavigatedTo( NavigationEventArgs e )
{
this.RegisterBackgroundTask();
}
private async void RegisterBackgroundTask()
{
var backgroundAccessStatus = await BackgroundExecutionManager.RequestAccessAsync();
if( backgroundAccessStatus == BackgroundAccessStatus.AllowedSubjectToSystemPolicy ||
backgroundAccessStatus == BackgroundAccessStatus.AlwaysAllowed )
{
foreach( var task in BackgroundTaskRegistration.AllTasks )
{
if( task.Value.Name == taskName )
{
task.Value.Unregister( true );
}
}
BackgroundTaskBuilder taskBuilder = new BackgroundTaskBuilder();
taskBuilder.Name = taskName;
taskBuilder.TaskEntryPoint = taskEntryPoint;
taskBuilder.SetTrigger( new TimeTrigger( 15, false ) );
var registration = taskBuilder.Register();
}
}
private const string taskName = "BlogFeedBackgroundTask";
private const string taskEntryPoint = "BackgroundTasks.BlogFeedBackgroundTask";
}
}
Отладка фоновой задачи
Чтобы отладить фоновую задачу, установите точку останова в методе Run задачи. На панели инструментов Место отладки выберите свою фоновую задачу. В результате система вызовет метод Run немедленно.
- Установите точку останова в методе Run задачи.
- Нажмите клавишу F5 или выберите элемент Debug > Start Debugging (Отладка > Начать отладку), чтобы развернуть и запустить приложение.
- После запуска приложения переключитесь снова на Visual Studio.
- Убедитесь, что панель инструментов Debug Location (Место отладки) видна. Она находится в меню Вид > Панели инструментов.
- На панели инструментов Debug Location (Место отладки) щелкните раскрывающийся список Suspend (Приостановить) и выберите BlogFeedBackgroundTask.
- Visual Studio приостановит выполнение в точке останова.
- Нажмите клавишу F5 или выберите элемент Debug > Continue (Отладка > Продолжить), чтобы продолжить выполнение приложения.
- Для остановки отладки нажмите клавиши SHIFT+F5 или выберите элемент Debug > Stop Debugging (Отладка > Остановить отладку).
- Вернитесь к плитке приложения на начальном экране. Через несколько секунд на плитке вашего приложения появится уведомление.
Связанные темы
- BackgroundTaskBuilder
- TileUpdateManager
- TileNotification
- Поддержка приложения с помощью фоновых задач
- Руководство и контрольный список по плиткам и индикаторам событий
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по