我使用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;
行上运行。
我想要做的是在暂停事件中存储用户名和当前网址,并希望在恢复活动时恢复它(当用户从已经运行的应用列表中打开应用时。)
答案 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?