Windows 10通用应用程序无法从上一个会话恢复

时间:2016-09-07 10:09:31

标签: javascript uwp winjs windows-10-universal windows-10-mobile

我使用Html,css和JS开发了一个Windows 10通用应用程序。为了允许内联脚本,我正在使用ms-appx-web上下文,并将ms-appx-web:///login.html设置为清单中的起始页。 每当我在Windows 10移动设备中打开我的应用程序它工作正常,但如果我切换到另一个应用程序,然后通过从Windows应用程序列表中选择它再次转到应用程序。然后它不是从已保存的状态恢复应用程序而是重新启动它。

(function () {
    "use strict";

    var app = WinJS.Application;
    var activation = Windows.ApplicationModel.Activation;

    app.onactivated = function (args) {
      if (args.detail.kind === activation.ActivationKind.launch) {
            if (args.detail.previousExecutionState === activation.ApplicationExecutionState.terminated) {
            }
            if (WinJS.Application.sessionState.url) {
                localStorage.setItem("UserName", WinJS.Application.sessionState.name);
                window.location = WinJS.Application.sessionState.url;
            }
            args.setPromise(WinJS.UI.processAll().then(function () {
            }));
      }

    };

    app.oncheckpoint = function (args) {
        var location = window.location.href;
        var name = localStorage.getItem("UserName");
        WinJS.Application.sessionState.name = name;
        WinJS.Application.sessionState.url = location;
    };

    Windows.UI.WebUI.WebUIApplication.addEventListener("resuming", function (args) {
        if (WinJS.Application.sessionState) {
            window.location = WinJS.Application.sessionState.url;
            localStorage.setItem("UserName", WinJS.Application.sessionState.name);
        }
    }, false);
    Windows.UI.WebUI.WebUIApplication.addEventListener("suspending", function (args) {
        var location = window.location.href;
        var name = localStorage.getItem("UserName");
        WinJS.Application.sessionState.name = name;
        WinJS.Application.sessionState.url = location;
    }, false);

    app.start();

})();

有谁能告诉我我做错了什么?

我在main.js中更改了app.onactivated事件

    app.onactivated = function (args) {
    if (args.detail.kind === activation.ActivationKind.launch) {
        if (args.detail.previousExecutionState !== activation.ApplicationExecutionState.terminated) {

        } else {

        }
        args.setPromise(WinJS.UI.processAll());

        var name = Windows.Storage.ApplicationData.current.roamingSettings.values["name"];
        var url = Windows.Storage.ApplicationData.current.roamingSettings.values["url"];

        if (name) {
            localStorage.setItem("UserName", name);
        }
        if (url) {
            window.location.href = url;
        }
    }
};

但它停止在window.location.href = url;行上运行。

我想要做的是在暂停事件中存储用户名和当前网址,并希望在恢复活动时恢复它(当用户从​​已经运行的应用列表中打开应用时。)

2 个答案:

答案 0 :(得分:0)

  

但如果我切换到另一个应用程序,然后通过从Windows应用程序列表中选择它再次转到应用程序。然后它不是从已保存的状态恢复应用程序而是重新启动它。

我认为您没有为您的应用使用单页导航。

请参阅Single-page navigation: the recommended model

  

脚本上下文已销毁,必须再次初始化。该应用程序可能会收到系统事件但不会处理它们,因为脚本上下文正在被销毁并重新初始化。

因此,导航到其他页面后,脚本上下文已被销毁。

要解决此问题,最佳解决方案是让您的应用成为单页应用。并使用PageControl导航页面。您可以参考Quickstart: Using single-page navigation开始使用。

<强>更新

  

但是当我使用window.location.href在main.js中重定向时,它会关闭app。

这是因为您在WinJS脚本中使用它。当您离开页面时,WinJS脚本上下文将被销毁,从而执行内部代码崩溃应用程序。要解决此问题,您可以使用Windows生命周期API:

var roaming=Windows.Storage.ApplicationData.current.roamingSettings;

Windows.UI.WebUI.WebUIApplication.addEventListener("activated", function (args) {
    if (args.detail[0].kind === activation.ActivationKind.launch) {
        if (roaming.values["currentUri"]) {
            window.location.href = roaming.values["currentUri"];
        }
    }
});

Windows.UI.WebUI.WebUIApplication.addEventListener("suspending", function (args) {
    roaming.values["currentUri"] = window.location.href;
    roaming.values["UserName"] = evt.srcElement.value;
    //save the other information of the page here
});

Windows.UI.WebUI.WebUIApplication.addEventListener("resuming", function (args) {
    var roam = Windows.Storage.ApplicationData.current.roamingSettings;
    if (roam) {
        if (roam["currentUri"])
        {
            window.location.href = roam["currentUri"];
        }
    }
}, false);

您也可以参考我的demo

注意:如果您根本不使用WinJS,只需删除引用即可。在每个页面上加载WinJS库效率不高。

答案 1 :(得分:0)

我已将main.js更改为:

    (function () {
"use strict";

//No need of WinJS
var activation = Windows.ApplicationModel.Activation;
var roaming = Windows.Storage.ApplicationData.current.roamingSettings;

// For App Start Up
Windows.UI.WebUI.WebUIApplication.addEventListener("activated", function (args) {
    if (args.detail[0].kind === activation.ActivationKind.launch) {
        if (roaming.values["currentUri"]) {
            if (roaming.values["UserName"])
            {
                localStorage.setItem("UserName", roaming.values["UserName"]);
                window.location.href = roaming.values["currentUri"];
            }
        }
    }
});

// For App Suspension
Windows.UI.WebUI.WebUIApplication.addEventListener("suspending", function (args) {
    roaming.values["currentUri"] = window.location.href;
    roaming.values["UserName"] = localStorage.getItem("UserName");
});

// For Resuming App
Windows.UI.WebUI.WebUIApplication.addEventListener("resuming", function (args) {
    var roam = Windows.Storage.ApplicationData.current.roamingSettings;
    if (roam) {
        if (roam.values["currentUri"]) {
            localStorage.setItem("UserName", roam.values["UserName"]);
            window.location.href = roam.values["currentUri"];
        }
    }
}, false);
// not working backpressed event
Windows.UI.WebUI.WebUIApplication.addEventListener("backpressed", function (args) {
   // to do
}, false);})();

一切都很好。但我不知道如何在不使用winjs的情况下添加返回按键事件。 谁能建议我? How to add back key press event without winjs?