如何在 device/application 启动时启动后台任务 windows WinRT/c#
How do you start a background task on device/application startup for windows WinRT/c#
如何在 windows/windows phone 的通用应用程序中启动实现 IBackgroundTask
的后台任务?
我正在使用 cordova 为 ios、android、wp8 和 windows 创建应用程序。每个平台在应用程序启动前似乎运行一个原生的class,所以你可以在这里添加代码来启动一个task/service。当 cordova 创建一个 windows 项目时,它被创建为一个 javascript 项目,因此没有 c# 文件开始。
我唯一的选择是添加 winJs
代码来启动后台任务吗?
如果您需要选择 class 来实现...我建议原生编写应用程序。
如果您想保留 javascript 中编写的核心逻辑并将此 class 用于您需要在后台 运行 的单个任务,您可以编写功能在 windows 的本地语言中,然后按照此 guide 将其包装在 cordova 插件中。
我个人建议这个解决方案,编写cordova插件非常简单而且非常有用。
最后,我通过将其创建为 cordova 插件来解决这个问题。所以我的插件有一个名为 init 的方法,我会在应用程序启动时调用它。使用该插件,我可以在 iOS、Android 或 Windows.
中调用服务
创建插件后,我从 WindowProxy.js 文件中启动我的 windows 服务,该文件是 cordova 插件的一部分。
请注意,您的服务本身必须位于单独的库中,并且该库的输出类型必须设置为 Windows 运行时组件。
启动服务的示例代码如下
WindowsProxy.js 文件中的代码
init: function (successCallback, errorCallback) {
var taskRegistered = false;
var taskName = "Your Background Task Name";
var background = Windows.ApplicationModel.Background;
var iter = background.BackgroundTaskRegistration.allTasks.first();
// check if service already started
while (iter.hasCurrent) {
var task = iter.current.value;
if (task.name === taskName) {
taskRegistered = true;
break;
}
iter.moveNext();
}
if (taskRegistered) {
successCallback();
} else {
Windows.ApplicationModel.Background.BackgroundExecutionManager.requestAccessAsync().then(function () {
var builder = new Windows.ApplicationModel.Background.BackgroundTaskBuilder();
builder.name = taskName;
builder.taskEntryPoint = "CordovaApp.Library.UploadTask"; // namespace of my windows runtime component library
builder.setTrigger(new Windows.ApplicationModel.Background.TimeTrigger(15, false));
builder.addCondition(new Windows.ApplicationModel.Background.SystemCondition(Windows.ApplicationModel.Background.SystemConditionType.internetAvailable));
return builder.register();
}).done(function () {
successCallback();
}, function (err) {
errorCallback(err);
});
}
},
如何在 windows/windows phone 的通用应用程序中启动实现 IBackgroundTask
的后台任务?
我正在使用 cordova 为 ios、android、wp8 和 windows 创建应用程序。每个平台在应用程序启动前似乎运行一个原生的class,所以你可以在这里添加代码来启动一个task/service。当 cordova 创建一个 windows 项目时,它被创建为一个 javascript 项目,因此没有 c# 文件开始。
我唯一的选择是添加 winJs
代码来启动后台任务吗?
如果您需要选择 class 来实现...我建议原生编写应用程序。
如果您想保留 javascript 中编写的核心逻辑并将此 class 用于您需要在后台 运行 的单个任务,您可以编写功能在 windows 的本地语言中,然后按照此 guide 将其包装在 cordova 插件中。
我个人建议这个解决方案,编写cordova插件非常简单而且非常有用。
最后,我通过将其创建为 cordova 插件来解决这个问题。所以我的插件有一个名为 init 的方法,我会在应用程序启动时调用它。使用该插件,我可以在 iOS、Android 或 Windows.
中调用服务创建插件后,我从 WindowProxy.js 文件中启动我的 windows 服务,该文件是 cordova 插件的一部分。
请注意,您的服务本身必须位于单独的库中,并且该库的输出类型必须设置为 Windows 运行时组件。
启动服务的示例代码如下
WindowsProxy.js 文件中的代码
init: function (successCallback, errorCallback) {
var taskRegistered = false;
var taskName = "Your Background Task Name";
var background = Windows.ApplicationModel.Background;
var iter = background.BackgroundTaskRegistration.allTasks.first();
// check if service already started
while (iter.hasCurrent) {
var task = iter.current.value;
if (task.name === taskName) {
taskRegistered = true;
break;
}
iter.moveNext();
}
if (taskRegistered) {
successCallback();
} else {
Windows.ApplicationModel.Background.BackgroundExecutionManager.requestAccessAsync().then(function () {
var builder = new Windows.ApplicationModel.Background.BackgroundTaskBuilder();
builder.name = taskName;
builder.taskEntryPoint = "CordovaApp.Library.UploadTask"; // namespace of my windows runtime component library
builder.setTrigger(new Windows.ApplicationModel.Background.TimeTrigger(15, false));
builder.addCondition(new Windows.ApplicationModel.Background.SystemCondition(Windows.ApplicationModel.Background.SystemConditionType.internetAvailable));
return builder.register();
}).done(function () {
successCallback();
}, function (err) {
errorCallback(err);
});
}
},