Поделиться через


Обновление живой плитки из фоновой задачи

Примечание.

Плитки жизни — это функция Windows 10, которая не поддерживается в более поздних версиях Windows. Для новых приложений рекомендуется следовать текущим рекомендациям по значкам приложений.

Используйте фоновую задачу для обновления динамической плитки приложения с свежим содержимым.

Важные API

Создание проекта фоновой задачи

Чтобы включить динамическую плитку для приложения, добавьте в решение новый проект компонента среда выполнения Windows. Это отдельная сборка, которая загружает и запускает ОС в фоновом режиме при установке приложения пользователем.

  1. В обозревателе решений щелкните правой кнопкой мыши проект, выберите пункт Добавить, а затем щелкните Новый проект.
  2. В диалоговом окне "Добавление нового проекта" выберите шаблон компонента среда выполнения Windows в разделе "Установленные > другие языки > Visual C# > Windows Universal".
  3. Назовите проект BackgroundTasks и нажмите кнопку "ОК". Microsoft Visual Studio добавляет новый проект в решение.
  4. В основном проекте добавьте ссылку на проект BackgroundTasks.

Реализация фоновой задачи

Реализуйте интерфейс IBackgroundTask, чтобы создать класс, который обновляет динамическую плитку приложения. Фоновая работа выполняется в методе Run. В этом случае задача получает веб-канал синдикации для блогов MSDN. Чтобы предотвратить преждевременное закрытие задачи во время выполнения асинхронного кода, получите отсрочку.

  1. В Обозреватель решений переименуйте автоматически созданный файл Class1.cs в BlogFeedBackgroundTask.cs.
  2. В BlogFeedBackgroundTask.cs замените автоматически созданный код заглушки для класса BlogFeedBackgroundTask .
  3. В реализации метода 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";
    }
}

Настройка манифеста пакета

Чтобы настроить манифест пакета, откройте его и добавьте новое объявление фоновой задачи. Задайте точку входа для задачи имя класса, включая его пространство имен.

  1. В Обозреватель решений откройте Package.appxmanifest.
  2. Щелкните или коснитесь вкладки "Объявления".
  3. В разделе "Доступные объявления" выберите BackgroundTasks и нажмите кнопку "Добавить". Visual Studio добавляет backgroundTasks в поддерживаемые объявления.
  4. В разделе "Поддерживаемые типы задач" убедитесь, что таймер установлен.
  5. В разделе "Параметры приложения" задайте для точки входа значение BackgroundTasks.BlogFeedBackgroundTask.
  6. Щелкните или коснитесь вкладки пользовательского интерфейса приложения.
  7. Задайте для уведомлений на экране блокировки значок и текст плитки.
  8. Задайте путь к значку 24x24 пикселей в поле логотипа эмблемы. Важно, что этот значок должен использовать только монохромные и прозрачные пиксели.
  9. В поле "Маленький логотип" задайте путь к значку пикселя 30x30.
  10. В поле "Широкий логотип" задайте путь к значку пикселя 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.

  1. Задайте точку останова в методе выполнения задачи.
  2. Нажмите клавишу F5 или коснитесь кнопки Отладка запуска отладки>, чтобы развернуть и запустить приложение.
  3. После запуска приложения вернитесь в Visual Studio.
  4. Убедитесь, что панель инструментов "Расположение отладки" отображается. Он находится в меню "Просмотр > панелей инструментов".
  5. На панели инструментов "Расположение отладки" щелкните раскрывающийся список "Приостановить" и выберите BlogFeedBackgroundTask.
  6. Visual Studio приостанавливает выполнение в точке останова.
  7. Нажмите клавишу F5 или нажмите кнопку "Продолжить отладку > " , чтобы продолжить работу приложения.
  8. Нажмите клавиши SHIFT+F5 или коснитесь кнопки Отладка отладки отладки > , чтобы остановить отладку.
  9. Вернитесь к плитке приложения на начальном экране. Через несколько секунд на плитке приложения отображаются уведомления об плитке приложения.