如何在Windows WinRT/C#设备/应用程序启动时启动后台任务

3
如何在Windows/Windows Phone通用应用程序中启动一个实现了IBackgroundTask接口的后台任务?
我正在使用Cordova创建一款适用于iOS、Android、WP8和Windows的应用程序。每个平台似乎都会在应用程序启动前运行本地类,因此可以在此处添加代码来启动任务/服务。当通过Cordova创建Windows项目时,它将被创建为JavaScript项目,因此没有可用的C#文件。
我的唯一选择是添加winJs代码来启动后台任务吗?

你好,你解决这个问题了吗?如果可以的话,你愿意分享一下知识吗?我现在也遇到了类似的情况。我已经创建了一个带有后台任务的本地应用程序,但现在想转换成Cordova应用程序,但我不确定如何注册后台任务。如果有示例会很有帮助。谢谢。 - belzebu
嗨,是的,最后我想通了。我将它创建为 Cordova 插件,然后使用 WinJS 编写了启动后台服务的代码,该代码通过 Cordova 调用的 WindowsProxy.js 文件进行调用。 - Gillardo
已经为您完整回答了问题,请参见下文。 - Gillardo
2个回答

4
最终,我通过将其创建为Cordova插件来解决了这个问题。因此,我的插件有一个名为“init”的方法,在应用程序启动时调用。使用该插件,我可以调用iOS、Android或Windows中的服务。
创建完插件后,我在Cordova插件的WindowProxy.js文件中启动了Windows服务。
请注意,您的服务本身必须位于单独的库中,并且该库的输出类型必须设置为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);
            });
        }

    },

谢谢。我认为将后台服务设置为JavaScript应该不是问题,因为我猜您的解决方案是C#,或者我错了吗?干杯 - belzebu
我的代码是用C#编写的。不确定后台服务能否使用JavaScript,因为它需要实现IBackgroundTask接口(我想它是这个名字,但我现在不在电脑旁边)。 - Gillardo
我的概念验证是基于实现为JavaScript文件的后台任务,它运行良好,这个主题有相当多的文档资料。谢谢。 - belzebu
这个是否足以启动服务?我正在测试它,但无法调用Run方法。我等了15分钟,也没有运气。我遇到了和你一样的问题。 - uerceg
没错,这个可以运行,我现在已经在使用了。请确保加载的名称正确并且项目类型也正确。 - Gillardo
@user2736022 Windows8.1及以上版本使用JavaScript而非C#和C++。 - Gillardo

0

如果您需要选择要实现的类...我建议原生编写应用程序。

如果您想保持使用JavaScript编写的逻辑核心,并使用此类来执行需要在后台运行的单个任务,则可以为Windows以本地语言编写功能,然后按照此指南将其包装在Cordova插件中。

个人建议采用这种解决方案,编写Cordova插件非常简单且非常有用。


实现IBackgroundTask接口的类是使用本地C#语言编写的。我还在另一个项目中拥有这个类,该项目被设置为Windows组件运行时项目。在Android和iOS中,这非常容易,你只需要配置服务运行,本地代码就会在启动时运行。但是,当你使用Cordova创建一个Windows项目时,它会创建JavaScript项目,因此你无法将本地C#代码附加到启动服务。 - Gillardo
你可以找到很多用C#编写的cordova插件示例,尝试查看其中一些:条形码。例如,这个插件使用本地的C#语言来处理一个在相机流中检查条形码匹配的本地C库。Javascript直接与WinRT组件交互。将其或更简单的插件用作参考并编写自己的插件! - phemt.latd
我知道如何调用cordova插件并创建代理代码以在Windows上运行。这不是问题所在。问题在于尝试运行IBackgroundTask并使其运行。似乎很荒谬地运行一个cordova插件函数来仅启动Windows服务,因为所有其他平台都永远不会运行该代码... - Gillardo
如我在答案中提到的,如果您需要使用IBackgroundTask,您可以原生地编写应用程序;如果您想编写一个Cordova应用程序,则必须使用js等效项来管理后台任务或为要使用的每个平台原生地编写插件(显然,如果只有一次...编写Cordova应用程序是愚蠢的)。 如果问题仅与如何在WinJS应用程序中实现此类有关...我认为Cordova标签是不必要的,您必须添加WinRT和C#标签,最后可以编辑您的问题,以便其他用户可以更好地理解并帮助您。 - phemt.latd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接