QAndroidApplication 结构体

struct QNativeInterface::QAndroidApplication

Android 原生界面到核心应用。更多...

头文件 #include <QCoreApplication>
CMakefind_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmakeQT += core
Qt 6.2

静态公共成员

(自 6.2) QJniObjectcontext()
(自 6.2) voidhideSplashScreen(int duration = 0)
(自 6.2) boolisActivityContext()
(自 6.2) QFuture<QVariant>runOnAndroidMainThread(const std::function<QVariant ()> &runnable, const QDeadlineTimer timeout = QDeadlineTimer::Forever)
(自 6.2) intsdkVersion()

详细描述

通过 QCoreApplication::nativeInterface() 访问。

成员函数文档

[静态, 自 6.2] QJniObject QAndroidApplication::context()

返回 Android 上下文作为 QJniObject。如果是最近启动的活动对象有效,上下文是一个 Activity。否则,上下文是一个 Service

此函数自 Qt 6.2 起引入。

[静态, 自 6.2] void QAndroidApplication::hideSplashScreen(int duration = 0)

通过给定 duration 的淡入淡出效果隐藏启动画面。如果没有提供 duration(默认为 0),则在应用启动后立即隐藏启动画面。

此函数自 Qt 6.2 起引入。

[静态, 自 6.2] bool QAndroidApplication::isActivityContext()

如果 QAndroidApplication::context() 提供了一个 Activity 上下文,则返回 true

此函数自 Qt 6.2 起引入。

[静态,自 6.2 版起] QFuture<QVariant> QAndroidApplication::runOnAndroidMainThread(const std::function<QVariant ()> &runnable, const QDeadlineTimer timeout = QDeadlineTimer::Forever)

将函数 runnable 投递到 Android 线程。该函数将被排队并在 Android UI 线程上执行。如果在 Android UI 线程上调用,runnable 将立即执行。如果 Android 应用已暂停或主 Activity 为空,runnable 将被添加到 Android 主线程队列。

此调用返回一个 QFuture<QVariant>,允许进行同步和异步调用,并可以处理任何返回类型。但是,要从 QFuture::result() 获取结果,应使用 QVariant::value()。

如果 runnable 执行时间超过 timeout 的时间段,当 timeout 到来时,阻塞调用 QFuture::waitForFinished() 和 QFuture::result() 将结束。但是,如果 runnable 已经开始执行,它不会被取消。

以下示例显示了如何执行期望有返回类型的异步调用

auto task = QNativeInterface::QAndroidApplication::runOnAndroidMainThread([=]() {
    QJniObject surfaceView;
    if (!surfaceView.isValid())
        qDebug() << "SurfaceView object is not valid yet";

    surfaceView = QJniObject("android/view/SurfaceView",
                             "(Landroid/content/Context;)V",
                             QNativeInterface::QAndroidApplication::context());

    return QVariant::fromValue(surfaceView);
}).then([](QFuture<QVariant> future) {
    auto surfaceView = future.result().value<QJniObject>();
    if (surfaceView.isValid())
        qDebug() << "Retrieved SurfaceView object is valid";
});

以下示例显示了如何执行具有 void 返回类型的同步调用

QNativeInterface::QAndroidApplication::runOnAndroidMainThread([]() {
   QJniObject activity = QNativeInterface::QAndroidApplication::context();
   // Hide system ui elements or go full screen
   activity.callObjectMethod("getWindow", "()Landroid/view/Window;")
           .callObjectMethod("getDecorView", "()Landroid/view/View;")
           .callMethod<void>("setSystemUiVisibility", "(I)V", 0xffffffff);
}).waitForFinished();

注意:关于您在 Android 主线程上进行的操作的类型要小心,任何长时间运行的操作都可能阻塞应用的 UI 渲染和输入处理。如果函数预期执行时间较长,在 runnable 中也使用一个 QDeadlineTimer 来管理执行并确保它不会阻塞 UI 线程也是一个好办法。通常,任何超过 5 秒的操作可能会阻塞应用的 UI。有关更多信息,请参阅保持您的应用响应用户操作

此函数自 Qt 6.2 起引入。

[静态,自 6.2 版起] int QAndroidApplication::sdkVersion()

返回 Android SDK 版本。这也称为 API 级别。

此函数自 Qt 6.2 起引入。

© 2024 The Qt Company Ltd. 本文档中的贡献是各自所有者的版权。本提供的文档是在自由软件基金会(Free Software Foundation)发布的 GNU 自由文档许可协议版本 1.3 的条款下许可的。Qt 及其相应标志是 The Qt Company Ltd. 在芬兰和其他国家的商标。所有其他商标均为各自所有者的财产。