Windows Phone 8.1运行时 - 后台任务时间触发器

时间:2015-06-20 21:48:57

标签: c# calendar windows-phone-8.1

我试图在日历条目的结束时间触发后台任务。例如,如果日历条目是下午3点到下午5点,我希望后台任务在下午5点触发,我还希望根据即将到来的日历条目设置另一个时间触发器。在日历输入时间结束时,我将通过查询数据库获取有关下一个日历条目的详细信息,并将结束时间设置为下一次触发时间。 我不确定如何设置时间,因为它每次都会有所不同。到目前为止,这就是我要做的:

//Background Task updated for Live Tile
        Windows.Storage.ApplicationDataContainer pageData = Windows.Storage.ApplicationData.Current.LocalSettings;
        pageData.Values["Testing"] = DateTime.Now.ToString();
        bool taskRegistered = false;
        string UpdateTile = "UpdateTile";
        // check if task is already registered
        foreach (var task in BackgroundTaskRegistration.AllTasks)
        {
            if (task.Value.Name == UpdateTile)
            {
                await (new MessageDialog("Task already registered")).ShowAsync();
                taskRegistered = true;
                break;
            }
        }            
        // register a new task
        var builder = new BackgroundTaskBuilder();
        builder.TaskEntryPoint = "TileUpdaterTask.UpdateTile";
        builder.SetTrigger(new TimeTrigger(30, false));
        // Windows Phone app must call this to use trigger types (see MSDN)
        await BackgroundExecutionManager.RequestAccessAsync();
        BackgroundTaskRegistration theTask = builder.Register();

以下是更新实时磁贴的Windows运行时组件类:

public sealed class UpdateTile : IBackgroundTask //XamlRenderingBackgroundTask
{
    Windows.Storage.ApplicationDataContainer pageData = Windows.Storage.ApplicationData.Current.LocalSettings;
    public void Run(IBackgroundTaskInstance taskInstance)
    {
        BackgroundTaskDeferral _deferral = taskInstance.GetDeferral();
        ITileSquare150x150Text01 tileContent = TileContentFactory.CreateTileSquare150x150Text01();
        tileContent.TextHeading.Text = "Hello!";
        tileContent.TextBody1.Text = pageData.Values["Testing"].ToString();//"One";
        tileContent.TextBody2.Text = "Two";
        tileContent.TextBody3.Text = "Three";
        TileUpdateManager.CreateTileUpdaterForApplication().Update(tileContent.CreateNotification());
        _deferral.Complete();
    }
}

请告知。

1 个答案:

答案 0 :(得分:3)

从头开始:

  1. 创建新的Windows Phone RT应用解决方案
  2. 向解决方案添加新的Windows RT组件项目
  3. 将以下代码放在后台任务的主类中。此代码旨在“执行某些操作”。大约每n分钟(30分钟的倍数)(与你要求的有点不同,但你应该明白这一点)。它从本地设置中读取两个值 - 时间戳,以及以分钟为单位的间隔时间。这些值在主应用程序中设置。
  4. 代码:

    using System;
    using System.Globalization;
    using Windows.ApplicationModel.Background;
    using Windows.Storage;
    
    namespace WindowsRuntimeComponent1
    {
        public sealed class MyBackgroundClass : IBackgroundTask
        {
            public void Run(IBackgroundTaskInstance taskInstance)
            {
                // Get a deferral, to prevent the task from closing prematurely if asynchronous code is still running.
                BackgroundTaskDeferral deferral = taskInstance.GetDeferral();
    
                // GET THIS INFO
                ApplicationDataContainer LocalSettings = ApplicationData.Current.LocalSettings;
                double elapsed = (DateTime.Now - Convert.ToDateTime(LocalSettings.Values["time stamp"], CultureInfo.InvariantCulture)).TotalMinutes;
                double remainingMinutes = (int) LocalSettings.Values["gap time minutes"] - elapsed;
    
                // SEE IF WE CAN DO IT NOW
                if (remainingMinutes > 15)
                {
                    // do something, otherwise, wait for the next one
                }
    
                // FINISH UP
                deferral.Complete();
            }
        }
    }
    
    1. 在主应用程序中转到Package.appxmanifest文件
    2. 在声明标签中添加'后台任务'类型'定时器'
    3. 入口点应为' WindowsRuntimeComponent1.MyBackgroundClass'
    4. 在主应用的Mainpage.xaml.cs中,将以下代码插入构造函数中。
    5. 代码:

      // UNREGISTER THE EXISTING TASK IF IT EXISTS
      var myTask = BackgroundTaskRegistration.AllTasks.Values.FirstOrDefault(iTask => iTask.Name == "DoSomethingBackground");
      if (myTask != null) myTask.Unregister(true);
      
      // REGISTER NEW TASK TO EXECUTE EVERY 30 MINUTES
      BackgroundTaskBuilder myTaskBuilder = new BackgroundTaskBuilder() { Name = "DoSomethingBackground", TaskEntryPoint = "WindowsRuntimeComponent1.MyBackgroundClass" };
      myTaskBuilder.SetTrigger(new TimeTrigger(30, false));
      myTaskBuilder.Register();
      
      // CREATE/RESET THESE VARIABLES
      ApplicationData.Current.LocalSettings.Values["gap time minutes"] = 60;
      ApplicationData.Current.LocalSettings.Values["time stamp"] = DateTime.Now.ToString(CultureInfo.InvariantCulture);
      
      1. 在调试模式下为后台任务构建项目并添加引用 ... WindowsRuntimeComponent1 \ bin \ Debug \ WindowsRuntimeComponent1.winmd到主应用程序。
      2. 在Debug中运行Main应用程序。在顶部菜单的Lifecycle Events中,选择' DoSomethingBackground'并运行它。在MyBackgroundClass.cs中放置一个断点,看它是否正确执行。
      3. 您可能会遇到这样的情况:当您尝试运行“DoSomethingBackground”时。来自Lifecycle Events的程序突然结束。如果发生这种情况,请删除主应用程序的bin和obj文件,重建所有内容,然后重新附加.winmd文件。这应该让它再次起作用。另外,在后台任务中大量使用Debug.WriteLine()也是一个很好的建议,所以当你执行它时,你可以在输出窗口中跟踪你的代码是什么。最后,请注意使用日期时间格式,并且我建议您在存储日期时使用CultureInfo.InvariantCulture,因为全局格式不同。