Qt for Android 如何工作

如果您是一名开发人员,正在寻找 Qt 如何支持 Android 平台的高级概述,本页就是为您准备的。

启动 Qt 应用程序

与原生 Android 应用程序类似,Qt 主 Activity 的onCreate()在应用程序启动和创建 Activity 的早期就会被调用。这就是 AndroidQt 平台抽象(QPA)的大部分初始化过程。最重要的部分包括

  • 加载 Qt 和主应用程序库。
  • 初始化委托,委托负责初始化渲染表面和顶层布局,以及注册各种监听器(如输入、显示、触摸处理程序等)。

加载 Qt 库时,在首次加载QtCore 时会缓存 JavaVM。这是在JNI_OnLoad()函数下完成的,当使用System.load()调用加载库时,该函数会被同步调用。每个 Qt 模块都可能有一个该函数的实现,以完成一些特定模块的初始化,如注册本地 JNI 方法。

所有 Qt 模块库加载完毕后,Qt 会加载 Android QPA 插件和主应用程序库。在顶层QtLayout 布局完成内容充气后,Qt 应用程序的main() 句柄会被定位并调用。这将启动 C++ Qt 应用程序,并通常启动主事件循环。

Android QPA

Android QPA负责将 Android(Java/Kotlin)端与本地 Qt(C++)端粘合在一起。它负责处理 Qt 与 Android 之间的各种事件和信号传播。其职责包括信号处理、触摸事件、UI 元素和渲染等。该层还负责应用程序启动初始化以及应用程序退出或销毁时的清理。

线程

使用 Qt for Android 应用程序时,Qt 通常有两个相关线程。第一个是 Qt 启动的QtThread 。第二个是 Android UI 线程。

Qt 线程

该线程由 Qt 应用程序首先实现并启动,然后再加载库等。该线程名为qtMainLoopThread 。以下所有操作都在该线程下执行:

  • 加载 Qt 库。
  • JNI_OnLoad() 内执行的操作。
  • 启动本地应用程序。
  • 执行main()

Android UI 线程

与 Android 应用程序类似,影响 UI 的操作预计将在 UI 线程中运行。Qt 会在 UI 线程中运行任何内部调用。此外,Qt 还提供了一个 APIrunOnAndroidMainThread() 以在该线程下运行 C++ 代码中的操作。如果应用程序处于活动状态,Qt 会使用该 API 管理调用何时直接发布到线程;如果应用程序暂停或处于后台,Qt 会管理调用何时排队。

架构

Android 版 Qt 架构概述

Qt 类

接下来的章节将介绍各种 Qt for Android 类及其在 Qt 应用程序中的功能和作用。

公共 Java 绑定

这些类是公有类,它们封装了面向用户类(如ActivityServiceApplication)的内部实现细节。这些类默认用于 Qt Android 应用程序,并在 Android 清单文件中提及。构建系统和部署工具会在构建过程中包含这些类。

用户可以使用这些类来更改或扩展默认行为。例如,要在onCreate() 下添加自定义的用户定义逻辑,请使用下面的方法:

public class MyActivity extends QtActivity
{
    @Override
    protected void onCreate(Bundle bundle)
    {
        // code before Qt is initialized
        super.onCreate(bundle);
        // code after Qt is initialized
    }
}

注意: 必须编辑AndroidManifest.xml文件才能使用自定义的Activity或 binding 类,否则仍将使用默认类。

设置主题

扩展QtActivity 时,可以使用setTheme() 设置特定的 Android 主题。不过,该调用必须在调用父类的onCreate()之前才能生效,因为 Qt 默认设置主题。例如,您可以使用

@Override
protected void onCreate(Bundle bundle)
{
    setTheme(android.R.style.Theme_DeviceDefault_DayNight);
    super.onCreate(bundle);
}

默认情况下,对于 Android 10 及更高版本,Qt 会设置主题为Theme_DeviceDefault_DayNight Style,而对于早期版本,则会设置主题为Theme_Holoo_Light Style

附加应用程序参数

要附加额外的应用程序参数,即从 Java/Kotlin 传递到应用程序的(main()) 函数的参数,可以在扩展QtActivity 后执行以下操作:

@Override
protected void onCreate(Bundle bundle)
{
    appendApplicationParameters("--flag value");
    super.onCreate(bundle);
}

这类似于直接使用 CMake 变量QT_ANDROID_APPLICATION_ARGUMENTS。使用这两种方法传递的参数都接受空格或制表符作为分隔符,传递给应用程序的最终参数列表将使用QProcess::splitCommand 进行解析。

使用 QtLoader 加载 Qt 库

每个 Qt for Android 应用程序都需要确保在调用这些模块的任何功能之前,首先加载每个本地 Qt 或第三方库。构建系统会在应用程序的libs.xml资源文件下保存一份各种 Qt 库依赖关系、QPA 插件、主应用程序库和任何第三方库的列表。一旦完成下面各节提到的所有前提步骤,就可以使用System.load() 加载这些库。

类加载器

在加载 Qt XML 库或初始化委托之前,QtLoader ,尽早设置类加载器对象。这是因为QJniObject 会使用类加载器查找 Java 类,在QJniObject 进行任何 JNI 调用时都需要使用类加载器。

设置环境变量和应用程序参数

在加载类库之前,Qt 必须确保环境变量作为元数据传入 Android 清单以进行设置。这一步可以根据作为清单元数据设置的配置标志初始化某些模块。其中一些元数据也会传播到启动应用程序时传递给应用程序的参数列表中。

setActivity()、setContext() 和 setService()

各种 Qt 模块可能需要从 Java 端完成一些初始化工作,这些工作需要获得ActiveivityService 的上下文。这些模块会实现一个静态方法,将Activity、Service 或 Context 作为参数:

void setActivity(Activity activity)
{
    m_activity = activity;
    // Other logic
}

然后,就在加载本地共享库之前,QtLoader 与加载器的父上下文一起调用这些方法。

Qt for Android 如何处理 Android 活动生命周期

Active Qt for Android 并不提供直接处理 Android 活动生命周期回调(如 onCreate()、onStart()、onResume()、onPause()、onStop() 和 onDestroy())的 API。相反,它会在引擎盖下为用户处理这些操作。下文将概述这些行为。

注: 这些生命周期事件被转换为QGuiApplication::applicationStateChanged 信号。

上下文处理

QAndroidApplication Android 应用程序可以提供 Android上下文(AndroidContext),作为与 Android 系统交互所必需的 。该上下文可以是活动或服务。如果有活动,它将是最近启动的活动,无论是否有服务。如果只有服务,它将是最近启动的服务。QJniObject

注意: Qt for Android 不支持多个活动。

回调

QtActivityBase 类的设计目的是在 Qt for Android 软件包中将 Activity 的各种功能的实现细节保持私有。该类是 Android 生命周期与 Qt 框架之间的中介,它将 Android 生命周期回调转换为 Qt 应用程序可以响应的信号和操作。

onCreate()

创建 Activity 时,QtActivityBase 会初始化 Qt 环境。这包括加载 Qt 库、设置QJniObject 使用的类加载器、解析应用程序的元数据以及准备执行 Qt 应用程序。它可确保处理所有必要的初始化,这些初始化与 Activity 有关。

onStart()

调用 Android 的 Activity.OnStart()。

onResume()

当 Activity 移至前台时,QtActivityBase 会恢复 Qt 应用程序。它会确保暂停的进程或操作继续进行,应用程序再次准备好与用户交互。它将重新注册由 onPause() 停止的显示管理器监听器。

onPause()

如果另一个活动部分遮挡了该活动,QtActivityBase 会暂停 Qt 应用程序。当应用程序不在前台时,它将保存应用程序状态或释放不需要的资源。

onStop()

当 Activity 不再可见时,QtActivityBase 会停止 Qt 应用程序,这涉及更广泛的状态保存和资源释放,为应用程序可能的销毁做好准备。

注意: 此时 QtThread 将暂停。

onDestroy()

如果 Activity 已完成或正在被系统销毁,QtActivityBase 会清理与 Qt 应用程序相关的所有资源。它可确保正确关闭并执行所有必要的清理操作。

QtActivityBase 可以在引擎盖下管理这些复杂的问题,因此这种集成使开发人员可以专注于构建 Qt 应用程序,而不必担心 Android 生命周期的复杂性。

闪屏管理

QAndroidApplication QtActivityBase 可通过淡入淡出的效果隐藏闪屏,该效果可与应用程序的启动序列(通常在 onCreate() 之后)同步。

关于 Qt for Android 的更多信息

2021 年 Qt 世界峰会的视频概述了 Qt for Android。

"链接到 YouTube 视频的议程图片

© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.