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?

相關問題