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

标签 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。

最佳答案

Secondary Tiles 似乎并不打算启动第三方应用程序:

Secondary tiles enable users to promote specific content and deep links—a reference to a specific location inside of the pinning app—from Windows Store app apps [sic] onto the Start screen.

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

虽然我已经尝试了多种方法来纠正您的问题,但这里似乎存在时间问题。不调试时,无论您是否将代码放在就绪、加载或激活事件。

然而,在我的测试中,通过以几种不同的方式包装您的启动函数,我能够没有错误地让它工作:

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

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

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

Eight.Message.confirmAsync("Send the email?", function (doSend) {
    if (!doSend) return;

    Email.SendNewEmail.sendEmail(emailaddress).done(function (e) {
        window.close();
    });
});

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

关于javascript - Windows 应用商店应用程序 - 从辅助磁贴启动时执行单个任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14712120/

相关文章:

winapi - 屏幕键盘关闭按钮事件?

c# - 单击 ListView 中的按钮而不单击 ListView (WINRT/Metro)

javascript - 需要从表单中获取选定的选项值并通过 jquery/javascript 传回

javascript - 为什么我的整个网页在 Firefox 中按按键移动?

javascript - 想加元素。怎么了?

c# - Windows 7 和 8 中的系统范围设置 - 注册表不再有用?

javascript - JavaScript 在操作浏览器和 DOM 方面是否有任何明显的限制?

windows - HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.<extension>\UserChoice 中的哈希是什么?

c# - 从 StreamSocket 读取时 DataReader 结果被截断

c# - 使用 C#/XAML 在 Metro 风格应用程序中将 Canvas 保存为图像