我们有一个(相当复杂的)Qt应用程序,可以移植到Android。它工作得很好 - 直到我们开始在Android Pie上尝试它。 有时,无论是在启动后,还是从后台返回后,应用程序在视觉上冻结 - 但是,日志记录显示 UI 线程是活动的,它会响应点击,小部件接收 paintEvent() 并处理它们。但是屏幕上没有任何变化。
像"返回"这样的硬件按钮也可以工作 - 应用程序能够显示"你确定退出吗?"消息框,它工作正常。
此外,您尝试转到主屏幕并返回应用程序 - 大多数时候它会解冻。
实际上,这种行为始于Android 8,但通过一个肮脏的黑客解决了 - 在收到应用程序状态更改(活动)时对主小部件进行隐藏/显示。但它在Android 9上停止工作。
我完全不知道我们可以做些什么来产生这种行为,以及如何解决这个问题......
经过漫长而乏味的调试,我们最终将其缩小到Qt本身的问题。 我报告了一个错误:https://bugreports.qt.io/browse/QTBUG-76142
但是,我不知道它是否在较新版本中得到修复,因为我们现在停止了Android应用程序的开发。
这不是一个实际的解决方案,但分享了一些想法。我使用了QT 6.3,从后台返回后或在打开应用程序时手机自动关闭后,qt android应用程序(arm64-v8a/Qt小部件)中发生了相同的挂起/冻结问题。另一个后果是,将应用程序发送到后台后,我无法正确使用谷歌浏览器(我只测试了这个应用程序,没有测试其他应用程序)。发生的事情是它非常慢,并且在Chrome中滚动无法像往常一样工作。
我用这个技巧(不是解决方案)抑制了这个问题:即,在将 QT 应用程序发送到后台之前,我触发它显示一个消息框(通过单击按钮)并让消息框打开。现在谷歌浏览器应用程序正常工作。将QT应用程序拖到前面并向消息框显示"确定"后,我就可以像往常一样使用该应用程序了。没有挂起/冻结问题。
我还从链接(https://lists.qt-project.org/pipermail/interest/2014-November/014218.html)中阅读了一篇文章:也就是说,我们可以修改QtActivity.java(可以与QT应用程序通信)并使用暂停和恢复事件。所以我的想法是,如果我触发应用程序显示此"暂停"事件的Qt消息框,并在"恢复时"事件中自动关闭相同的消息框,则可以处理此挂起/冻结。
但是我没有尝试上面(修改QtActivity.java),因为现在我切换到QT 6.4并且此版本中不存在挂起/冻结问题。