QT5.15.2 on Android sometimes doesn't wake up
-
Hi,
I'm writing an application which simulates a panel for the controllers from AMX. It is running on Android (tested with a Samsung Galaxy S10 and Android 11). The application is configured to run in background also. Everything is working as expected. On the Android VM on my developer machine I can push the power button shortly and the display become black. Then in the application I get the signal
Qt::ApplicationInactive
and shortly afterQt::ApplicationSuspended
. At the moment I push the power button again, even if it is after a hour, the display wakes up and the application receives the signalQt::ApplicationActive
. Then the application (QT) wakes up and continues to run.On the real phone happens basicly the same. But if I leave the phone suspended for at least 10 minutes and then wake up the phone, the application seems to be frozen. When I push the button to get to the screen where I can see all the running apps and select my application, it wakes up really and continues to run. Then it performs the action resulting from the last button I pushed when it was frozen.
When I connect the phone to the debugger I can't reproduce this behaviour. Then it always gets the signals and wakes up as expected. Now I'm not sure whether QT receives the signal
Qt::ApplicationActive
or not. How can I debug this without a debugger? In case the signal arrives but is ignored by QT, can I force QT to wakeup? If so, how?I use QT5.15.2 to handle the graphical surface. In the
AndroidManifest.xml
file I set the option:<!-- Warning: changing this value to true may cause unexpected crashes if the application still try to draw after "applicationStateChanged(Qt::ApplicationSuspended)" signal is sent! --> <meta-data android:name="android.app.background_running" android:value="true"/>
And in the code I'm catching the signal:
connect(qApp, &QGuiApplication::applicationStateChanged, this, &MainWindow::appStateChanged);
The method
MainWindow::appStateChanged
is implemented like this:void MainWindow::appStateChanged(Qt::ApplicationState state) { DECL_TRACER("MainWindow::appStateChanged(Qt::ApplicationState state)"); switch (state) { case Qt::ApplicationSuspended: MSG_INFO("Switched to mode SUSPEND"); mHasFocus = false; break; case Qt::ApplicationInactive: MSG_INFO("Switched to mode INACTIVE"); mHasFocus = false; break; case Qt::ApplicationHidden: MSG_INFO("Switched to mode HIDDEN"); mHasFocus = false; break; case Qt::ApplicationActive: MSG_INFO("Switched to mode ACTIVE"); mHasFocus = true; playShowList(); break; } if (mHasFocus && pageManager) pageManager->initNetworkState(); else if (pageManager) pageManager->stopNetworkState(); }
The Macros
DECL_TRACER()
andMSG_INFO()
writes out a message at least with the logging function__android_log_print()
. The methodplayShowList()
plays the content of a queue. The queue contains events happened during the application was suspended. And the methodspageManager->initNetworkState()
andpageManager->stopNetworkState()
stop and start a Java Active which reports the changes of the strength of the Wifi connection. This all works as long as the signals arrive as expected.A.T.