如何在 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);
            });
        }

    },