Javascript Windows应用商店应用程序-从辅助磁贴启动时执行单个任务

Javascript Windows应用商店应用程序-从辅助磁贴启动时执行单个任务,javascript,windows-8,microsoft-metro,windows-store-apps,winjs,Javascript,Windows 8,Microsoft Metro,Windows Store Apps,Winjs,我有一个Windows应用商店应用程序,可以创建辅助磁贴。单击互动程序时,我希望应用程序执行有效的离线功能(即,我不想返回应用程序,但希望应用程序执行某些操作,然后退出)。因此,在本例中,我想启动电子邮件客户端,例如。到目前为止,我的情况如下: app.addEventListener("activated", function (args) { if (args.detail.kind === activation.ActivationKind.launch) { i

我有一个Windows应用商店应用程序,可以创建辅助磁贴。单击互动程序时,我希望应用程序执行有效的离线功能(即,我不想返回应用程序,但希望应用程序执行某些操作,然后退出)。因此,在本例中,我想启动电子邮件客户端,例如。到目前为止,我的情况如下:

app.addEventListener("activated", function (args) {
    if (args.detail.kind === activation.ActivationKind.launch) {

        if (args.detail.arguments !== "") {
            // Activation arguments are present that 
            // were declared when the secondary tile was pinned to Start.
            args.setPromise(WinJS.UI.processAll().done(function () {
                var emailaddress = args.detail.arguments;
                var promise = Email.SendNewMail.sendEmail(emailaddress);
                //promise.complete();
                return;
            }));

        } else if (args.detail.previousExecutionState !== activation.ApplicationExecutionState.terminated) {
            // TODO: This application has been newly launched. Initialize
            // your application here.
        } else {
            // TODO: This application has been reactivated from suspension.
            // Restore application state here.
        }
...
此处的电子邮件功能:

    sendEmail: function sendEmail(addess, subject, body) {
        var mailto = new Windows.Foundation.Uri("mailto:?to=" + addess + "&subject=" + subject + "&body=" + body);
        return Windows.System.Launcher.launchUriAsync(mailto);
    }
我当前得到的错误是“对象已从其客户端断开连接”-我认为这是由于程序在承诺完成之前退出造成的。在WInRT中如何实现这种行为

更新:


我收到了MS对此的反馈,他们的回答是,无论这是否可行,都绝对不支持,因为以编程方式退出应用程序违反了认证要求3.6。

您可以使用的
then()
来处置应用程序:

Email.SendNewMail.sendEmail(emailaddress).then(function (success) {
    if (success) {
        window.close()
    } else {
        // Display error message
    }
});

二级互动程序似乎并不打算启动第三方应用程序:

辅助磁贴使用户能够提升特定内容和深度链接,即指向Windows应用商店应用程序[sic]中固定应用程序内部特定位置的引用,并将其固定到开始屏幕上

资料来源:

我已经尝试了很多方法来纠正你的问题,但是这里似乎有一个时间问题。在不调试时,您的上述代码(有或没有承诺完成函数调用,如
then
done
)对我来说每次都会失败,无论您是否将代码放入就绪、加载或激活事件

然而,在我的测试中,我通过以下两种不同的方式包装您的启动函数,使其能够正常工作:

  • 使用
    setTimeout
    超时,超时时间超过1秒
  • 使用
    Windows.UI.Popups.MessageDialog
  • 这两个函数都以承诺完成回调结束,并调用
    window.close()
    退出应用程序

    用于消息传递路由的示例:(似乎是最干净的可用解决方案,但显然不是在后台执行启动,也不是最用户友好的):


    注意:我认为这两种解决方案都有问题,我相信您会同意。两人都不是在后台进行发射的。我在任何地方都找不到支持在不启动应用程序的情况下执行此操作的文档。对我来说,这似乎是一个bug,如果可以的话,我会尝试为一个更干净的解决方案打开一个技术支持事件。如果没有,您可以尝试一些实际的Microsoft人员居住的地方。

    所以您希望只启动电子邮件应用程序,对吗?你的电子邮件功能是什么样子的?没错。我编辑了我的问题,将其包括在内。我看到:)。。。事实上,MSFT的人在那个论坛上很快就回答了未回答的问题。希望您很快就能得到正式答案。请参阅我的更新-显然,这是无法干净地完成的原因。window.close()更新答案。仍然会出现与对象与客户端断开连接相同的错误
    Eight.Message.confirmAsync("Send the email?", function (doSend) {
        if (!doSend) return;
    
        Email.SendNewEmail.sendEmail(emailaddress).done(function (e) {
            window.close();
        });
    });