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

Nathan Friedly picture Nathan Friedly · Apr 11, 2013 · Viewed 20.2k times · Source

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 in the background or the display is off.

On Android, I found that I could use the window.onfocus and onblur events to detect when the app was switching to the background (and js execution would soon be paused, at least for new scripts), but I can't find a way to detect when the screen is turned on or off. Is this possible?

(On Safari, I had similar results except that onfocus and onblur didn't fire reliably.)

Answer

Nathan Friedly picture Nathan Friedly · Apr 12, 2013

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.