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

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

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

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

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

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

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

 Window.addEventListener («focus», handleBrowserState.bind (контекст, true));
 Window.addEventListener ("размытие", handleBrowserState.bind (контекст, ложь));

 Function handleBrowserState (isActive) {
     // сделай что-нибудь
 }
  1. Использование таймеров, как указано выше

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

 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.

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

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 .

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