0

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

(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(); 

})(); 

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

我改变了我的app.onactivated事件main.js

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;线运行。

什么,我试图做的是对暂停事件存储的用户名和当前的URL,并希望它恢复事件的恢复(当用户打开从已经运行的应用程序列表中的应用程序。)

+0

如果您在应用程序中使用'ms-appx-web:///',则Windows的命名空间甚至不可用。我很好奇你怎么能没有任何错误地运行你的应用程序。你能不能分享一个可以重现你的问题的基本演示? –

+0

我已将ApplicationContentUriRules添加到清单文件中 ' – Sonali

+0

我只想从它离开的位置恢复我的应用程序。而不使用WinJS.Navigation.Navigate。 – Sonali

回答

0

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

我认为你没有为你的应用程序使用单页导航。

请参考Single-page navigation: the recommended model

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

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

要解决这个问题,最好的解决方案是让你的应用程序成为一个单独的分页应用程序。并使用PageControl导航页面。你可以参考Quickstart: Using single-page navigation开始。

更新:

但是当我使用window.location.href在main.js重定向它关闭应用程序。

这是因为您在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库效率不高。

+0

我将如何绑定我的后退按钮事件? – Sonali

+0

那么,什么将是'app.onbackclick =功能的更换(参数){ \t如果(window.location.href.includes( “的login.html”)) \t { \t app.stop(); \t} \t else { \t window.history.back(); \t返回true; \t} };' – Sonali

+0

'var hardwareButtons = Windows.Phone.UI.Input.HardwareButtons; hardwareButtons.addEventListener(“backpressed”,function(e){ //做 });'我用过这个。 – Sonali

0

我改变了我的主。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?

相关问题