[英]Windows Phone 8.1 Runtime - Background Task Time Trigger
I am trying to trigger a background task towards the end time of a calendar entry. 我正在尝试在日历项的结束时间触发后台任务。 For eg if the calendar entry is 3pm - 5pm I want the background task to trigger at 5 pm and also I want to have another time trigger setup based on the upcoming calendar entry.
例如,如果日历条目是下午3点-下午5点,则我希望后台任务在下午5点触发,并且我还想根据即将到来的日历条目进行另一个时间触发设置。 At the end of the calendar entry time, I would fetch the details about the next calendar entry by querying the database and have the end time set as the next time trigger.
在日历输入时间结束时,我将通过查询数据库来获取有关下一个日历输入的详细信息,并将结束时间设置为下一次触发。 I am not sure on how to set the time as it going to be different every time.
我不确定如何设置时间,因为每次都会有所不同。 So far this is what I am up to:
到目前为止,这是我要做的:
//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();
Here is the Windows Runtime Component class to update the live tile: 这是用于更新实时磁贴的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();
}
}
Please advise. 请指教。
Starting from the beginning: 从头开始:
Code: 码:
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();
}
}
}
Code: 码:
// 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);
You'll probably encounter the situation where when you try and run 'DoSomethingBackground' from Lifecycle Events the program just ends abruptly. 您可能会遇到一种情况,当您尝试从Lifecycle Events运行'DoSomethingBackground'时,程序突然结束。 If this happen, delete the bin and obj files for the main app, rebuild everything, and reattach the .winmd file.
如果发生这种情况,请删除主应用程序的bin和obj文件,重建所有内容,然后重新附加.winmd文件。 This should get it to work again.
这应该使其重新工作。 Also, it's good advice to use Debug.WriteLine() a lot in the Background Task, so when you execute it you can track in the output window what your code is up to.
另外,在后台任务中大量使用Debug.WriteLine()是一个很好的建议,因此当您执行它时,您可以在输出窗口中跟踪代码的作用。 Finally, be careful using datetime formats, and I'd recommend you use CultureInfo.InvariantCulture when storing dates, due to differing global formats.
最后,请小心使用日期时间格式,由于全局格式不同,建议您在存储日期时使用CultureInfo.InvariantCulture。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.