QT for Android 开发的App后台切换后卡死,没有响应

QT for Android 开发的应用,在使用输入法输入后,应用程序切换后台,再次切换回来后卡死,提示没有响应是否等待。QT版本5.12,Android系统抓取的ANR日志如下,求解决方案。

"main" prio=5 tid=1 Native
  | group="main" sCount=1 dsCount=0 flags=1 obj=0x72498338 self=0xb400007f3042dc00
  | sysTid=26093 nice=-10 cgrp=default sched=0/0 handle=0x7f31b7e4f8
  | state=S schedstat=( 1318444513 61412081 489 ) utm=99 stm=32 core=1 HZ=100
  | stack=0x7fe6e7f000-0x7fe6e81000 stackSize=8192KB
  | held mutexes=
  native: #00 pc 0000000000086b4c  /apex/com.android.runtime/lib64/bionic/libc.so (syscall+28)
  native: #01 pc 00000000000b90cc  /data/app/~~nk-CyG2Gd70sx6nnPgXRCA==/org.qtproject.example.AndroidTest-DYgotXpRFd2InYwFBWyYFg==/lib/arm64/libQt5Core.so (QSemaphore::acquire(int)+296)
  at org.qtproject.qt5.android.QtNativeInputConnection.finishComposingText(Native method)
  at org.qtproject.qt5.android.QtInputConnection.finishComposingText(QtInputConnection.java:171)
  at android.view.inputmethod.BaseInputConnection.closeConnection(BaseInputConnection.java:161)
  at com.android.internal.view.IInputConnectionWrapper.executeMessage(IInputConnectionWrapper.java:540)
  at com.android.internal.view.IInputConnectionWrapper.dispatchMessage(IInputConnectionWrapper.java:232)
  at com.android.internal.view.IInputConnectionWrapper.closeConnection(IInputConnectionWrapper.java:215)
  at android.view.inputmethod.InputMethodManager$ControlledInputConnectionWrapper.deactivate(InputMethodManager.java:1016)
  at android.view.inputmethod.InputMethodManager.clearConnectionLocked(InputMethodManager.java:1511)
  at android.view.inputmethod.InputMethodManager.clearBindingLocked(InputMethodManager.java:1483)
  at android.view.inputmethod.InputMethodManager$H.handleMessage(InputMethodManager.java:854)
  - locked <0x0d26dd5c> (a android.view.inputmethod.InputMethodManager$H)
  at android.os.Handler.dispatchMessage(Handler.java:106)
  at android.os.Looper.loop(Looper.java:236)
  at android.app.ActivityThread.main(ActivityThread.java:7876)
  at java.lang.reflect.Method.invoke(Native method)
  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:656)
  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:967)

QT的信号量机制大概是导致应用卡死的原因,要注意在输入法的操作中。尝试升级QT版本解决

尝试解决方案

    void changeEvent(QEvent * event)  
    {  
        if(event->type() == QEvent::WindowStateChange)  
        {  
            if(!isMinimized())  
            {  
                setAttribute(Qt::WA_Mapped);  
            }  
        }  
        QWidget::changeEvent(event);  
    }  

Qt中采用的是Qml框架,只要不用输入法输入,切换后台后都能正常切换回来,一旦调用输入法后,后台切换回来就会卡死。

望采纳!!!

打开 android 目录,找到 androidManifest.xml,找到你的 activity,配置如下属性,键盘不自动弹出来

android:windowSoftInputMode="stateAlwaysHidden"

避免从后台切回来键盘自己弹出来的问题。

在测试环境重现,查堆栈调用关系,找到输入法句柄,再看冲突原因。

这个问题可能是由于Qt应用与Android输入法之间的通信出现了问题导致的。可以考虑更新Qt版本,或者联系Qt官方技术支持,以获得更详细的解决方案。

注意输入法

可以尝试下使用生命周期进行解决,判断一下activity生命周期的,比如后台切回来的时候执行键盘关闭的操作。

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

  at org.qtproject.qt5.android.QtNativeInputConnection.finishComposingText(Native method)


从错误日志看,是切换到后台时,未释放QT输入法相关控件,导致底层存在锁,再次切回来时QT内部有异常,所以解决方案应该是,切换到后台时,网上搜一下,QT如何关闭输入法的资源