20

我正在跟踪我的应用程序的 javascript 报告的一些可笑的高加载时间,并发现当窗口在后台或显示屏关闭时,Android(和 iOS)会暂停一些 JavaScript 执行。

在 Android 上,我发现我可以使用window.onfocusandonblur事件来检测应用程序何时切换到后台(并且 js 执行很快就会暂停,至少对于新脚本来说是这样),但是我找不到一种方法来检测何时屏幕打开或关闭。这可能吗?

(在 Safari 上,除此之外我得到了类似的结果,onfocus并且onblur没有可靠地触发。)

4

4 回答 4

14

我刚刚为我的用例找到了一个很好的解决方案:

function getTime() {
    return (new Date()).getTime();
}

var lastInterval = getTime();

function intervalHeartbeat() {
    var now = getTime();
    var diff = now - lastInterval;
    var offBy = diff - 1000; // 1000 = the 1 second delay I was expecting
    lastInterval = now;

    if(offBy > 100) { // don't trigger on small stutters less than 100ms
        console.log('interval heartbeat - off by ' + offBy + 'ms');
    }
}

setInterval(intervalHeartbeat, 1000);

当屏幕关闭时(或 JS 因任何原因暂停),下一个间隔会延迟,直到 JS 执行恢复。在我的代码中,我可以按offBy数量调整计时器并称之为好。

在快速测试中,这似乎在 Android 4.2.2 的浏览器和 iOS 6.1.3 的 Safari 上运行良好。

于 2013-04-11T22:02:16.743 回答
14

有几个选项可以检查它:

  1. 使用可见性 API

  2. 使用focusblur事件来检测浏览器选项卡的可见性:

window.addEventListener("焦点", handleBrowserState.bind(context, true));
window.addEventListener("blur", handleBrowserState.bind(context, false));

函数句柄浏览器状态(isActive){
    // 做点什么
}
  1. 使用定时器,如上所述
于 2016-09-13T12:19:45.087 回答
4

在这里找到了一个不错的功能:

http://rakaz.nl/2009/09/iphone-webapps-101-detecting-essential-information-about-your-iphone.html

(function() {
    var timestamp = new Date().getTime();

    function checkResume() {
        var current = new Date().getTime();
        if (current - timestamp > 4000) {
            var event = document.createEvent("Events");
            event.initEvent("resume", true, true);
            document.dispatchEvent(event);
        }
        timestamp = current;
    }

    window.setInterval(checkResume, 1000);
})();   

注册活动:

addEventListener("resume", function() {
    alert('Resuming this webapp');
});

这与触发resume事件的 Cordova 一致。

于 2016-02-25T15:50:30.103 回答
3

现在屏幕关闭后,您将在脚本中做什么?无论如何,您可以注入 Java 对象(http://developer.android.com/reference/android/webkit/WebView.html#addJavascriptInterface(java.lang.Object,%20java.lang.String))来与活动交互并代理您在 JS 世界中需要的所有信息。

于 2013-04-11T22:38:02.653 回答