Обновление живой плитки из фоновой задачиUpdate a live tile from a background task

Важные APIImportant APIs

Используйте фоновую задачу для обновления живой плитки вашего приложения свежим содержимым.Use a background task to update your app's live tile with fresh content.

Ниже представлено видео, демонстрирующее, как добавлять живые плитки в приложения.Here's a video that shows how to add live tiles to your apps.

Создание проекта фоновых задачCreate the background task project

Чтобы включить динамическую плитку для приложения, добавьте в решение новый проект среда выполнения Windows компонента.To enable a live tile for your app, add a new Windows Runtime component project to your solution. Это отдельная сборка, которую операционная система загружает и запускает в фоновом режиме, когда пользователь устанавливает ваше приложение.This is a separate assembly that the OS loads and runs in the background when a user installs your app.

  1. В обозревателе решений щелкните правой кнопкой мыши проект, выберите пункт Добавить, а затем щелкните Новый проект.In Solution Explorer, right-click the solution, click Add, and then click New Project.
  2. В диалоговом окне Добавление нового проекта выберите шаблон Компонент среды выполнения Windows в разделе Установленные > Другие языки > Visual C# > Windows Universal.In the Add New Project dialog, select the Windows Runtime Component template in the Installed > Other Languages > Visual C# > Windows Universal section.
  3. Назовите проект "BackgroundTasks" и нажмите кнопку ОК или коснитесь ее.Name the project BackgroundTasks and click or tap OK. Microsoft Visual Studio добавит новый проект в решение.Microsoft Visual Studio adds the new project to the solution.
  4. В основном проекте добавьте ссылку на проект BackgroundTasks.In the main project, add a reference to the BackgroundTasks project.

Реализация фоновой задачиImplement the background task

Реализуйте интерфейс IBackgroundTask, чтобы создать класс, который обновляет живую плитку вашего приложения.Implement the IBackgroundTask interface to create a class that updates your app's live tile. Фоновая работа осуществляется в методе Запустить.Your background work goes in the Run method. В этом случае задача получает канал синдикации для блогов MSDN.In this case, the task gets a syndication feed for the MSDN blogs. Чтобы задача преждевременно не закрылась, пока выполняется асинхронный код, получите отсрочку.To prevent the task from closing prematurely while asynchronous code is still running, get a deferral.

  1. В обозревателе решений переименуйте автоматически генерируемый файл, Class1.cs, в BlogFeedBackgroundTask.cs.In Solution Explorer, rename the automatically generated file, Class1.cs, to BlogFeedBackgroundTask.cs.
  2. В BlogFeedBackgroundTask.cs замените автоматически генерируемый код кодом заглушки для класса BlogFeedBackgroundTask.In BlogFeedBackgroundTask.cs, replace the automatically generated code with the stub code for the BlogFeedBackgroundTask class.
  3. В реализации метода Run (Запустить) добавьте код для методов GetMSDNBlogFeed и UpdateTile.In the Run method implementation, add code for the GetMSDNBlogFeed and UpdateTile methods.
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";
    }
}

Настройка манифеста пакетаSet up the package manifest

Чтобы настроить манифест пакета, откройте его и добавьте новую декларацию фоновой задачи.To set up the package manifest, open it and add a new background task declaration. Установите точку входа для задачи на имя класса, включая ее пространство имен.Set the entry point for the task to the class name, including its namespace.

  1. В средстве "Обозреватель решений" откройте файл Package.appxmanifest.In Solution Explorer, open Package.appxmanifest.
  2. Щелкните вкладку Declarations (Декларации) или коснитесь ее.Click or tap the Declarations tab.
  3. В списке Available Declarations (Доступные декларации) выберите BackgroundTasks и щелкните Add (Добавить).Under Available Declarations, select BackgroundTasks and click Add. Visual Studio добавит BackgroundTasks в раздел Supported Declarations (Поддерживаемые декларации).Visual Studio adds BackgroundTasks under Supported Declarations.
  4. В списке Supported task types (Поддерживаемые типы задач) убедитесь, что установлен флажок Timer (Таймер).Under Supported task types, ensure that Timer is checked.
  5. В разделе App settings (Параметры приложений) установите точку входа на BackgroundTasks.BlogFeedBackgroundTask.Under App settings, set the entry point to BackgroundTasks.BlogFeedBackgroundTask.
  6. Щелкните вкладку Application UI (Пользовательский интерфейс приложения) или коснитесь ее.Click or tap the Application UI tab.
  7. Установите для параметра Lock screen notifications (Уведомления экрана блокировки) значение Badge and Tile Text (Индикатор событий и текст плитки).Set Lock screen notifications to Badge and Tile Text.
  8. Укажите путь к значку размером 24x24 пикселя в поле Badge logo (Индикатор событий).Set a path to a 24x24 pixel icon in the Badge logo field. Важно!    Этот значок должен использовать только монохромные и прозрачные пиксели.Important  This icon must use monochrome and transparent pixels only.
  9. В поле Small logo (Мелкий значок) укажите путь к значку размером 30x30 пикселей.In the Small logo field, set a path to a 30x30 pixel icon.
  10. В поле Wide logo (Широкий значок) укажите путь к значку размером 310x150 пикселей.In the Wide logo field, set a path to a 310x150 pixel icon.

Регистрация фоновой задачиRegister the background task

Создайте BackgroundTaskBuilder, чтобы зарегистрировать свою задачу.Create a BackgroundTaskBuilder to register your task.

Примечание    . Начиная с Windows 8.1 Параметры регистрации фоновой задачи проверяются во время регистрации.Note  Starting in Windows 8.1, background task registration parameters are validated at the time of registration. Если какие-либо из параметров регистрации недопустимы, возвращается ошибка.An error is returned if any of the registration parameters are invalid. Если фоновая задача не прошла регистрацию, приложение должно выполнить соответствующее действие — например, применить условный оператор для проверки наличия ошибок регистрации и затем повторить попытку регистрации с другими значениями параметров.Your app must be able to handle scenarios where background task registration fails - for example, use a conditional statement to check for registration errors and then retry failed registration using different parameter values.  

На главной странице приложения добавьте метод RegisterBackgroundTask и вызовите его в обработчике событий OnNavigatedTo.In your app's main page, add the RegisterBackgroundTask method and call it in the OnNavigatedTo event handler.

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";
    }
}

Отладка фоновой задачиDebug the background task

Чтобы отладить фоновую задачу, установите точку останова в методе Run задачи.To debug the background task, set a breakpoint in the task’s Run method. На панели инструментов Место отладки выберите свою фоновую задачу.In the Debug Location toolbar, select your background task. В результате система вызовет метод Run немедленно.This causes the system to call the Run method immediately.

  1. Установите точку останова в методе Run задачи.Set a breakpoint in the task’s Run method.
  2. Нажмите клавишу F5 или выберите элемент Debug > Start Debugging (Отладка > Начать отладку), чтобы развернуть и запустить приложение.Press F5 or tap Debug > Start Debugging to deploy and run the app.
  3. После запуска приложения переключитесь снова на Visual Studio.After the app launches, switch back to Visual Studio.
  4. Убедитесь, что панель инструментов Debug Location (Место отладки) видна.Ensure that the Debug Location toolbar is visible. Она находится в меню Вид > Панели инструментов.It's on the View > Toolbars menu.
  5. На панели инструментов Debug Location (Место отладки) щелкните раскрывающийся список Suspend (Приостановить) и выберите BlogFeedBackgroundTask.On the Debug Location toolbar, click the Suspend dropdown and select BlogFeedBackgroundTask.
  6. Visual Studio приостановит выполнение в точке останова.Visual Studio suspends execution at the breakpoint.
  7. Нажмите клавишу F5 или выберите элемент Debug > Continue (Отладка > Продолжить), чтобы продолжить выполнение приложения.Press F5 or tap Debug > Continue to continue running the app.
  8. Для остановки отладки нажмите клавиши SHIFT+F5 или выберите элемент Debug > Stop Debugging (Отладка > Остановить отладку).Press Shift+F5 or tap Debug > Stop Debugging to stop debugging.
  9. Вернитесь к плитке приложения на начальном экране.Return to the app's tile on the Start screen. Через несколько секунд на плитке вашего приложения появится уведомление.After a few seconds, tile notifications appear on your app's tile.