Подтвердить что ты не робот

Возможно ли в JavaScript обнаруживать, когда экран отключен в браузерах Android и iOS?

Я отслеживал некоторые смехотворно большие времена загрузки, о которых сообщалось в своем приложении javascript, и обнаружил, что Android (и iOS) приостанавливают выполнение JavaScript, когда окно находится в фоновом режиме или дисплей выключен.

В Android я обнаружил, что я мог использовать события window.onfocus и onblur, чтобы определить, когда приложение переключилось на фон (и выполнение js скоро будет приостановлено, по крайней мере для новых скриптов), но я могу Не находите способ обнаружить, когда экран включен или выключен. Возможно ли это?

(В Safari у меня были аналогичные результаты, за исключением того, что onfocus и onblur не срабатывали надежно.)

4b9b3361

Ответ 1

Существует несколько вариантов проверки:

  • Использование API видимости

  • Использование событий focus и blur для обнаружения видимости вкладки браузера:

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

function handleBrowserState(isActive){
    // do something
}
  1. Использование таймеров, как указано выше

Ответ 2

Я только нашел довольно хорошее решение для моего варианта использования:

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, так и в Safari на iOS 6.1.3.

Ответ 3

Найдена хорошая функция здесь:

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.

Ответ 4

что вы сделаете в своем script после того, как вы сейчас выключите экран? В любом случае, вы можете вводить объекты Java (http://developer.android.com/reference/android/webkit/WebView.html#addJavascriptInterface(java.lang.Object,%20java.lang.String)), чтобы взаимодействовать с активностью и прокси всей информацией, требуемой в мире JS.