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

时间:2013-02-05 16:24:32

标签: javascript windows-8 microsoft-metro windows-store-apps winjs

我有一个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);
    }

我目前得到的错误是“对象已与其客户端断开连接” - 我认为这是由于程序在promise完成之前退出而引起的。如何在WInRT中实现这种行为?

更新:

我已经收到了MS对此的反馈,以及他们的回复,如果这是否可能,它肯定是不受支持的,因为以编程方式退出应用程序违反了认证要求3.6。

2 个答案:

答案 0 :(得分:2)

辅助磁贴似乎不打算启动第三方应用程序:

  

辅助磁贴使用户能够将特定内容和深层链接(从固定应用内部的特定位置的引用 - 从Windows应用商店应用[sic]升级到“开始”屏幕。

来源:http://msdn.microsoft.com/en-us/library/windows/apps/hh465372.aspx

我已经尝试了很多方法来解决你的问题,但这里似乎有一个时间问题。不调试时,无论您是将代码放入就绪,加载还是激活状态,上面的代码(带或不带Promise完成函数调用,如thendone)都会失败。事件

在我的测试中,通过以几种不同的方式包装启动功能,我能够使无误工作:

  1. 使用setTimeout超时,超时时间超过1秒
  2. 使用Windows.UI.Popups.MessageDialog
  3. 的消息对话框

    两者都以您的承诺完成回调结束,并调用window.close();退出该应用程序。

    使用Eight.js作为消息传递路由的示例:(似乎是最干净的可用解决方案,但显然不会在后台执行启动并且不是最友好的用户):

    Eight.Message.confirmAsync("Send the email?", function (doSend) {
        if (!doSend) return;
    
        Email.SendNewEmail.sendEmail(emailaddress).done(function (e) {
            window.close();
        });
    });
    

    注意:我认为任何解决方案都是hacky,我相信你会同意的。两个人都没有在后台实现发布。我无法在任何地方找到任何文档来支持在不启动您的应用程序的情况下执行此操作。对我来说,这似乎是一个错误,如果可以的话,我会尝试为更清洁的解决方案打开技术支持事件。如果不是,您可以尝试一些真正的微软人居住的Windows Store Apps forums

答案 1 :(得分:0)

您可以使用launchUriAsync()then()来处置该应用:

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