如何使用 JavaScript 以固定的时间间隔(例如半天)更新我的应用程序的动态磁贴?
此外,即使应用程序本身没有运行,它也必须能够更新(例如天气应用程序)
编辑:我想在本地更新它而不必连接到互联网。请在 JavaScript 中给出一些示例,而不是 C#!
更具体地说,例如,如何将磁贴设置为每天更新一次,显示当前日期?
如何使用 JavaScript 以固定的时间间隔(例如半天)更新我的应用程序的动态磁贴?
此外,即使应用程序本身没有运行,它也必须能够更新(例如天气应用程序)
编辑:我想在本地更新它而不必连接到互联网。请在 JavaScript 中给出一些示例,而不是 C#!
更具体地说,例如,如何将磁贴设置为每天更新一次,显示当前日期?
如果磁贴上的内容将是日期,计划磁贴更新是一个不错的选择(请参阅MSDN 上ScheduledTileNotification
的JavaScript 预定通知示例)。您可以安排以日期为内容的通知每天发生一次。
如果您可以建立 Web 服务,定期更新将是一个不错的选择。使用这种方法,无论应用程序是否正在运行,磁贴都会以固定的时间间隔更新。或者,您可以使用推送,或使用后台任务更新磁贴。
MSDN 有一篇关于选择正确的通知传递机制的好文章,以及相关代码示例的链接:http: //msdn.microsoft.com/en-us/library/windows/apps/hh779721.aspx
您可以按计划使用后台任务,间隔时间超过 15 分钟。这些任务被设计为由与您的应用程序分开的操作系统运行,因此如果它不活动或未打开,则会执行。这是关于后台任务入门的详细博客文章:http ://www.silverlightshow.net/items/Windows-8-metro-make-your-app-alive-with-background-tasks.aspx
注册一个每 12 小时执行一次的后台任务并更新您的磁贴。
var RegisterBackgroundTask = function (taskEntryPoint, taskName, trigger, condition) {
UnregisterTask(taskName);
Windows.ApplicationModel.Background.BackgroundExecutionManager.requestAccessAsync();
var TaskBuilder = new Windows.ApplicationModel.Background.BackgroundTaskBuilder();
TaskBuilder.name = taskName;
TaskBuilder.taskEntryPoint = taskEntryPoint;
TaskBuilder.setTrigger(trigger);
if (condition !== null) {
TaskBuilder.addCondition(condition);
// If the condition changes while the background task is executing then it will be canceled.
TaskBuilder.cancelOnConditionLoss = true;
}
var task = TaskBuilder.register();
// Remove previous completion status from local settings.
var settings = Windows.Storage.ApplicationData.current.localSettings;
settings.values.remove(taskName);
};
var UnregisterBackgroundTask = function (sTaskName) {
var iter = Windows.ApplicationModel.Background.BackgroundTaskRegistration.allTasks.first();
var hascur = iter.hasCurrent;
while (hascur) {
var cur = iter.current.value;
if (cur.name === sTaskName) {
cur.unregister(true);
}
hascur = iter.moveNext();
}
}
像这样注册任务:
RegisterTask(
"App_JS\\LiveTileTask.js",
"Task.LiveTileTask",
new Windows.ApplicationModel.Background.TimeTrigger(15, false),
new Windows.ApplicationModel.Background.SystemCondition(Windows.ApplicationModel.Background.SystemConditionType.internetAvailable)); // 15 min are minimum
在专用文件“LiveTileTask.js”中,您编写 Live Tile Updater 的代码:
(function () {
"use strict";
importScripts("//Microsoft.Phone.WinJS.2.1/js/base.js");
var backgroundTaskInstance = Windows.UI.WebUI.WebUIBackgroundTaskInstance.current;
var Notifications = Windows.UI.Notifications;
var tileUpdateManager = Notifications.TileUpdateManager.createTileUpdaterForApplication();
tileUpdateManager.clear();
tileUpdateManager.enableNotificationQueue(true);
for (var i = 0; i < 6; i++) {
var tileWideXml = Notifications.TileUpdateManager.getTemplateContent(Notifications.TileTemplateType.tileSquare150x150Text04),
tileAttributes = tileWideXml.getElementsByTagName("text");
tileAttributes[0].appendChild(tileWideXml.createTextNode("My Live Tile Text No. " + i));
var currentTime = new Date(),
dueTime = new Date(currentTime.getTime() + 30),
tileNotification = new Notifications.ScheduledTileNotification(xmlTile, dueTime),
tileUpdater = Notifications.TileUpdateManager.createTileUpdaterForApplication();
tileUpdater.addToSchedule(tileNotification);
}
backgroundTaskInstance.succeeded = true;
close();
})();
最后不要忘记在你的 appxmanifest 中注册 backgroundtask。在“声明”下选择“后台任务”并激活“计时器”并将“起始页”设置为“App_JS\LiveTileTask.js”。这样你应该能够更新你的瓷砖。
您使用 Azure 和推送通知向所有应用程序用户发送通知:http: //msdn.microsoft.com/en-us/library/windows/apps/hh465460.aspx
我建议您创建一个Azure 移动服务。它非常简单且便宜,意味着您可以获得单独推送服务(而不是设备上的预定磁贴通知)的所有优势来发送您的推送通知,但无需完成所有工作。如果您愿意,可以注册免费试用并免费创建多达 10 个移动服务。您只需创建一个移动服务,然后创建一个每 12 小时运行一次的计划脚本,并在脚本中编写一些服务器端 JavaScript 代码来执行您的推送。这只是移动服务为您提供的其中一项功能。您还可以获得数据、身份验证等。www.windowsazure.com