2016-01-07 1 views
0

У меня есть урезанное Windows 10 Universal App (VS2015) с фоновой задачей, которая должна обновлять живую плитку, но она, похоже, не работает. Я создал базовую страницу XAML с двумя кнопками: «Включить» и «Отключить». Кнопка включения регистрирует фоновое задание, а кнопка отключения отключает ее.win10 универсальное приложение фоновая задача не работает

Код для основного приложения (App6) MainPage.cs файл:

using System; 
using System.Collections.Generic; 
using System.Threading.Tasks; 
using Windows.ApplicationModel.Background; 
using Windows.UI.Popups; 
using Windows.UI.Xaml; 
using Windows.UI.Xaml.Controls; 

namespace App6 
{ 
    public sealed partial class MainPage : Page 
    { 
     private string TN = "APP6_TASK"; 
     private string TEP = "App6BackgroundTask2.BackgroundTaskHelper"; 

     public MainPage() 
     { 
      InitializeComponent(); 
     } 

     private void Enable(object sender, RoutedEventArgs e) 
     { 
      try { RegisterTask(); } 
      catch(Exception ex) { ShowDialog(ex.ToString()); } 
     } 

     private void Disable(object sender, RoutedEventArgs e) 
     { 
      try { UnregisterTask(); } 
      catch (Exception ex) { ShowDialog(ex.ToString()); } 
     } 

     private async void ShowDialog(string message) 
     { 
      var dlg = new MessageDialog(message); 
      await dlg.ShowAsync(); 
     } 

     public void RegisterTask() 
     { 
      //no need to register a task that already exists 
      if (GetTask()) { return; } 

      var backgroundTaskBuilder = new BackgroundTaskBuilder() { Name = TN, TaskEntryPoint = TEP }; 
      backgroundTaskBuilder.SetTrigger(new TimeTrigger(15, false)); 
      backgroundTaskBuilder.Register(); 
     } 

     public void UnregisterTask() 
     { 
      var task = new KeyValuePair<Guid, IBackgroundTaskRegistration>(); 

      //no need to unregister a task that doesn't exist 
      if (GetTask(ref task)) 
      { 
       task.Value.Unregister(true); 
      } 
     } 

     public bool GetTask() 
     { 
      foreach (var t in BackgroundTaskRegistration.AllTasks) 
      { 
       if (t.Value.Name == TN) 
       { 
        return true; 
       } 
      } 
      return false; 
     } 

     public bool GetTask(ref KeyValuePair<Guid, IBackgroundTaskRegistration> task) 
     { 
      foreach (var t in BackgroundTaskRegistration.AllTasks) 
      { 
       if (t.Value.Name == TN) 
       { 
        task = t; 
        return true; 
       } 
      } 
      return false; 
     } 
    } 
} 

Я открыл Package.AppManifest файл, добавил «Фоновые операции» заявление на вкладке «Объявления» и выбран " Timer ". Для введенной точки I введено

App6BackgroundTask2.BackgroundTaskHelper 

Я добавил второй проект к решению и сделал ссылку на него из основного приложения. Код для единственного класса в этом проекте (BackgroundTaskHelper.cs) является:

using System; 
using System.Diagnostics; 
using Windows.ApplicationModel.Background; 
using Windows.Data.Xml.Dom; 
using Windows.UI.Notifications; 

namespace App6BackgroundTask2 
{ 
    public sealed class BackgroundTaskHelper : IBackgroundTask 
    { 
     public void Run(IBackgroundTaskInstance taskInstance) 
     { 
      var backgroundTaskDeferral = taskInstance.GetDeferral(); 
      try { UpdateTile(); } 
      catch (Exception ex){ Debug.WriteLine(ex); } 
      finally { backgroundTaskDeferral.Complete(); } 
     } 

     private void UpdateTile() 
     { 
      var now = DateTime.Now.ToString("HH:mm:ss"); 
      var xml = 
       "<tile>" + 
       " <visual>" + 
       " <binding template='TileSmall'>" + 
       "  <text>" + now + "</text>" + 
       " </binding>" + 
       " <binding template='TileMedium'>" + 
       "  <text>" + now + "</text>" + 
       " </binding>" + 
       " <binding template='TileWide'>" + 
       "  <text>" + now + "</text>" + 
       " </binding>" + 
       " <binding template='TileLarge'>" + 
       "  <text>" + now + "</text>" + 
       " </binding>" + 
       " </visual>" + 
       "</tile>"; 

      var tileDom = new XmlDocument(); 
      tileDom.LoadXml(xml); 
      var tile = new TileNotification(tileDom); 
      TileUpdateManager.CreateTileUpdaterForApplication().Update(tile); 
     } 
    } 
} 

Я запустить основное приложение в режиме отладки, щелкнули «Включить», чтобы зарегистрировать фоновую задачу, подвешенный задачу из Debug .Закрыть панель инструментов и проверить, запущен ли метод выполнения и не генерирует исключение. Плитка обновляется, как и ожидалось, когда я проверяю меню «Пуск». Когда я закрываю приложение и жду, плитка никогда не обновляется снова.

Я удалил приложение, перекомпилировал его как выпуск и запустил его из меню «Пуск» (не работает в среде IDE). Я нажал кнопку «Включить», чтобы зарегистрировать фоновое задание, закрыл приложение и ждал. Плитка никогда не обновлялась.

Кажется, что у меня что-то не хватает, но я не могу понять, что. Любая помощь приветствуется. Thanx

ответ

0

Я нашел ответ.

Я выбрал тип задачи «Системное событие» на вкладке «Объявления» package.appxmanifest (в дополнение к типу задачи «Таймер»).

Я также выбрал «Значок и текст плитки» для окна «Блокировка экрана» на вкладке «Приложения».

Я выбрал «Активы \ LockScreenLogo.png» для логотипа значка на вкладке «Визуальные активы».

Наконец, я изменил мою Регистрация Задачу рутинную

public async Task RegisterTask() 
{ 
    var backgroundAccessStatus = await BackgroundExecutionManager.RequestAccessAsync(); 
    if (backgroundAccessStatus == BackgroundAccessStatus.Denied) { return; } 

    if (GetTask()) { return; } 

    var timeTrigger = new TimeTrigger(15, false); 

    var backgroundTaskBuilder = new BackgroundTaskBuilder(); 
    backgroundTaskBuilder.Name = TASK_NAME; 
    backgroundTaskBuilder.TaskEntryPoint = typeof(BackgroundTileTimerTask.BackgroundTask).FullName; 
    backgroundTaskBuilder.SetTrigger(timeTrigger); 

    backgroundTaskBuilder.Register(); 
} 

Это, кажется, сделали свое дело.

Я добавил код и как PDF на GitHub: GitHub repository

+0

Я думаю, 'System event' сделал это для меня. Но я где-то читал в своих исследованиях, что рекомендуется отменить регистрацию и зарегистрировать новую задачу при каждом запуске приложения. Это может быть проблемой после обновлений версии. – Matt