MyTetra Share
Делитесь знаниями!
Как работает программа, перемещенная в фон в чистом Qt и в QML-приложении под Android
Время создания: 23.01.2019 16:10
Текстовые метки: qt, qml, c++, фон, фоновый режим, background, свернуто, android, андроид
Раздел: Компьютер - Программирование - Язык C++ (Си++) - Библиотека Qt - QML
Запись: xintrea/mytetra_syncro/master/base/1548249057ae1h5db4yz/text.html на raw.github.com

Программа, написанная на Qt, имеет внутри себя основной цикл, с помощью которого происходит управление частями программы: выполняюься реакции на события, отрабатывают слоты, крутятся таймеры и прочее. Ниже рассказываются особенности работы программы, когда она погружается в фон


Qt на десктопе


При "сворачивании" окна программы происходит следующее:


  • Основной цикл не останаливается
  • Таймеры QTimer продолжают работать
  • Да практически все работает
  • За исключением вызова paintEvent() всех элементов, имеющих графическое представление. Этот метод не вызываетс в фоновом режиме


QML на Android


При сворачивании программы с помощью центральной кнопки "o" в список запущенных приложений, в QML-программе на Android происходит следующее:


  • Останавливается основной цикл
  • А следовательно не работают таймеры QTimer
  • И для QML-движка (по всей видимости, не знаю как проверить) перестает вызываться paintEvent()
  • Остановлено все, и основной цикл будет запущен только при выходе из фона


Но в AndroidManifest.xml можно сделать настройку, чтобы при попадании программы в фон, основной цикл событий не останавливался. Для этого нужно изменить следующую настройку:


<meta-data android:name="android.app.background_running" android:value="true"/>


С такой настройкой программа начинает работать так же как Qt-программа на десктопе. Вот какие подробности известны об этой опции (перевод):


При установке этой опции будет экспортирована переменная окружения QT_BLOCK_EVENT_LOOPS_WHEN_SUSPENDED, которая будет проверяться с помощью собственного кода QT и остановит диспетчер событий (с тех пор не будет вызван QCoreApplication::processEvents) для части QT приложения, когда основное действие было остановлено или приостановлено на onStop() и onPause(). Таким образом, это означает "замораживание" цикла событий


Взято отсюда: http://qaru.site/questions/11539020/what-does-androidappbackgroundrunning-in-androidmanifestxml-mean


Так же в этом разделе:
 
MyTetra Share v.0.59
Яндекс индекс цитирования