Is it possible, in JavaScript, to detect when the screen is turned off in the Android & iOS browsers

后端 未结 4 796
暖寄归人
暖寄归人 2020-12-03 17:06

I was tracking down some ridiculously high load times that my app\'s javascript reported, and found that Android (and iOS) pause some JavaScript execution when the window is

相关标签:
4条回答
  • 2020-12-03 17:37

    I just found a pretty good solution for my use case:

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

    When the screen is turned off (or JS is paused for any reason), the next interval is delayed until JS execution resumes. In my code, I can just adjust the timers by the offBy amount and call it good.

    In quick testing, this seemed to work well on both Android 4.2.2's browser and Safari on iOS 6.1.3.

    0 讨论(0)
  • 2020-12-03 17:46

    There is few options to check it:

    1. Using Visibility API

    2. Using focus and blur events to detect browser tab visibility:

    window.addEventListener("focus", handleBrowserState.bind(context, true));
    window.addEventListener("blur", handleBrowserState.bind(context, false));
    
    function handleBrowserState(isActive){
        // do something
    }
    
    1. Using timers, as mentioned above
    0 讨论(0)
  • 2020-12-03 17:57

    Found a nice function here:

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

    To register for event:

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

    This is consistent with Cordova which also fires the resume event.

    0 讨论(0)
  • 2020-12-03 18:02

    what will you do in your script once you now that the screen turns off? Well anyway, you can inject Java objects ( http://developer.android.com/reference/android/webkit/WebView.html#addJavascriptInterface(java.lang.Object,%20java.lang.String) ) to interface with the activity and proxy all information you require in JS world.

    0 讨论(0)
提交回复
热议问题