バックグラウンド タスクのライブ タイルの更新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. このプロジェクトは個別のアセンブリです。ユーザーがアプリをインストールするとき、OS ではこのプロジェクトがバックグラウンドで読み込まれ、実行されます。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. [新しいプロジェクトの追加] ダイアログ ボックスで、[インストール済み] > [他の言語] > [Visual C#] > [Windows ユニバーサル] セクションで、[Windows ランタイム コンポーネント] テンプレートを選びます。In the Add New Project dialog, select the Windows Runtime Component template in the Installed > Other Languages > Visual C# > Windows Universal section.
  3. プロジェクトに BackgroundTasks という名前を付け、[OK] をクリックまたはタップします。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. バックグラウンドの作業は、Run メソッドで実行されます。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. [宣言] タブをタップまたはクリックします。Click or tap the Declarations tab.
  3. [使用可能な宣言] で、[BackgroundTasks] を選び、[追加] をクリックします。Under Available Declarations, select BackgroundTasks and click Add. Visual Studio で、[サポートされる宣言] の下に [BackgroundTasks] が追加されます。Visual Studio adds BackgroundTasks under Supported Declarations.
  4. [サポートされるタスクの種類] で、[タイマー] がオンになっていることを確認します。Under Supported task types, ensure that Timer is checked.
  5. [アプリの設定] で、エントリ ポイントを [BackgroundTasks.BlogFeedBackgroundTask] に設定します。Under App settings, set the entry point to BackgroundTasks.BlogFeedBackgroundTask.
  6. [アプリケーション UI] タブをクリックまたはタップします。Click or tap the Application UI tab.
  7. [ロック画面通知][バッジとタイル テキスト] に設定します。Set Lock screen notifications to Badge and Tile Text.
  8. [バッジ ロゴ] フィールドに、24x24 ピクセルのアイコンへのパスを設定します。Set a path to a 24x24 pixel icon in the Badge logo field. 重要   このアイコンは、モノクロおよび透明ピクセルのみを使用する必要があります。Important  This icon must use monochrome and transparent pixels only.
  9. [小さいロゴ] フィールドに、30x30 ピクセルのアイコンへのパスを設定します。In the Small logo field, set a path to a 30x30 pixel icon.
  10. [ワイド ロゴ] フィールドに、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 キーを押すか、[デバッグ] [ ** > デバッグの開始** ] の順にタップして、アプリをデプロイして実行します。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. [デバッグの場所] ツール バーが表示されていることを確認します。Ensure that the Debug Location toolbar is visible. これは、[ ** > ツールバーの表示** ] メニューにあります。It's on the View > Toolbars menu.
  5. [デバッグの場所] ツール バーで、[中断] ドロップダウンをクリックし、[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 キーを押すか、[ デバッグ > 続行 するには、アプリの実行を続行します。Press F5 or tap Debug > Continue to continue running the app.
  8. Shift キーを押しながら F5 キーを押すか、[デバッグの ** > 停止** デバッグを停止してデバッグを停止します。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.