Compartir a través de


Actualizar un icono dinámico desde una tarea en segundo plano

Nota:

Los iconos dinámicos son una característica de Windows 10 que no se admite en versiones posteriores de Windows. En el caso de las nuevas aplicaciones, se recomienda seguir las instrucciones actuales para los iconos de la aplicación.

Usa una tarea en segundo plano para actualizar el icono dinámico de tu aplicación con contenido actualizado.

API importantes

Creación del proyecto de tarea en segundo plano

Para habilitar un icono dinámico para la aplicación, agregue un nuevo proyecto de componente de Windows Runtime a la solución. Se trata de un ensamblado independiente que el sistema operativo carga y se ejecuta en segundo plano cuando un usuario instala la aplicación.

  1. En el Explorador de soluciones, haga clic con el botón derecho en la solución; luego, en Agregar y en Nuevo proyecto.
  2. En el cuadro de diálogo Agregar nuevo proyecto , seleccione la plantilla Componente de Windows Runtime en la sección Instalado > otros lenguajes > Visual C# > Windows Universal .
  3. Asigne al proyecto el nombre BackgroundTasks y pulse o haga clic en Aceptar. Microsoft Visual Studio agrega el nuevo proyecto a la solución.
  4. En el proyecto principal, agregue una referencia al proyecto BackgroundTasks.

Implementar la tarea en segundo plano

Implemente la interfaz IBackgroundTask para crear una clase que actualice el icono dinámico de la aplicación. El trabajo en segundo plano va en el método Run. En este caso, la tarea obtiene una fuente de distribución para los blogs de MSDN. Para evitar que la tarea se cierre prematuramente mientras se está ejecutando código asincrónico, obtenga un aplazamiento.

  1. En Explorador de soluciones, cambie el nombre del archivo generado automáticamente, Class1.cs, a BlogFeedBackgroundTask.cs.
  2. En BlogFeedBackgroundTask.cs, reemplace el código generado automáticamente por el código auxiliar de la clase BlogFeedBackgroundTask .
  3. En la implementación del método Run, agregue código para los métodos GetMSDNBlogFeed y 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";
    }
}

Configuración del manifiesto del paquete

Para configurar el manifiesto del paquete, ábralo y agregue una nueva declaración de tarea en segundo plano. Establezca el punto de entrada de la tarea en el nombre de clase, incluido su espacio de nombres.

  1. En Explorador de soluciones, abra Package.appxmanifest.
  2. Pulse o haga clic en la pestaña Declaraciones .
  3. En Declaraciones disponibles, seleccione BackgroundTasks y haga clic en Agregar. Visual Studio agrega BackgroundTasks en Declaraciones admitidas.
  4. En Tipos de tareas admitidos, asegúrese de que timer está activado.
  5. En Configuración de la aplicación, establezca el punto de entrada en BackgroundTasks.BlogFeedBackgroundTask.
  6. Pulse o haga clic en la pestaña Interfaz de usuario de la aplicación.
  7. Establezca Notificaciones de pantalla de bloqueo en Distintivo y Texto de icono.
  8. Establezca una ruta de acceso a un icono de 24 x 24 píxeles en el campo Logotipo de distintivo . Importante Este icono debe usar solo píxeles monocromáticos y transparentes.
  9. En el campo Logotipo pequeño, establezca una ruta de acceso a un icono de 30 x 30 píxeles.
  10. En el campo Logotipo ancho, establezca una ruta de acceso a un icono de 310 x 150 píxeles.

Registrar la tarea en segundo plano

Cree un backgroundTaskBuilder para registrar la tarea.

Nota A partir de Windows 8.1, los parámetros de registro de tareas en segundo plano se validan en el momento del registro. Se devuelve un error si alguno de los parámetros de registro no es válido. La aplicación debe poder controlar escenarios en los que se produce un error en el registro de tareas en segundo plano; por ejemplo, use una instrucción condicional para comprobar si hay errores de registro y, a continuación, volver a intentar el registro con valores de parámetro diferentes.  

En la página principal de la aplicación, agrega el método RegisterBackgroundTask y llámalo en el controlador de eventos 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";
    }
}

Depurar la tarea en segundo plano

Para depurar la tarea en segundo plano, establezca un punto de interrupción en el método Run de la tarea. En la barra de herramientas Ubicación de depuración, seleccione la tarea en segundo plano. Esto hace que el sistema llame inmediatamente al método Run.

  1. Establezca un punto de interrupción en el método Run de la tarea.
  2. Presione F5 o pulse Depurar > Iniciar depuración para implementar y ejecutar la aplicación.
  3. Una vez iniciada la aplicación, vuelva a Visual Studio.
  4. Asegúrese de que la barra de herramientas Ubicación de depuración esté visible. Está en el menú Ver > barras de herramientas .
  5. En la barra de herramientas Ubicación de depuración, haga clic en la lista desplegable Suspender y seleccione BlogFeedBackgroundTask.
  6. Visual Studio suspende la ejecución en el punto de interrupción.
  7. Presione F5 o pulse Depurar > Continuar para continuar ejecutando la aplicación.
  8. Presione Mayús+F5 o pulse Depurar > Detener depuración para detener la depuración.
  9. Vuelva al icono de la aplicación en la pantalla Inicio. Después de unos segundos, las notificaciones de icono aparecen en el icono de la aplicación.